also da steig ich noch nicht dahinter ....
hier mal ein Auszug aus meinem Code
1 | signal DATA : std_logic_vector(15 downto 0) ;
|
2 | .
|
3 | .
|
4 | process(DATA,ACK, ... )
|
5 | .
|
6 | .
|
7 | when DATA_H => ADDR <= "0";
|
8 | if ACK = '1' then
|
9 | DATA(15 downto 8) <= DATA_IN;
|
10 | end if;
|
11 | when DATA_L => ADDR <= "0";
|
12 | if ACK = '1' then
|
13 | DATA(7 downto 0) <= DATA_IN;
|
14 | end if;
|
15 | when START => DATA_OUT <= DATA;
|
16 | .
|
17 | .
|
18 | .
|
ich hab eine Stae Machine mit 3 Prozesse gemacht, das ist ein Auszug
aus dem dritten Prozess (nicht getaktet)
es könnne 8 bit gelesenen werden, mit ACK wird mitgeteilt das dier
richtigen daten am eingang anliegen.
es sollen zwei byte gelesen werden und dann als 16 bit wort
weitergegeben werden. (in state START)
.. also für obenigen code entsteht für DATA ein Latch. ( bzw 16 1 bit
Latches )
ok das verstehe ich da es bei if der else zweig fehlt...
also erte möglichkeit : else zweig einfügen
1 | signal DATA : std_logic_vector(15 downto 0) ;
|
2 | .
|
3 | .
|
4 | process(DATA,ACK, ... )
|
5 | .
|
6 | .
|
7 | when DATA_H => ADDR <= "0";
|
8 | if ACK = '1' then
|
9 | DATA(15 downto 8) <= DATA_IN;
|
10 | else DATA <= DATA ;
|
11 | end if;
|
12 | when DATA_L => ADDR <= "0";
|
13 | if ACK = '1' then
|
14 | DATA(7 downto 0) <= DATA_IN;
|
15 | else DATA <= DATA ;
|
16 | end if;
|
17 | when START => DATA_OUT <= DATA;
|
18 | .
|
19 | .
|
20 | .
|
zweite Möglichkeit : DATA vorbelegen
1 | signal DATA : std_logic_vector(15 downto 0) ;
|
2 | .
|
3 | .
|
4 | process(DATA,ACK, ... )
|
5 | .
|
6 | DATA <= DATA ;
|
7 | .
|
8 | case xx is
|
9 | .
|
10 | .
|
11 | when DATA_H => ADDR <= "0";
|
12 | if ACK = '1' then
|
13 | DATA(15 downto 8) <= DATA_IN;
|
14 | end if;
|
15 | when DATA_L => ADDR <= "0";
|
16 | if ACK = '1' then
|
17 | DATA(7 downto 0) <= DATA_IN;
|
18 | end if;
|
19 | when START => DATA_OUT <= DATA;
|
20 | .
|
21 | .
|
22 | .
|
es wird bei beiden möglichkeiten ein Latch erzeugt ....
jetzt bin ich verwirrt ....
Damit wird kein Latch erzeugt, aber die funktionsweise ist auch nciht
die von mir gewünschte, oder ?
schließtlich wird bit 7..0 im ersten state geladen,
wenn der Prozess wieder aufgerufen wird um bit 15-8 zu laden werden bit
7..0 zu '0' ..... :-(
1 | signal DATA : std_logic_vector(15 downto 0) ;
|
2 | .
|
3 | .
|
4 | process(DATA,ACK, ... )
|
5 | .
|
6 | DATA <= (others => '0');
|
7 | .
|
8 | case xx is
|
9 | .
|
10 | .
|
11 | when DATA_H => ADDR <= "0";
|
12 | if ACK = '1' then
|
13 | DATA(15 downto 8) <= DATA_IN;
|
14 | end if;
|
15 | when DATA_L => ADDR <= "0";
|
16 | if ACK = '1' then
|
17 | DATA(7 downto 0) <= DATA_IN;
|
18 | end if;
|
19 | when START => DATA_OUT <= DATA;
|
20 | .
|
21 | .
|
22 | .
|