mikrocontroller.net

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


Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich hab den Code,der den Sinnussignal erzeugt, auf die Seite
''http://www.lothar-miller.de/s9y/archives/57-Sinusa...; 
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;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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  :-/

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.