Forum: FPGA, VHDL & Co. Kleines Programm


von Anfänger (Gast)


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 :(

von Armin D. (ardiehl)


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;

von Anfänger (Gast)


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!

von FPGA-Küchle (Gast)


Lesenswert?

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.

von Thomas Pototschnig (Gast)


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

von fpgakuechle (Gast)


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?iLanguageID=1&multPartNum=1&sTechX_ID=kc_smart_reset

Bei Altera wird es ähnlich sein.

von Anfänger (Gast)


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;

von Dirk (Gast)


Lesenswert?

Der Ausgang ist nur für einen Takt 0.

Gruß

Dirk

von John-eric K. (mockup)


Lesenswert?

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

Hast du die Pin Zuweisung Richtig?

mfg

von Michael (Gast)


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

von Anfänger (Gast)


Lesenswert?

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

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

t=0               t=1 ms

von na (Gast)


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.

von Anfänger (Gast)


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;

von ChrisV (Gast)


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.

von Dirk (Gast)


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.


von Dirk (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.