Forum: FPGA, VHDL & Co. enable, wie richtig?


von daniel (Gast)


Lesenswert?

hallo,

ich muss gegen irgendeine goldene regel verstossen haben
der auskommentierte code funktioniert
und der nicht auskommentierte tut es nicht

der unterschied, den ich hier sehe ist, dass im funktionierenden
code die berechnung (die addition) unabhängig von enable
immer durchgeführt wird und erst die ausgabe durch enable
"geschützt" wird.
im nicht funktionierenden code, ist die ganze berechung
im if enable eingeschlossen, und die ausgabe dagegen nicht.

vielleicht habe ich auch etwas wichtiges übersehen
der code ist unten
1
entity adder is
2
  generic(n: natural := 4);
3
  port(enable: in std_logic;
4
  x,y: in std_logic_vector(n-1 downto 0);
5
  z: out std_logic_vector(n-1 downto 0);
6
  carry: out std_logic);
7
end adder;
8
9
architecture Behavioral of adder is
10
  signal a,b: unsigned(n downto 0);
11
  signal c: unsigned(n downto 0);
12
begin
13
14
  process(enable,x,y)
15
  begin
16
    if enable = '1' then
17
      a <= '0' & unsigned(x);
18
      b <= '0' & unsigned(y);
19
      c <= a + b;
20
    end if;
21
  end process;
22
  
23
  carry <= c(c'high);
24
  z <= std_logic_vector(c(n-1 downto 0));
25
  
26
  
27
--  a <= '0' & unsigned(x);
28
--  b <= '0' & unsigned(y);
29
--  c <= a + b;
30
31
--  carry <= c(c'high) when enable = '1' else '-';
32
--  z <= std_logic_vector(c(n-1 downto 0)) when enable = '1' else (others => '-');
33
34
end Behavioral;

von spartanne (Gast)


Lesenswert?

beim kurz drüberschauen:

falsch ist auf alle Fälle dass du im process keine Zuweisungen hast wenn 
enable = '0' ist -> das gibt Latches (pfui!)

unschön ist, dass im process in der sensitivy-List a und b fehler 
(Fehler bei Simulation, für Synthese ok).

ansonsten hast du zwei verschiedene Verhaltensweisen für die Ausgabe 
beschrieben (undauch richtig erkannt). Einmal ist die Ausgabe 
enable-gesteuert, das andere mal nicht.

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


Lesenswert?

>  dass im funktionierenden code
Was soll mit dem Code funktionieren?
Die Simulation?
Dann sollte die Sens-List (wie von  spartanne (Gast) schon gesagt)
um a und b erweitert werden.
Denn nachdem sich a oder b im Prozess geändert haben,
muß der ganze Prozess neu berechnet (simuliert) werden.

Also so
1
architecture Behavioral of adder is
2
  signal a,b: unsigned(n downto 0);
3
  signal c: unsigned(n downto 0);
4
begin
5
6
  process(enable,x,y,a,b)
7
  begin
8
    if enable = '1' then
9
      a <= '0' & unsigned(x);
10
      b <= '0' & unsigned(y);
11
      c <= a + b;
12
    end if;
13
  end process;
14
  :

Oder so
1
architecture Behavioral of adder is
2
  signal a,b: unsigned(n downto 0);
3
  signal c: unsigned(n downto 0);
4
begin
5
6
  process(enable,x,y)
7
  begin
8
    if enable = '1' then
9
      c <= '0' & unsigned(x) + '0' & unsigned(y);
10
    end if;
11
  end process;
12
  :

Oder so (mit Variablen, da sollte man aber genau wissen, was man tut)
1
architecture Behavioral of adder is
2
  signal c: unsigned(n downto 0);
3
begin
4
5
  process(enable,x,y)
6
  variable a,b: unsigned(n downto 0);
7
  begin
8
    if enable = '1' then
9
      a := '0' & unsigned(x);
10
      b := '0' & unsigned(y);
11
      c <= a + b;
12
    end if;
13
  end process;
14
  :



So eine High-transparente Zuweisung ergibt später in Hardware ein Latch.
Besser ist eine Defaultzuweisung im Prozess
1
  process(enable,x,y)
2
  begin
3
    c <= (others=>'0');
4
    if enable = '1' then
5
      c <= '0' & unsigned(x) + '0' & unsigned(y);
6
    end if;
7
  end process;
8
  :

Oder ein komplett auscodierter else-Pfad
1
  process(enable,x,y)
2
  begin
3
    if enable = '1' then
4
      c <= '0' & unsigned(x) + '0' & unsigned(y);
5
    else 
6
      c <= (others=>'0');
7
    end if;
8
  end process;
9
  :
Das gibt zum guten Ende dann "nur" Kombinatorik.

Und sowas
>> carry <= c(c'high) when enable = '1' else '-';
'-', 'h', 'l', 'x'...  kann die Synthese nicht in Hardware ausführen. 
Dort gibt es nur 1 und 0, und in den IO-Zellen noch 'z'. Das wars. Wenn 
du innerhalb eines FPGAs ein 'z' zuweist, dann wird das als Multiplexer 
realisiert.


BTW:
> ich muss gegen irgendeine goldene regel verstossen haben
Jep, Groß- und Kleinschreibung verwenden (Bedienungsanleitung Forum).

von Mike (Gast)


Lesenswert?

> '-', 'h', 'l', 'x'...  kann die Synthese nicht in Hardware ausführen.
> Dort gibt es nur 1 und 0, und in den IO-Zellen noch 'z'. Das wars. Wenn
> du innerhalb eines FPGAs ein 'z' zuweist, dann wird das als Multiplexer
> realisiert.

Ältere FPGAs (z.B. Spartan 2) haben (noch) interne Tri-State Busse. 
Allerdings sollte man wissen was man da macht.

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.