Habe es mal rauskopiert und entschärft. So sieht der Code aus:
1 | input: process (reset, clk)
|
2 | begin
|
3 | if (reset = '1') then
|
4 | instream <= (others => '1');
|
5 | wen <= '0';
|
6 | error <= '0';
|
7 | elsif rising_edge(clk) then
|
8 | if (localreset = '1') then
|
9 | instream <= (others => '1');
|
10 | wen <= '0';
|
11 | error <= '0';
|
12 | elsif (data_new = '1') then -- new data coming
|
13 | if (ram_full = '1') then -- ok to write ?
|
14 | instream <= (others => '1');
|
15 | wen <= '0';
|
16 | error <= '1';
|
17 | else -- ram not full, write !
|
18 | if (test = '1') then -- select data
|
19 | instream <= test_data;
|
20 | else
|
21 | instream <= datainput;
|
22 | end if;
|
23 | wen <= '1';
|
24 | error <= '0';
|
25 | end if;
|
26 | else -- no local reset
|
27 | instream <= (others => '1');
|
28 | wen <= '0';
|
29 | end if;
|
30 | end if;
|
31 | end process input;
|
Sowohl instream als auch wen wechseln mit der Taktflanke, wenn auch das
data_new ändert und nicht, wenn es bereits 1 war, also einen Takt
später- Ich sehe nur noch nicht, ob es nicht das datanew ist, das zu
spät dargestellt wird.
Die Reaktion auf den localreset funktioniert, wie erwartet: localreset
geht auf 1, die Signale bleiben und wechseln erst zur nächsten
Taktflanke auf Startzustand. Auch der asynchrone Reset läuft. Dieser
kommt, wie auch das localreset und der clk aus der testbench, während
das datanew aus einer anderen Schaltung produziert wird. Das sieht aber
logisch und korrekt aus. (?)