test_1 schrieb:
> ich meine müsste für den Prozess der Takt sync. ist ja schnuppe
> sein oder?
Der Synthese ist die Sensitivliste sowieso weitestgehend egal. Du
bekommst bei einer unvollständigen Liste einfach eine freundliche
Meldung. In der Simulation (und nur dort!!!) wird dein Counter aber dann
einen halben (!) Takt "verspätet" kommen. Denn bei jedem Wechsel auf der
Taktleitung wird der Prozess neu berechnet (weil er ja auf CLK sensitiv
ist). Bei der steigenden Flanke wird an temp_count der neu berechnete
Wert zugewiesen, an DOUT aber noch der "alte" Wert von temp_count. Du
könntest diesen Prozess also mit exakt selber Funktion auch so
schreiben:
1 | count: process(CLK)
|
2 | begin
|
3 |
|
4 | DOUT <= temp_count; -- völlig schnuppe, ob das hier steht, ......
|
5 |
|
6 | if CLK'event and CLK = '1' then
|
7 | if RESET = '1' then
|
8 | temp_count <= (others => '0');
|
9 | elsif INC = "00" then
|
10 | temp_count <= temp_count +1;
|
11 | elsif INC = "01" then
|
12 | temp_count <= temp_count +2;
|
13 | elsif INC = "10" then
|
14 | temp_count <= temp_count +3;
|
15 | else temp_count <= temp_count +4;
|
16 | end if;
|
17 | end if;
|
18 |
|
19 | DOUT <= temp_count; -- ......oder hier!!!
|
20 |
|
21 | end process count;
|
Und bei der nächsten fallenden Flanke wird der Prozess dann in der
Simulation neu berechnet, und voila: DOUT bekommt den "neuen"
Zählerwert.
FAZIT: eine falsche Sensitvliste führt zu Unstimmigkeiten zwischen
Simulation und Realität!
Andreas B. schrieb:
> Oder aber die Zuweisung an DOUT außerhalb des process machen. Das
> entspricht einem ungetakteten Verbinden von temp_count mit DOUT
In der VHDL Termiiniologie nennt sich das concurrent assignment (zu
deutsch: nebenläufige Zuweisung, wbobei hier "nebenläufig" nicht als
"minderwertig, nachrangig" missverstanden werden sollte). Wahrscheinlich
sollte es so aussehen:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.STD_LOGIC_unsigned.all;entity BX55 is
|
4 |
|
5 | port( CLK, RESET: in bit;
|
6 | INC: in bit_vector(1 downto 0);
|
7 | DOUT: out std_logic_vector(3 downto 0));
|
8 | end BX55;
|
9 |
|
10 | architecture rtl of BX55 is
|
11 | signal temp_count: std_logic_vector(3 downto 0);
|
12 | begin
|
13 |
|
14 | count: process(CLK)
|
15 | begin
|
16 | if CLK'event and CLK = '1' then
|
17 | if RESET = '1' then
|
18 | temp_count <= (others => '0');
|
19 | elsif INC = "00" then
|
20 | temp_count <= temp_count +1;
|
21 | elsif INC = "01" then
|
22 | temp_count <= temp_count +2;
|
23 | elsif INC = "10" then
|
24 | temp_count <= temp_count +3;
|
25 | else temp_count <= temp_count +4;
|
26 | end if;
|
27 | end if;
|
28 | end process count;
|
29 |
|
30 | DOUT <= temp_count; -- ohne Prozess: concurrent assignment
|
31 |
|
32 | end rtl;
|
BTW: der Name temp-count ist ungünstig gewählt, weil an diesem signal
überhaupt nichts temporär ist. Vielmehr ist genau dieses Signal dein
Zähler, der dann nur noch mit dem Ausgang verbunden wird.
test_1 schrieb:
> [\vhdl]
Ein / statt eines \ wirkt hier Wunder...