Hallo zusammen,
ich habe den folgenden VHDL-Code (etwas vereinfacht!).
1 | check_data : PROCESS (CLK, NRES)
|
2 | BEGIN
|
3 | IF NRES = '0' THEN
|
4 | s_check_signal <= (OTHERS => '0');
|
5 | ...
|
6 | ELSIF rising_edge(CLK) THEN
|
7 | s_check_signal <= CHECK_INPUT;
|
8 | ...
|
9 | END IF;
|
10 | ...
|
11 | END PROCESS check_data;
|
12 |
|
13 | ...
|
14 |
|
15 | s_check_signal_mod <= s_check_signal WHEN ERROR_IN = '0' ELSE (OTHERS => '1');
|
16 |
|
17 | s_comparator(0) <= '1' WHEN s_check_signal_mod = CFG_IN_2 ELSE '0';
|
18 | s_comparator(1) <= '1' WHEN s_check_signal_mod = CFG_IN_1 ELSE '0';
|
19 |
|
20 | s_valid <= '0' WHEN or_reduce(s_comparator) = '1' ELSE '1';
|
21 |
|
22 | VALID <= s_valid;
|
Ich habe also einen getakteten Prozess, in dem ich das Signal
s_check_signal aktualisiere.
Dieses Signal wird dann in kombinatorischer Logik verschaltet und dann
mit den statischen Inputs (CFG_IN_1/2) vergleichen und daraufhin das
VALID-flag erzeugt.
Nun habe ich in der Simulation das oben gezeigte Bild.
Zu sehen ist ein kurzer Peak im Valid Signal der genau dann entsteht,
wenn s_check_signal aktualisiert wird. Der Peak ist 0ps lang, wird also
auch bei maximaler Zoom-Stufe nicht breiter.
Woher kommt dieser Peak?
Ich denke Modelsim ist eine funktionale Simulation, in der die
Laufzeiten im Gatter keine Rolle spielen? Auch wenn ich mir nicht
erklären kann, wieso an dieser Stelle Laufzeiten eine Rolle spielen
sollten, denn zu jederzeit ist ja erfüllt, dass VALID = '0' sein sollte.
Vor und nach der entscheidenden Taktflanke sollte VALID eigentlich '0'
sein, aber zur Flanke wird es kurz '1'. Vor der Flanke ist
s_check_signal "00000010". Das verstehe ich nicht ganz.
Kann mir jemand eine Erklärung dazu geben?
Vielen Dank!
Tom