Es klingt, als ob Sie eine transport
Verzögerung verwenden möchten. Standardmäßig, wenn Sie eine verzögerte Zuordnung machen, wird dies verwenden, um ein ‚träge‘ Verzögerungsmodell:
my_sig_delayed <= my_sig after 100 ns;
jedoch mit diesem Beispiel, wenn Ihr Signal mehr als einmal schaltet in 100 ns, Ihr my_sig_delayed
Signal nicht folgen so wie Sie es erwarten können. Mit einer Verzögerung von transport
replizieren Sie eine "Verzögerungslinie".
my_sig_delayed <= transport my_sig after 100 ns;
Für eine ausführlichere Erklärung, versuchen Sie diese http://www.gmvhdl.com/delay.htm
Eine Alternative ein Schieberegister mit einer Länge von was auch immer Sie brauchen Verzögerung zu verwenden wäre:
signal delay_line : std_logic_vector(255 downto 0) := (others => '0');
.. .
process (clk)
begin
if (rising_edge(clk)) then
delay_line <= delay_line(delay_line'left-1 downto 0) & my_sig;
end if;
end process;
my_sig_delayed <= delay_line(delay_line'left);
Danke fo r die Erklärungen. In der Tat habe ich den ersten Weg ausprobiert, der für mich offensichtlich war, aber da meine Signalperiode kürzer ist als die Verzögerung, konnte es nicht funktionieren. Wenn es keinen anderen Weg gibt, werde ich die zweite Option verwenden. –
@ A.Kieffer sollte es funktionieren, wenn Sie das 'transport' Schlüsselwort für die zweite Zeile des obigen Codes verwenden. –
Entschuldigung, ich habe den Punkt auf den ersten Blick nicht verstanden. Ich habe 'transport' versucht und es funktioniert gut. Danke @scarry_jeff! –