Hallo!
Ich versuche gerade zu Übungszwecken ein bereits programmiertes Filter
etwas zu optimiernen.
In der vorherigen Version werden D-FF als Verzögerungsspeicher des
Eingangssignals x(n) eingesetzt.
Nun sollen die FF-Speicher in der neue Version durch einen RAM-Speicher
ersetzt werden. Das speichern der Eingangswerte funktioniert auch soweit
einwandfrei.
Mein Problem liegt nun darin, dass die gespeicherten Signale für spätere
Auswertungen "verschoben" werden sollen, also quasi wie bei den
vorherigen FFs sollen also alle Speicherelemente bei jedem Takt
verschoben werden.
Nun bietet es sich wahrscheinlich nicht an alle RAM-Elemente zu
verschieben. Ist es möglich dies über die Adresse zu regeln?
Das RAM wird bereits über einen Adresszähler angesprochen, der dafür
sorgt, wenn der Speicherbereich voll ist, erneut wieder auf das erste
RAM-Element geschrieben wird.
Hoffe mal die Erklärung ist verständlich ;)
Würde mich über jede Hilfe freuen....
Gruß Peter
Hier der Code:
1 | type RAM_TYPE is array (0 to RAM_length-1) of std_logic_vector(7 downto 0);
|
2 | signal RAM: RAM_TYPE := (others=>"00000000");
|
3 |
|
4 | signal addr_cnt: integer range 0 to 7;
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | type ary is array(0 to (RAM_length-1)) of signed(bit_width-1 downto 0);
|
10 | signal data_out_buffer : ary;
|
11 |
|
12 | begin
|
13 |
|
14 | DO_RAM: process(clk)
|
15 | begin
|
16 | if rising_edge(clk) then
|
17 | if en='1' then -- falls RAM freigegeben
|
18 | if we = '1' then -- SCHREIBEN
|
19 | RAM(addr_cnt) <= din;
|
20 | end if;
|
21 | end if;
|
22 | end if;
|
23 | end process DO_RAM;
|
24 |
|
25 | dout<=RAM(conv_integer(addr)); -- ASYNCHRONES LESEN
|
26 |
|
27 |
|
28 | COUNT_ADDR: process(clk)
|
29 | begin
|
30 | if rst = '1' then
|
31 | addr_cnt<=0;
|
32 | elsif rising_edge(clk) then
|
33 | if addr_cnt<=RAM_length-2 then
|
34 | addr_cnt<=addr_cnt+1;
|
35 | else
|
36 | addr_cnt<=0;
|
37 | end if;
|
38 | end if;
|
39 | end process COUNT_ADDR;
|