M
Mathias Weierganz
Guest
Hallo,
ich verwende hier einen XILINX-Coolrunner XCR3064XL.
Es soll eine Art digitales, nicht retriggerbares Monoflop
realisiert werden, dessen Start natuerlich um die Taktperiode
jittert.
Ausschnitt aus dem VHDL-Code:
start ist das Eingangssignal, clk der dazu asynchrone Takt,
run zeigt an, dass die Zeit laeuft, bloc verhindert das
Retriggern, wenn start nach Ablauf der Zeit noch high sein
sollte.
process (clk)
begin
if (rising_edge(clk)) then
if (start = '1') and (run = '0') and (bloc = '0') then
run <= '1';
end if;
if (run = '1') then -- zähle delay runter
delay_cnt <= delay_cnt - 1;
bloc <= '1';
end if;
if (delay_cnt = "0000000000") then
run <= '0';
delay_cnt <= delay_time;
end if;
if (start = '0') then
bloc <= '0'; -- Blockadesignal wird erst geloest,
-- wenn start wieder low ist
end if;
end if;
end process;
Normales timing sieht so aus:
clk --__--__--__--__--__--__--__--__--__--
start _____--------------------------______
run ________------------_________________
bloc ____________--------------------_____
Durch Erreichen eines metastabilen Zustandes des run-Flip-Flops
passiert es manchmal, dass das bloc-Signal kommt, obwohl das
run-Signal low ist. In diesem Fall geht mir ein Trigger-Ereignis
verloren
Weiss jemand, wie man so etwas verhindern kann?
Mathias Weierganz
ich verwende hier einen XILINX-Coolrunner XCR3064XL.
Es soll eine Art digitales, nicht retriggerbares Monoflop
realisiert werden, dessen Start natuerlich um die Taktperiode
jittert.
Ausschnitt aus dem VHDL-Code:
start ist das Eingangssignal, clk der dazu asynchrone Takt,
run zeigt an, dass die Zeit laeuft, bloc verhindert das
Retriggern, wenn start nach Ablauf der Zeit noch high sein
sollte.
process (clk)
begin
if (rising_edge(clk)) then
if (start = '1') and (run = '0') and (bloc = '0') then
run <= '1';
end if;
if (run = '1') then -- zähle delay runter
delay_cnt <= delay_cnt - 1;
bloc <= '1';
end if;
if (delay_cnt = "0000000000") then
run <= '0';
delay_cnt <= delay_time;
end if;
if (start = '0') then
bloc <= '0'; -- Blockadesignal wird erst geloest,
-- wenn start wieder low ist
end if;
end if;
end process;
Normales timing sieht so aus:
clk --__--__--__--__--__--__--__--__--__--
start _____--------------------------______
run ________------------_________________
bloc ____________--------------------_____
Durch Erreichen eines metastabilen Zustandes des run-Flip-Flops
passiert es manchmal, dass das bloc-Signal kommt, obwohl das
run-Signal low ist. In diesem Fall geht mir ein Trigger-Ereignis
verloren
Weiss jemand, wie man so etwas verhindern kann?
Mathias Weierganz