VHDL: Signal um beliebige Takte verzögern

Gast #297295
Lesenswert?

Hallo,

ich möchte ein signal um einen Takt verzögern. Meine Lösung dazu ist
folgende, die auch wunderbar funktioniert:

Delay:process(clk)
begin
if rising_edge(clk) then
     signal_verzögert <= signal;
end if;
end process;

Nun möchte ich das Signal nicht um einen Takt, sondern um mehrer Takte
verzögern. Benötige ich dann mehrere Prozesse, oder kann man das
idealerweise in diesem Delay-prozess mitrealisieren ? Falls ja, wie ???
Gast #297296
Lesenswert?

Hallo Thorsten,

mehrere Prozesse sind nicht nötig. Du brauchst nur mehrere Signale. Das
ganze sieht dann so aus (z.b. 4 Takte) :

signal sig_z1 : std_logic;
signal sig_z2 : std_logic;
signal sig_z3 : std_logic;
signal sig_z4 : std_logic;

process (clk, ...)
...
  if rising_edge(clk) then
  begin
    sig_out <= sig_z4;
    sig_z4  <= sig_z3;
    sig_z3  <= sig_z2;
    sig_z2  <= sig_z1;
    sig_z1  <= signal;
  end if;

...

Wenn die Verzögerung variabel bzw. programmierbar sein soll, nimmst du
einfach einen multiplexer (case-anweisung) dazu.

Gruß
Rene
Gast #297297
Lesenswert?

... oder so :

constant DELAY    : positive := 5;  -- fix 5 Takte Delay
signal delay_line : std_logic_vector(DELAY-1 downto 0);

process(clk)
begin
   if rising_edge(clk) then
      delay_line <= delay_line(DELAY-2 downto 0) & signal;
   end if;
end process;

sig_out <= delay_line(DELAY-1);
#1563802
Lesenswert?

TheMason schrieb:
> Hallo Thorsten,
>
> mehrere Prozesse sind nicht nötig. Du brauchst nur mehrere Signale. Das
> ganze sieht dann so aus (z.b. 4 Takte) :
>
> signal sig_z1 : std_logic;
> signal sig_z2 : std_logic;
> signal sig_z3 : std_logic;
> signal sig_z4 : std_logic;
>
> process (clk, ...)
> ...
>   if rising_edge(clk) then
>   begin
>     sig_out <= sig_z4;
>     sig_z4  <= sig_z3;
>     sig_z3  <= sig_z2;
>     sig_z2  <= sig_z1;
>     sig_z1  <= signal;
>   end if;
>
> ...
>
> Wenn die Verzögerung variabel bzw. programmierbar sein soll, nimmst du

Bei mir funktioniert diese Lösung nicht, die Zwischensignale werden alle 
wegoptimiert wie ich im editor sehe.
Ich habe es folgendermassen versucht:

signal delay_I_1 : std_logic_vector(13 downto 0);
signal delay_I_2 : std_logic_vector(13 downto 0);
signal delay_I_3 : std_logic_vector(13 downto 0);

Delay:
process(clk_Filt_100M)
begin
  if(RST <= '0') then
  delay_I_1 <= "00000000000000";
  delay_I_2 <= "00000000000000";
  delay_I_3 <= "00000000000000";
else
  delay_I_3 <= delay_I_2;
  delay_I_2 <= delay_I_1;
  delay_I_1 <= signal_I;
end if;
end process;

I_out_Reg <= delay_I_3;


Kann jemand helfen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren