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 :(
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;
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!
auf die schnelle, Syntaxfehler bitte korrigieren ;-)
1 | entity cnt |
2 | Port ( clk: in STD_LOGIC; |
3 | reset: in STD_LOGIC; |
4 | d : out STD_LOGIC := '0'); |
5 | end cnt; |
6 | |
7 | architecture Behavioral of cnt is |
8 | signal count : integer range 0 to 100 := 0; |
9 | begin
|
10 | x:process(reset,clk) --process(clk) |
11 | begin
|
12 | if reset = '1' then --wech |
13 | count <= 0; --wech |
14 | d <= '0'; --wech |
15 | elsif rising_edge(clk) then --if rising_edge(clk) |
16 | if count = 100 then |
17 | d <= '1'; |
18 | else
|
19 | count <= count + 1; |
20 | d <= '0'; |
21 | end if; |
22 | end if; |
23 | end process; |
24 | 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.
@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
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?iLanguageID=1&multPartNum=1&sTechX_ID=kc_smart_reset Bei Altera wird es ähnlich sein.
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;
fehlt da nicht ein "then" bei rising_edge(clk)! Hast du die Pin Zuweisung Richtig? mfg
@ 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
Wie bekommt man nun am obeigen Programm ein einmaliges Signalwechsel nach einem Power-ON? ------------------| HIGH | |------------------LOW t=0 t=1 ms
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.
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;
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.
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.
Ich nehme aless zurück und behaupte das Gegenteil.Bei 100000 wird ja nicht weiter erhöht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.