Daniel P. schrieb:
ich würde gerne in VHDL ein n-Stufiges Flip Flop erzeugen,
Du willst aus mehreren Flipflops ein n-stufiges Schieberegister erzeugen, oder? Und über dieses Schieberegister willst du ein Signal um n Takte verzögern.
wobei ich den Parameter n über ein generic weitergeben wollte.
Das geht für 1 Bit einfach so:
1 |
:
|
2 |
generic n : integer range 2 to 16 := 2;
|
3 |
:
|
4 |
:
|
5 |
signal sr: std_logic_vector (n-1 downto 0)
|
6 |
:
|
7 |
sr <= sr(n-2 downto 2) & inbit when rising_edge(clk); -- schiebt nach links
|
8 |
:
|
9 |
outbit <= sr(n-1);
|
10 |
:
|
Und für Vektoren geht es in etwa so:
1 |
:
|
2 |
generic n : integer := 2;
|
3 |
:
|
4 |
type slv16_array is array (n-1 downto 0) of std_logic_vector(15 downto 0);
|
5 |
signal vsr : slv16_array := (others => (others => '0'));
|
6 |
:
|
7 |
vsr <= vsr(n-2 downto 2) & invect when rising_edge(clk); -- liest ein und schiebt nach links
|
8 |
outvect <= vsr(n-1);
|
9 |
:
|
Wenn die Länge des Schieberegisters zur Laufzeit umgeschaltet werden soll, dann sieht es für 1 Bit so aus:
1 |
:
|
2 |
signal n : integer range 2 to 16 := 2; -- min. 2 Bit, max. 16 Bit lang
|
3 |
signal sr: std_logic_vector (15 downto 0); -- muss für maximale Länge ausgelegt sein
|
4 |
:
|
5 |
sr <= sr(n-2 downto 2) & inbit when rising_edge(clk); -- schiebt nach links
|
6 |
:
|
7 |
outbit <= sr(n-1);
|
8 |
:
|
Die Schieberegister-Zeile mit dem "when rising_edge()" kann man natürlich auch auf die lange Art mit einem Prozess schreiben:
1 |
process begin
|
2 |
wait until rising_edge(clk);
|
3 |
sr <= sr(n-2 downto 2) & inbit; -- schiebt nach links
|
4 |
end process;
|
Oder die traditionelle, ganz ausführliche Art aus dem letzten Jahrtausend:
1 |
process (clk)
|
2 |
begin
|
3 |
if rising_edge(clk) then
|
4 |
sr <= sr(n-2 downto 2) & inbit; -- schiebt nach links
|
5 |
end if;
|
6 |
end process;
|
also anscheinend mehrere Quellen für das Signal.
Für welches Signal?