mikrocontroller.net

Forum: FPGA, VHDL & Co. Kleines Programm


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir hier bitte jemand ein wenig behilflich sein?
Ich brauche ein einfaches programm, welches nur einen Clock-Eingang und 
einen Ausgang hat.
Zu Beginn soll der Ausgang "0" sein. Nach etwa 100 Taktflanken soll der 
Ausgang auf "1" gehen und dort bleiben.

Ich versuch es hinzubekommen, aber es klappt immer nch nicht :(

Autor: Armin Diehl (ardiehl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auf die schnelle, Syntaxfehler bitte korrigieren ;-)

entity cnt
Port ( clk: in STD_LOGIC;
       reset: in  STD_LOGIC;
       d : out : STD_LOGIC);
end cnt;

architecture Behavioral of cnt is
signal count : integer range 0 to 100;
begin
  x:process(reset,clk)
  begin
    if reset = '1' then
      count <= 0;
      d <= '0';
    elsif rising_edge(clk) then
      if count = 100 then d <= '1';
      count <= count + 1;
    end if;
  end process;
end Behavioral;

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht das ganze auch ohne Reset oder ist dieser hier notwendig?

Gibt es hier einen Überlauf? 1,2,3,...,99,100,1,2,...

Welchen Anfangszustand hat der Ausgang, wenn ich an den FPGA Spannung 
anlege? Ich arbeite mit Altera Quatus.

Danke für die Antworten!

Autor: FPGA-Küchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auf die schnelle, Syntaxfehler bitte korrigieren ;-)
entity cnt
Port ( clk:   in  STD_LOGIC;
       reset: in  STD_LOGIC;
       d :    out STD_LOGIC := '0');
end cnt;

architecture Behavioral of cnt is
signal count : integer range 0 to 100 := 0;
begin
  x:process(reset,clk) --process(clk)
  begin
    if reset = '1' then --wech
      count <= 0;       --wech
      d     <= '0';     --wech 
    elsif rising_edge(clk) then --if rising_edge(clk)
      if count = 100 then 
        d <= '1';
      else
        count <= count + 1;
        d     <= '0';  
      end if;
   end if;
  end process;
end Behavioral;



Xilinx empfiehlt den Reset im PowerUp-Fall einzusparen, in den 
Kommentaren steht, war zu ändern ist um ohne Reset zu arbeiten. Bei 
Quarkus kenn ich mich nicht so aus.

Die schaltung oben zählt bis hundert, schaltet dann auf '1' und stoppt 
mit Zählen. weiter gehts nur mit erneuten PowerUp.

Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGA-Küchle:
Das mit dem Reset würde mich etwas näher interessieren ...

Meine Designs haben die Eigenart, dass ich immer den Reset vergesse und 
trotzdem funktionieren sie ordnungsgemäß nach dem 
Flashen/Downloaden/Power-UP.

Werden solche Reset-Konstrukte vom Synthesetool erkannt und beim 
Power-Up dann auch ohne externe aktivierung eines Reset-Pins gestartet?

Mfg
Thomas Pototschnig

Autor: fpgakuechle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FPGAs sind halt SRAM, Speicherzellen. Bei der Konfiguration, dem laden 
des "Programms" in den FPGA nach PowerUp werden alle Speicherzellen 
beschrieben, also mit einem Reset-Value versehen. Das ist bei FF der 
init-wert den man bei der Signaldekleartion angibt (habe ich im VHDL 
Code eingefügt) oder ein default-wert, meist 0. Dadurch haben in einem 
FPGA auch ohne Reset alle Speicherzellen (auch Counter) immer einen 
definierten Wert, auch ohne explizite reset-leitung und deren 
Aktivierung.


Xilinx erklärt das hier:

http://www.xilinx.com/xlnx/xweb/xil_tx_display.jsp...

Bei Altera wird es ähnlich sein.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich benütze den unteren Code.
Kurz nach einem Power-Up sollte der Ausgang von "1" nach "0" schalten 
und dort verweilen. Dies ist jedoch nicht der Fall!
I messe am Ausgang "d" immer ein ständiges High!

Kennt einer den Grund hierfür?

Ich beütze Quartus-II.


library ieee;
use ieee.std_logic_1164.all;

entity cnt is
port ( clk:   in  STD_LOGIC;
       d :    out STD_LOGIC := '1');
end cnt;

architecture Behavioral of cnt is
signal count : integer range 0 to 100000 := 1;
begin
  process(clk)
  begin
    if rising_edge(clk)
      if count = 100000 then
        d <= '0';
      else
        count <= count + 1;
        d     <= '1';
      end if;
   end if;
  end process;
end Behavioral;

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ausgang ist nur für einen Takt 0.

Gruß

Dirk

Autor: John-eric K. (mockup)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fehlt da nicht ein "then" bei rising_edge(clk)!

Hast du die Pin Zuweisung Richtig?

mfg

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  FPGA-Küchle

Ich finde Deine Antwort über den Reset sollte ins Wiki, da dies sehr 
wichtig ist, denn viele fragen sich bestimmt mit welchem Wert startet 
mein Programm, wenn kein Reset-Signal ausgelöst wurde.

Grüsse

Michael

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie bekommt man nun am obeigen Programm ein einmaliges Signalwechsel 
nach einem Power-ON?

------------------|   HIGH
                  |
                  |------------------LOW

t=0               t=1 ms

Autor: na (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zähle bis t=1ms und setze deine Leitung die vorher 1 war auf 0. Am 
besten ein Register nehmen, auf 1 setzen, solange es 1 ist zählen, dann 
auf 0 setzen und damit auch nicht mehr zählen.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum funktioniert es hier nicht wie gewünscht?


library ieee;
use ieee.std_logic_1164.all;

entity cnt is
port ( clk:   in  STD_LOGIC;
       d :    out STD_LOGIC := '1');
end cnt;

architecture Behavioral of cnt is
signal count : integer range 0 to 100000 := 1;
begin
  process(clk)
  begin
    if rising_edge(clk) then
      if count = 100000 then
        d <= '0';
      else
        count <= count + 1;
        d     <= '1';
      end if;
   end if;
  end process;
end Behavioral;

Autor: ChrisV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was geht denn nicht bzw. was tut das obige Design bei dir?

Es sollte nämlich genau dass tun was du möchtest. Es zählt von 
1-100.000, was  etwa 100.000/clk dauern sollte. Sobald count den Wert 
100.000 erreicht hat wechselt d auf 0 und bleibt dort für alle Ewigkeit.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Zähler überläuft fängt er bei 0 wieder an.
Also ist D für einen Taktzyklus = 0 und wird dann wieder 1.


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme aless zurück und behaupte das Gegenteil.Bei 100000 wird ja 
nicht weiter erhöht.

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.