Dann packen wir mal unsere Finger aus und beginnen abzuzählen... ;-)
Der Akkumulator ist 21 Bits breit.
1 | signal Accum : unsigned (20 downto 0) := (others=>'0');
|
2 |
|
3 | alias Address : unsigned (6 downto 0) is Accum(Accum'high-1 downto Accum'high-7);
|
4 | alias Sign : std_logic is Accum(Accum'high); -- MSB
|
Ein kompletter Zyklus ist also nach Sign&Adress = 256 Zählschritten der
obersten 8 Bits des Akkus durchlaufen.
1 | wait until rising_edge(CLK);
|
2 | Accum <= Accum + unsigned(Freq_Data);
|
Der Wert von Freq_Data wird auf wird auf die unteren 8 Bit des Akkus
aufaddiert.
> Wie funktioniert diese Einstellung?
Freq_Data wird auf den Akku aufaddiert und die obersten 8 Bit
> sind die 8 Bit unter "Freq_Data" von x01-xFF einstellbar?
Sie sind genau genommen von x"00" bis x"FF" einstellbar. Wobei x"00" in
einer Gleichspannung resultiert, weil ja der Akku nicht mehr
weitergezählt wird.
> Welchen Frequenzbereich wird reguliert?
Mit Freq_Data=1 braucht ein kompletter Sinusdurchlauf 2^21 Takte des
Systemtaktes. Mit Freq_Data=2 sind es nur 2^20 Takte...
In Zahlen: wenn CLK 50 MHz sind, dann kommt mit Freq_Data=1 eine
Frequenz von ca. 24Hz heraus, mit Freq_Data=2 sind es 48Hz, mit
Freq_Data=3 sind es 72Hz...
Als Formel könnte man das so schreiben:
fdout = (fclk/2^21) * Freq_Data
mit fdout = Sinusausgangsfrequenz
und fclk = Taktfrequenz
Damit ergibt sich dann die höchste Frequenz zu 23.8Hz * 255 = 6080Hz.
Die Auflösung zwischen 2 Frequenzen ist der Schritt von fclk/2^21 =
23,8Hz.