Maria S. schrieb:
> -> erbitten um geeigneten Lösungsvorschlag :)
Was funktioniert mit dem geposteten Vorschlag nicht? Was erwartet ihr,
was passiert stattdessen? Was sagt der Simulator? Wie lässt sich das
erklären?
Martin K. schrieb:
> Da fehlt wohl noch ein ELSE für den Fall, dass der Bereich ok ist.
Das ist nicht das Problem, denn wenn alles ok ist, muss nach der
Multiplikation eh' nichts mehr gemacht werden.
Das einfach Problem hier ist das Verhalten von Signalen in Prozessen.
Das Signal z1 übernimmt das Ergebnis der Multiplikation nicht sofort,
sondern erst am Ende des Prozesses. Für solche Berechnungen muss das
Zwischenergebnis z1 eine Variable sein.
Alternativ würde es reichen, wenn z1 in die Sensitivliste aufgenommen
wird, damit der Prozess nach Zuweisung eines neuen Wertes an z1 noch
einmal durchlaufen wird.
Alternativ: die Aufgabe einfach ohne Prozess lösen. Und genau so würde
ich das machen:
1 | library ieee ;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 | entity Multi is
|
5 | port(
|
6 | A, B : in signed(2 downto 0);
|
7 | Z : out signed(7 downto 0)
|
8 |
|
9 | );
|
10 | end entity Multi;
|
11 | architecture behavior of Multi is
|
12 |
|
13 | signal X : signed (3 downto 0);
|
14 | signal Y : signed (3 downto 0);
|
15 | signal z1 : signed (7 downto 0);
|
16 |
|
17 | begin
|
18 |
|
19 | X <= ('0' & A);
|
20 | Y <= ('0' & B);
|
21 |
|
22 | z1 <= X * Y;
|
23 |
|
24 | z <= "00001111" when z1 > "00000111" else
|
25 | "00001000" when z1 < "11111000" else
|
26 | z1;
|
27 |
|
28 | end behavior;
|
Wozu für jeden Witz einen Prozess anfangen?