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 ???
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
... 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);
Also eine einfache Flip-Flop-Kette oder ein Schieberegister. Damit man sich das auch mal vorstellen kann. :-) ciao, Stefan.
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?
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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.