Forum: FPGA, VHDL & Co. VHDL: Signal um beliebige Takte verzögern


von Thorsten (Gast)


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 ???

von TheMason (Gast)


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

von FPGA-User (Gast)


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);

von Stefan M. (Gast)


Lesenswert?

Also eine einfache Flip-Flop-Kette oder ein Schieberegister.

Damit man sich das auch mal vorstellen kann. :-)

ciao, Stefan.

von Reto B. (schnuber)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Da fehlt ja auch ein Takt:
1
if(RST <= '0') then
2
  delay_I_1 <= "00000000000000";
3
  delay_I_2 <= "00000000000000";
4
  delay_I_3 <= "00000000000000";
5
else   ------------- hier sollte wohl ein Takt rein....
6
  delay_I_3 <= delay_I_2;
7
  delay_I_2 <= delay_I_1;
8
  delay_I_1 <= signal_I;
9
end if;

von Reto B. (schnuber)


Lesenswert?

räusper... TEST,TEST

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.