logo

Cette page a au moins 7 ans !
This page is at least 7 years old !
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
Envelope
Filtres
Interface CPU
Silicium: Volume
Silicum: DAC
LFSR Experimenter

Un générateur de fréquence basique

Pour créer un générateur de fréquence, on doit dériver des fréquences audibles de la master clock en la divisant. Pour cela, on peut utiliser un compteur.

Au tout début, le compteur est initialisé avec la valeur que l'on souhaite, par exemple 3, qu'on appelle ici "HPERIOD". Le compteur s'appelle "CNT".
A chaque front (prenons les fronts montants) de la master clock MCLK, le compteur est décrémenté. Lorsqu'il atteint 0, le compteur est rechargé avec HPERIOD, et le signal de sortie OSC du générateur de fréquence est inversé.

De ce fait, tous les 4 fronts de la master clock (il faut compter le 0), le signal de sortie s'inverse.

soundchip

reg [1:0] CNT;				// 2 bits suffisent pour aller jusque 3
reg [1:0] HPERIOD = 3;

always @(posedge MCLK)
begin
    if (CNT)
    	CNT <= CNT - 1'b1;	// Decrementer si > 0
    else
    begin
    	CNT <= HPERIOD;		// Reload
    	OSC <= ~OSC;		// Inversion sortie
    end
end

Il est important de noter qu'une inversion veut dire qu'une demi-période est produite (d'où le nom "HPERIOD": Half Period). En utilisant 3 comme diviseur, on obtient une inversion toutes les 4 périodes de MCLK, soit une période en sortie sur OSC toutes les 2*4 = 8 périodes de MCLK.

A noter aussi qu'il est plus simple au niveau logique de comparer un compteur à la valeur fixe 0. C'est pour cela qu'il est préférable de décrementer jusque 0, plutôt que d'incrémenter jusque HPERIOD.

Si maintenant on utilise la valeur 5 comme diviseur, on obtient une fréquence plus basse. Ca peut sembler contre-intuitif (valeur qui grandit pour fréquence qui baisse), mais ça simplifie grandement toute la logique en ne compliquant qu'un peu la vie des programmeurs qui utiliseront le soundchip:

soundchip

reg [2:0] CNT;			// Il faut 3 bits maintenant (0~5)
reg [2:0] HPERIOD = 5;

Un soundchip qui se respecte peut être piloté par un CPU, afin de pouvoir produire des notes en séquence pour lire un morceau. On pourra pour ça, faire en sorte que le registre HPERIOD soit modifiable par une interface externe.

Le CPU pourra alors changer la valeur quand bon lui semble, pour faire changer la fréquence de la note. Ici HPERIOD est mis à jour pour produire un son aigu puis un son plus grave (diviseurs 2 puis 4):

soundchip

L'interface avec le CPU est abordée en détails plus bas.

Pour l'instant le soundchip est capable de produire ceci:

 

 

footer
symbol symbol symbol symbol symbol