Ich habe das nochmal durchgeknetet.
Mit einer restlos durch 2 teilbaren Taktfrequenz wird beim Originalcode
1 | clock_process: process begin
|
2 | clk <= '0';
|
3 | wait for clock_period/2;
|
4 | clk <= '1';
|
5 | wait for clock_period/2;
|
6 | end process;
|
7 |
|
8 |
|
9 | stim_proc: process begin
|
10 | wait until clk = '1';
|
11 | reset <= '1';
|
12 | wait for clock_period;
|
13 | reset <= '0';
|
14 | :
|
15 | end process;
|
der Reset genau zur steigenden Flanke von clk inaktiv. Der Prozess,
der clk auswertet, sieht dann bereits eine '0' und wird den reset
nicht mehr bearbeiten.
Mit 1 ps mehr
1 | stim_proc: process begin
|
2 | :
|
3 | reset <= '1';
|
4 | wait for clock_period + 1 ps;
|
5 | reset <= '0';
|
6 | :
|
7 | end process;
|
ist der reset bei der Flanke noch aktiv und er wird ausgeführt.
Mit einer ungeraden Taktfrequenz ergibt sich der oben beschriebene
Effekt
1 | 2*(clock_period/2) < clock_period
|
allerdings mit dem Vorteil, dass clock_period dadurch automatisch 1 ps
länger ist, und damit der Reset erkannt wird.
Funktionieren würde also
1.
1 | stim_proc: process begin
|
2 | wait until clk = '1';
|
3 | reset <= '1';
|
4 | wait for clock_period + 1 ps;
|
5 | reset <= '0';
|
6 | :
|
7 | end process;
|
2.
1 | stim_proc: process begin
|
2 | wait until clk = '1';
|
3 | reset <= '1';
|
4 | wait until clk = '1';
|
5 | reset <= '0';
|
6 | :
|
7 | end process;
|
3.
1 | stim_proc: process begin
|
2 | wait until clk = '0';
|
3 | reset <= '1';
|
4 | wait for clock_period;
|
5 | reset <= '0';
|
6 | :
|
7 | end process;
|
Wobei die 3. Lösung einen Takt Latency ins Spiel bringt. Am saubersten
und formal richtig ist in einem synchronen Design die 2. Lösung.