enable, wie richtig?

Gast #1062339
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;
Gast #1062351
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.
Moderator (Firma: Titel) Persönliche Seite #1062523
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).
Gast #1062581
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.

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