Forum: FPGA, VHDL & Co. 5 sequenzielle Impulse erzeugen - Noob meets Krise


von Andy L. (nemai)


Lesenswert?

Hi,

bin absoluter Anfänger in VHDL und versuche es gerade mit learning by 
doing zu lernen. Ich arbeite mit Altera Quartus II und einem DE1 Board.

Die ersten Gehversuche waren erfolgreich, mein mehrschrittiges 5-bit 
Multiplizierwerk funktioniert - allerdings bisher nur mit einem Taster 
von Hand getaktet.
Mein Problem ist, ich bekomme es nicht beschrieben, dass nach dem 
init-Tastendruck (2 5-bit Zahlen werden davor mit den 10 vorhandenen 
Schaltern eingestellt) genau 5 Clock Impulse für die Register generiert 
werden. Ich bekomme diverse Fehlermeldungen aus denen ich kaum schlau 
werde, bevorzugt diese: "Error (10818): Can't infer register for 
"count[17]" at clock_gate.vhd(21) because it does not hold its value 
outside the clock edge"

Mein letzter Ansatz ist:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity clock_gate is
5
  port(
6
    clk_in, init :  in std_logic;
7
    clk_out : buffer std_logic := '0'
8
  );
9
end entity clock_gate;
10
11
architecture behav of clock_gate is
12
  signal count: natural := 10;
13
begin
14
  process(init,clk_in) is
15
  begin
16
    if init = '1' then
17
      count <= 0;
18
      clk_out <= '0';
19
    end if;
20
    if rising_edge(clk_in) and init = '0' then
21
      if clk_out = '0' and count < 10 then
22
        clk_out <= '1';
23
        count <= count+1;
24
      elsif clk_out = '1' and count < 10 then
25
        clk_out <= '0';
26
        count <= count+1;
27
      else
28
        clk_out <= '0';
29
      end if;
30
    end if;    
31
  end process;  
32
end architecture behav;

..und es ist nicht synthetisierbar. An clk_in sollte ein beliebiger der 
vorhandenen Oszillatoren gehängt werden.

Hat da jemand einen guten Tipp? Ich krieg bald die Krise, da die 
Grundaufgabe eigentlich echt einfach ist, ich aber keine funktionierende 
Beschreibung hinbring..

Gruß :)

von Lattice User (Gast)


Lesenswert?

Damit ein Register erkannt wird, muß man sich an bestimmte Codingstyles 
halten. Irgendow im Qauartus Manual findest du die auch.

Register mit asynchronem Reset geht z.b. so
1
    if init = '1' then
2
       ...
3
    elsif rising_edge(clk_in) then
4
       ...
5
    end if;

Es gibt noch andere Varianten.

Davon abgeshen sind da noch andere Probleme verbogen (prellende Taster, 
asynchrones Reset (böse), aber jeder fängt mal an.

Viele Tipps und Erklärungen wi und warum man was macht findest due hier:
http://www.lothar-miller.de/s9y/

von Andy L. (nemai)


Lesenswert?

So habs jetzt nochmal überarbeitet und simuliert (ModelSim ist ein 
Krampf sondergleichen imho) und es tut endlich :)
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity clock_gate is
5
  port(
6
    clk_in, init :  in std_logic;
7
    clk_out : buffer std_logic := '0'
8
  );
9
end entity clock_gate;
10
11
architecture behav of clock_gate is
12
  signal count: natural := 10;
13
  signal init_count: natural := 0;
14
begin
15
  process(init,clk_in) is
16
  begin
17
    if rising_edge(clk_in) then
18
      if init = '1' then
19
        count <= 0;
20
        if init_count < 2 then
21
          clk_out <= not clk_out;
22
          init_count <= init_count+1;
23
        end if;
24
      elsif count < 10 then
25
        clk_out <= not clk_out;
26
        count <= count+1;
27
      else
28
        clk_out <= '0';
29
        init_count <= 0;
30
      end if;  
31
    end if;    
32
  end process;  
33
end architecture behav;

Die Taster auf dem Board sind übrigens entprellt. Und was ist an einem 
asynchronen Reset denn böse? Ist doch in gewisser Weise eine 
Grundfunktionalität von Registern (?)

Die Seite ist nicht schlecht, danke :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
  process(init,clk_in) is
2
  begin
3
    if rising_edge(clk_in) then
4
     ...
init ist unnötig

Andy L. schrieb:
> Und was ist an einem asynchronen Reset denn böse?
> Ist doch in gewisser Weise eine Grundfunktionalität von Registern (?)
Bei Xilinx gibt es z.B. zwei Modi für die Flipflops: synchron oder 
asynchron. Und das hat Auswirkungen auf das Design:
Beitrag "Xilinx und die Resets"

Du solltest also das Datenblatt deines FPGAs genau anschauen und die 
entsprechenden Appnotes lesen.

Und das Gefährliche am asynchronen Reset ist der Zeitpunkt, an dem der 
Reset inaktiv wird: was, wenn das genau ganz kurz vor oder genau mit 
einer Taktflanke ist? Dann sieht die Hälfte der Flipflops noch einen 
Reset, die andere Hälfte legt schon mal los...

Und was, wenn auf deinen asynchronen Resetpin mal ein EMV-Spike kommt? 
Dann werden 1/3 der Flipflops im FPGA zurückgesetzt, und die anderen FFs 
haben nicht bemerkt, dass da ein Reset war...

Also mindestens:
Reset asynchron aktivieren, dann eintakten und synchron zurücksetzen.

Zum Hintergrund (der letzte Satz betrifft den Reset):
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html

Andy L. schrieb:
> Die Seite ist nicht schlecht, danke :)
Viel Spass damit... ;-)

von Andy L. (nemai)


Lesenswert?

Oh ja, das init in der sensitivity Liste ist noch ein Relikt eines 
anderen Ansatzes, hab ich übersehen

Danke für die weiteren Hinweise :)

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.