logo

Objectif
A première vue
Le schéma
L'alimentation
Le microcontrôleur
Le synthétiseur
Les ROMs
Code et memory map
Cartouche AVR
Cartouche CPLD
Convertir les sons
Créer le ROM
Circuits imprimés
Les ROMs (VSM)

CartridgeLe second circuit spécialement développé pour la dictée magique est un type de ROM, le TMS6100, appelle VSM ou Voice Synthesis Memory. Ce nom est un peu trompeur car bien que ce circuit ait été conçu pour aller de paire avec le synthétiseur TMS5100, il ne contient pas que des données vocales.

Selon l'article du IEEES, ce furent les plus gros ROMs de l'époque, avec une capacité de 131072 bits, soit 16ko organises en mots de 8 bits.

Ces ROMs se démarquent des mémoires parallèles et série qu'on trouve partout aujourd'hui par leur interface et leur brochage très particulier. En effet, dans le datasheet on voit que l'interface n'est comme aucune autre et que la moitié des broches ne servent en fait à... rien (voir la photo, une cartouche).

Premièrement, on ne trouve pas deux bus pour l'adresse et les données mais seulement un bus 4 bits, exposé sur 4 broches non pas numérotées de 0 à 3 mais de 1,2,4,8, ce qui correspond à la puissance de 2 correspondante. A l'époque il semblerait que cette notation était préférée. Le datasheet explique que c'est un bus multiplexé et que deux autres broches appelées M0 et M1 servent à indiquer au ROM ce qu'on souhaite faire.

Deuxièmement, il y a aussi une broche ROMCLK qui pourrait faire croire que le circuit est complètement synchrone. En réalité il ne l'est pas, c'est une vraie pagaille !

Voici ce à quoi les états de M0 et M1 correspondent :

M1 M0 Commande
0 0 NOP, no operation
0 1 Lire bit
1 0 Fixer l'adresse
1 1 "Read and branch" (jamais utilisé dans la dictée magique)

Prenons les choses étape par étape. Pour lire des données, on souhaite d'abord fixer une adresse. Pour pouvoir adresser les 16ko entiers, il faudrait 14 bits, hors, on n'a qu'un bus 4 bits. On devrait donc faire un minimum de 4 écritures pour atteindre 16 bits. Cependant, la documentation expliqueque ce ne sont pas 4, mais 5 écritures que l'on va devoir faire. C'est ici que la réponse à la question des signaux Chip select absents se trouve.

Ces ROMs possèdent en fait un compteur d'adresse interne sur non pas 14, mais 18 bits. Ces 4 MSB servent de Chip select.
Lors de sa programmation, le ROM se voit attribué 4 bits qui serviront de masque de comparaison avec les 4 MSB du compteur d'adresse, et le ROM ne répondra seulement que si les deux sont identiques.

Par exemple, si le masque de Chip select d'un ROM est 0101 (5), il ne répondra que si son adresse est entre 01 0100 0000 0000 0000 (0x14000) et 01 0111 1111 1111 1111 (0x17FFF). Tout l'intérêt de ce système est dans le câblage de ROMs en parallèle.

Dans la dictée on trouve 2 ROMs en parallèle, le premier a son masque CS à 0000 et le second à 0001. Si par exemple on fixe l'adresse à 0x025A7, les 4 MSB seront à 0000, et A13~A0 à 0x25A7. Comme ils sont en parallèle, tous les compteurs d'adresse des ROMs sur le bus sont fixés à cette adresse. Les 4 MSB correspondent au masque du premier ROM, c'est donc lui qui va répondre. Si on passe maintenant à l'adresse 0x06B13, les 4 MSB seront à 0001 et A13~A0 à 0x2B13, c'est donc le deuxième ROM qui va répondre

C'est un concept assez spécial quand on est habitué à avoir un simple signal /CS pour choisir quel ROM doit "parler", mais cela permettait de pouvoir câbler de nombreux ROMs en parallèle (jusque 1111 = 16 donc) de manière totalement transparente pour le processeur et sans avoir de circuit arbitrant.

tms1000Pour fixer l'adresse, on va donc devoir faire 5 écritures, pour fixer les 18 bits + 2 ignorés. On voit clairement que la commande et les données sont valides sur le front descendant "A" de ROMCLK. Pas d'ambiguïté. Cependant, ce que j'ai découvert à l'oscilloscope et qui n'est pas montré dans ce chronogramme, c'est que la commande est exécutée seulement après avoir reçu un NOP. C'est à dire qu'entre chaque écriture, il faut au minimum un NOP, et plusieurs fronts descendants de l'horloge sur le même état de M1 ne feront rien.

C'est important car le programme de la dictée magique garde M1 haut pendant plusieurs périodes de l'horloge !

A chaque écriture, on avance 4 bits dans le compteur d'adresse grâce à un pointeur interne au ROM. Ce pointeur est remis à zéro après une lecture.

Écriture # Bits d'adresse
1 A3~A0
2 A7~A4
3 A11~A8
4 CS1,CS0,A13,A12
5 ignore,ignore,CS3,CS2

Une fois que l'adresse est fixée, on veut commencer à lire les données. Pour cela, la documentation explique qu'on peut avoir deux choix : soit les lire par mots de 4 bits (sur le bus entier), soit bit par bit (sur la ligne ADD8). C'est une option programmée et il se trouve que c'est le mode bit-par-bit qui a été retenu pour tous les ROMs de la dictée magique.

C'est maintenant que les choses se compliquent et m'ont fait m'arracher les cheveux.

tms1000On pourrait s'attendre a ce que ADD8 devienne une sortie des qu'une commande lecture (M0 haut) est validée sur un front descendant de l'horloge, comme pour fixer l'adresse.

C'est bien le cas, mais il y a deux particularités: la première c'est qu'il faut un "dummy read" juste après qu'on ait fixe l'adresse. C'est a dire une commande lecture seule pour que les rouages internes du ROM chargent le premier bit. C'est tout.

Une fois ce "dummy read" effectué, on peut effectivement commencer a lire les données. La deuxième particularité est ici: la commande est bien validée sur le front descendant de l'horloge, mais la réponse sur ADD8 se font sur le front descendant de... M0 ! Je n'avais pas fait attention a ce détail, avec le temps "ta", alors que je me basais sur le chronogramme trouve sur la doc du synthétiseur, que voici:

tms1000On pourrait s'attendre à ce que ADD8 devienne une sortie dès qu'une commande lecture (M0 haut) est validée sur un front descendant de l'horloge, comme pour fixer l'adresse.

C'est bien le cas, mais il y a deux particularités : la première c'est qu'il faut un "dummy read" juste après qu'on ait fixe l'adresse. C'est à dire une commande lecture seule pour que les rouages internes du ROM chargent le premier bit. C'est tout.

Une fois ce "dummy read" effectué, on peut effectivement commencer à lire les données. La deuxième particularité est ici : la commande est bien validée sur le front descendant de l'horloge, mais la réponse sur ADD8 se fait sur le front descendant de... M0 ! Je n'avais pas fait attention à ce détail, avec le temps "ta", alors que je me basais sur le chronogramme trouve sur la doc du synthétiseur, que voici :

Le réglage de l'adresse est très clair, on voit les 5 commandes avec les 20 bits. Le dummy read est aussi très clair, mais la lecture du premier bit l'est beaucoup moins.

En effet, on ne voit pas vraiment si ADD8 prend la valeur D0 sur le front descendant de ROMCLK, ou de M0...

C'est une erreur que j'ai mis beaucoup de temps à remarquer et qui a sévèrement infligé les résultats de mon essai de cartouche base d'AVR.

footer
symbol symbol symbol symbol symbol