Forum: FPGA, VHDL & Co. Jemand kann mir die Berechnung erklären ?


von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

Hi Leute,

ich hab den Code,der den Sinnussignal erzeugt, auf die Seite
''http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html#extended''; 
gefunden.

Ich hab auch schon gecheckt und simuliert beim ModelSim.Der Frequenz von 
Sinnus ist 5 Hz.Er stellt den Wert "Freq_Data  => x"CC"," ein.Aber ich 
kann nicht verstehen,wie er von x"CC" d.h 204 nach 5 Hz umrecht.
Jemand kann mir helfen?
Vielen Dank!
-------------------------------
library IEEE;
  use IEEE.std_logic_1164.all;
  use IEEE.numeric_std.all;
Entity DDFS is
   Port ( CLK       : in  std_logic;
          Freq_Data : in  std_logic_vector (7 downto 0);
          Dout      : out std_logic_vector (7 downto 0)
        );
   end DDFS;

Architecture RTL of DDFS is
  signal Result  : std_logic_vector (7 downto 0);
  signal Accum   : unsigned (20 downto 0) := (others=>'0');
  alias  Address : unsigned (6 downto 0) is Accum(Accum'high-1 downto 
Accum'high-7);
  alias  Sign    : std_logic is Accum(Accum'high); -- MSB
begin
   process begin
     wait until rising_edge(CLK);
     Accum <= Accum + unsigned(Freq_Data);
   end process;
 .............
------------------------
und dann

-----------------------
....................
begin
   I_ddfs : DDFS
   port map( CLK => clk,
             Freq_Data  => x"cc",
             Dout => sinus);

   sinusplusoffset <= 
std_logic_vector(unsigned(sinus)+to_unsigned(128,8));

   I_pwm : PWM
   port map( CLK => clk,
             pwmvalue => sinusplusoffset,
             pwmout => pwmout);

end Behavioral;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> signal Accum   : unsigned (20 downto 0) := (others=>'0');
Das ist ein 21-Bit Zähler von 0 bis 2097151, ein kompletter 
Zählerdurchlauf hat also 2^21 = 2097152 Schritte.

Und der Increment Freq_Data ist 0xCC = 204.

Jetzt wird mit jedem Takt auf den Zähler Accum dieser Wert 204 
addiert.
Bis der 1 mal überläuft dauert das dann 2097152/204 = 10280 Takte.
Und ein Durchlauf entspricht einem vollen Zyklus der Sinuskurve.

Also gilt
   fsinus = fclk * Freq_Data / (2^21)

War das jetzt sooo schwierig?


Wenn deine 5Hz genau stimmen, hast du vermutlich eine Taktfrequenz von
   fclk = 5 Hz * (2^21) / 204 = 51,4 kHz


BTW:
Bei der Klausur sitze ich nicht neben dir  :-/

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

Ich werde mich bemühen darum,dass allein zu sitzen:D.
Ich danke dir sehr viel.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.