> 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).