Kleines Programm

Gast #492774
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 :(
#492791
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;
Gast #492834
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!
Gast #492929
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.
Gast #493019
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
Gast #493027
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.
Gast #505553
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;
Gast #506961
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
Gast #507692
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;
Gast #507792
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren