logo

 

Introduction
Master clock
Générateur de fréquence
Régler le volume
PWM
Générateur de bruit
Dent de scie et triangle
Sinus
Interface CPU
Silicium: Volume
Silicum: DAC

Silicium: Le DAC

Un des trois DACs du AY-3-8914 (YM2149 ?). Photos par John McMaster.

Silicium annoté du DAC

Le bus d'amplitude 4bits du canal arrive en haut, symbolisé par des flèches bleues avec l'ordre des bits inversé (MSB à droite). C'est une décision purement pratique du dessinateur.

L'inverse de la sortie finale de l'oscillateur (nOSC) arrive par la gauche, symbolisé par la flèche magenta.

La patte du chip d'où le signal audio sort correspond au pad ANA_OUT.

 

Les premiers éléments logiques en haut sont 4 groupes identiques de portes, un pour chaque bit de l'amplitude.
L'opération exacte réalisée est:

BIT_OUT = ~(nOSC | ~BIT_IN)
Autrement dit, si on utilise OSC au lieu de nOSC...
BIT_OUT = OSC & BIT_IN

Les sorties BIT_OUT (points bleus) ont aussi leurs compléments (inverses): nBIT_OUT (points rouges).
Attention: l'ordre des sorties pour la moitié des bits est inversé. C'est aussi un choix purement pratique.

nOSC BIT_IN | BIT_OUT nBIT_OUT
  0    0    |    0       1
  0    1    |    1       0
  1    0    |    0       1
  1    1    |    0       1
 

En résumé, tant que nOSC est à 1, l'amplitude en sortie est forcée a 0 quelle que soit sa valeur en entrée: BIT_OUT = 0.
Si nOSC est à 0, l'amplitude "passe": BIT_OUT = BIT_IN.

Voici une representation detaillée des portes pour un bit. Oui, tout ça pour ça...

Silicium annoté du DAC

TODO: Renommer OSC en nOSC.
PU* indique des résistances Pull Up. T1 inverse BIT_IN. T2 ou T3 forcent BIT_OUT à 0. T4 donne l'inverse de BIT_OUT.

Le fait d'avoir produit le complément des sorties donne un indice sur la structure qui va suivre: chaque paire descend ensuite dans un décodeur 4-vers-16, qui va activer un signal unique pour chaque valeur d'amplitude. Les paires arrivent verticalement d'en haut, et les sorties partent vers la droite. A noter que l'ordre des bits de l'amplitude sont toujours inversés (MSB à droite).

Le décodeur est une sorte de "lookup table" où chaque sortie provient d'une porte NOR à 4 entrées. Si le moindre bit en entrée est à 1, la sortie passe à 0. En reliant les sorties ou leurs compléments aux entrées, on peut choisir l'unique valeur pour laquelle la sortie passera à 1. Le motif produit par les pistes (lignes verticales avec des "oreilles" qui dépassent) permet de deviner si le bit choisi doit être à 0 ou 1 pour telle sortie.

DECODE_1 = ~(BIT_OUT3 | BIT_OUT2 | BIT_OUT1 | nBIT_OUT0)		// 0001
DECODE_2 = ~(BIT_OUT3 | BIT_OUT2 | nBIT_OUT1 | BIT_OUT0)		// 0010
DECODE_3 = ~(BIT_OUT3 | BIT_OUT2 | nBIT_OUT1 | nBIT_OUT0)		// 0011
...
DECODE_15 = ~(nBIT_OUT3 | nBIT_OUT2 | nBIT_OUT1 | nBIT_OUT0)	// 1111

En analysant chaque ligne, on peut voir au final que le décodeur n'a que 15 sorties et non 16 (des 16 valeurs possibles avec 4 bits), simplement car il n'est pas nécessaire de "câbler" la valeur 0 (silence).

Les sorties du décodeur sont enfin reliées à des transistors dont la géométrie peut paraître curieuse.
Leurs formes et tailles différentes permettent en fait de les rendre plus ou moins efficaces, c'est à dire qui laissent passer plus ou moins de courant. C'est précisément ici que la sortie devient analogique avec des niveaux logarithmiques.

Comme chaque transistor est rectangulaire, on peut estimer leur "résistance" relative grâce au ratio entre leur largeur et leur hauteur. En effet, ce n'est pas l'aire de leur surface qui compte ici mais la largeur et la distance des contacts entre émetteur et collecteur.

On peut imaginer des résistances en série et en parallèle selon la forme, comme ceci:

Transistors du DAC

J'ai choisi le symbole Américain pour éviter la confusion entre les rectangles et les lignes.
On peut imaginer les transistors "longs" comme très résistants (ici 2R), et les "larges" comme peu résistants (ici R/2). Les bases des transistors (sorties du décodeur) sont indiquées par la lettre B.

En orientant les transistors correctement (certains sont pivotés) et en mesurant les tailles, on obtient les ratios qui indiquent les résistances relatives:

Ratios des dimensions

La progression logarithmique en fonction de la valeur de l'amplitude (numéro de la résistance) est évidente. Ainsi, la valeur 1 activera la plus forte résistance (faible amplitude), alors que la valeur 15 activera la plus faible (forte amplitude).

Comme de tels transistors volontairement dégradés n'existent pas dans les CPLDs et les FPGAs, il faut soit trouver ou fabriquer un DAC équivalent en dehors, soit utiliser une forme de modulation pour simuler une sortie analogique.

footer
symbol symbol symbol symbol symbol