Forum: FPGA, VHDL & Co. RAM shiften - Ersetzen der D-FFs durch RAM


von Peter (Gast)


Lesenswert?

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;

von Uwe (Gast)


Lesenswert?

Nen Addierer bzw. Subtrahierer an den Adressbus

von Peter (Gast)


Lesenswert?

Danke Uwe, aberhilft mir auch nicht wirklich.

Und es hat sich ein neues Problem ergeben:
Es soll auf alle "N" Registerinhalte gleichzeitig zugegriffen werden 
können. Lässt sich sowas überhaupt in einem RAM umsetzen?

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


Lesenswert?

Peter schrieb:
> Es soll auf alle "N" Registerinhalte gleichzeitig zugegriffen werden
> können.
Zeig mir ein RAM, das mehrere Datenwortausgänge hat...  :-o

> Lässt sich sowas überhaupt in einem RAM umsetzen?
Nur wenn mehrere RAMs parallelgeschaltet sind...

Also solltest du dich fragen:
"Warum brauche gerade ich was, was andere nicht brauchen?"

von Valko Z. (hydravliska)


Lesenswert?

Das gleiche habe ich gestern auch versucht, ein FIR filter mit 
generische Anzahl von Multiplizierer.

Dabei muss man soviel RAM Elemente haben wie der Anzahl der 
Multiplizierer um eben die Daten gleichzeitig holen zu können.

Aber wie man die richtige Adresse generiert bin ich immer noch am 
überlegen :)

Gruss,
Valentin

von Peter (Gast)


Lesenswert?

Ok Lothar, sehe ich ein.

Sollte man also doch am besten mit FFs arbeiten, oder sind die 
parallelen RAMs doch noch effizienter?

von bko (Gast)


Lesenswert?

Kannst du die Filterwerte nicht nacheinander berechnen ?

von QuadPort (Gast)


Lesenswert?

Lothar Miller schrieb:
>Zeig mir ein RAM, das mehrere Datenwortausgänge hat...  :-o

-> Quad-Port Distributed RAM
     RAM64M

http://www.xilinx.com/support/documentation/user_guides/ug384.pdf

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.