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

Un générateur de bruit

Avant de passer aux formes d'onde autres que le carré, on peut s'intéresser à un autre type de générateur 1-bit: le "bruit". De nombreux soundchips avaient un ou plusieurs "noise channel", produisant des sons proches du bruit blanc et utiles pour les percussions et les bruitages.

Ce qui était appelé "bruit" était souvent le produit d'une sortie 1-bit pseudo-aleatoire. "Pseudo" car même si la période était rarement perceptible, il y avait bien une période (la séquence se répétait au bout d'un certain temps).

La technique principale pour générer cette séquence avec peu d'éléments logiques, est d'utiliser un Linear Feedback Shift Register (LFSR). Autrement dit: un compteur qui compte d'une manière qui semble aléatoire.

Le principe est d'utiliser un registre d'une taille qui définira la période du bruit. Un LFSR 16 bits produira une séquence pseudo-aléatoire qui bouclera toutes les (2^16)-1 = 65535 valeurs. Le -1 est inhérent au principe d'un LFSR: on ne peut pas utiliser la valeur 0 au risque de faire "caler" le générateur (voir ci-dessous).

A chaque front d'horloge, le registre est décalé d'un bit à gauche ou à droite. La direction n'importe pas tant que tout reste cohérent, mais prenons la droite comme exemple.
Le bit qui "sort" du registre, à droite donc, est la sortie 1-bit du générateur, tout comme OSC ci-dessus.
Le bit qui "entre" dans le registre, à gauche, est le résultat d'un ou plusieurs XOR entre d'autres bits du registre.
C'est là que la magie opère: tant qu'au moins un bit reste à 1, le LFSR produira une séquence.

soundchip

Le choix des bits utilisés (appelés "taps") pour obtenir le nouveau bit peut être arbitraire, mais il existe des conditions précises pour que le LFSR produise une séquence maximum. Voir Wikipedia qui parle de maths que je ne comprend pas vraiment, et d'autres types de LFSR.

On peut se contenter de réaliser le type de Fibonacci, qui semble être le moins gourmand en portes logiques.

reg [6:0] LFSR;

assign OUT = LFSR[0];
assign BIT = LFSR[0] ^ LFSR[3];

always @(posedge CLK or posedge RESET)
begin
	if (RESET)
		LFSR <= 5;			// N'importe quelle valeur != 0
	else
		LFSR <= {BIT, LFSR[6:1]};
end

C'est un mélange de logique combinatoire (XOR) et séquentielle (décalage du registre): BIT et OUT se mettent à jour instantanement, alors que LFSR se met à jour sur les front montants de CLK. Reset est important pour que le registre ne démarre pas à zero. Si c'etait le cas, BIT ne pourrait jamais passer à 1, et le generateur "calerait".

soundchip

Pour l'exemple et pour raccourcir le chronograme, LFSR ne fait que 7 bits. En réalité, la machine infernale qui nous sert de cerveau détecterait trop facilement la période et le "bruit" ne serait plus vraiment perçu comme du bruit:

Avec 16 bits et sans changer les taps, on arrive à un bien meilleur résultat:

A noter que l'horloge n'est pas MCLK mais CLK, une horloge qui devrait être dans une gamme audible afin d'éviter de se trouver dans les ultrasons et produire du bruit inutile. On peut très bien câbler la sortie OSC d'un générateur de fréquence basique à CLK pour produire des bruits plus ou moins aigus.

Pour simplifier encore plus les choses, on peut économiser le registre OSC car le rapport cyclique n'importe plus, on souhaite juste avoir le "top" du front montant. On peut à la place utiliser de la logique combinatoire pour generer le signal TICK, qui sera haut seulement quand CNT sera egal a 0.

reg [6:0] LFSR;
reg [1:0] CNT;			// 2 bits suffisent pour aller jusque 2

assign TICK = ~{|CNT};		// TICK = NOR de tout CNT

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

assign OUT = LFSR[0];
assign BIT = LFSR[0] ^ LFSR[3];

always @(posedge TICK or posedge RESET)
begin
	if (RESET)
		LFSR <= 5;	// N'importe quelle valeur != 0
	else
		LFSR <= {BIT, LFSR[6:1]};
end
Il n'y a plus de OSC ni de CLK, mais TICK, qui donne une impulsion à la fréquence choisie avec PERIOD. La mise à jour du LFSR est plus lente, et on peut ainsi obtenir un bruit plus grave.

soundchip

En faisant varier PERIOD, ca donne ca:

footer
symbol symbol symbol symbol symbol