Forum: FPGA, VHDL & Co. BLOCKRAM VHDL Beschreibung


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Wie kann ich Herstellerunabhängig  Blockram in VHDL beschreiben?

Leider muss ich die Frage nochmal anbringen. Da ich es nicht richtig 
sicher hin bekommen.

von user (Gast)


Lesenswert?

http://vhdlguru.blogspot.de/2011/01/block-and-distributed-rams-on-xilinx.html

Sollte von den meisten Synthesetools als Block-Ram erkannt werden

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

1
--Vorschlag aus dem verlinkten Beitrag
2
PROCESS(Clk)
3
BEGIN
4
    if(rising_edge(Clk)) then
5
        if(we='1') then
6
            ram(address) <= data_i;
7
        end if;
8
        data_o <= ram(address);
9
    end if;
10
END PROCESS;

Ich habe es fast genau so. Lediglich dass ich noch eine if Bedingung 
habe, welches RAM aktiv ist.
1
 process(BCLK) 
2
   begin
3
     if rising_edge(BCLK) then
4
       if BBUS_IN.BSEL(0)='1' and BBUS_IN.Bactive='1' then
5
         BRDATA<= IRAM_BLOCK0 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
6
               &IRAM_BLOCK1 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
7
               &IRAM_BLOCK2 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
8
               &IRAM_BLOCK3 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))));
9
       else
10
         BRDATA<= RAM_BLOCK0 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
11
               &RAM_BLOCK1 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
12
               &RAM_BLOCK2 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
13
               &RAM_BLOCK3 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))));
14
       end if;
15
     end if;
16
   end process;

von berndl (Gast)


Lesenswert?

das ist ganz sicher nicht "fast genau so"...

Du hast kein echtes 'write enable', da du ja in jedem Fall schreibst 
(entweder im if oder im else Zweig) und das in der Bedingung erst heraus 
kodierst.

Zieh' mal die ganzen Multiplexer aus dem Prozess raus, so dass nur noch 
die BRAM Beschreibung von oben im Prozess steht. Dann muss das 
eigentlich bei allen mir bekannten Tools (X, A, L) funktionieren

von Falk B. (falk)


Lesenswert?


von fragi (Gast)


Lesenswert?

Was gibt es denn eigentlich für einen Vorteil, so ein RAm zu nehmen, 
statt einen fertigen Core?

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


Lesenswert?

Portierbarkeit.
Denn sonst könnte man auch jedes einzelne Gatter und jedes Flipflop von 
Hand instantiieren und verdrahten...

von Christian R. (supachris)


Lesenswert?

Außerdem sind 5 Zeilen VHDL meiner Meinung nach besser und schneller 
lesbar als ein IP Core, den ich erst mit dem Core Editor öffnen muss. 
Revisionskontrolle mit SVN o.ä. ist auch besser machbar.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Es frisst auch jeder Simulator.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Lösung des Problems. So wandert es in den Blockram
1
   process(BCLK) 
2
   begin
3
     if rising_edge(BCLK) then
4
       
5
         IRAM_OUT<= IRAM_BLOCK0 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
6
               &IRAM_BLOCK1 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
7
               &IRAM_BLOCK2 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
8
               &IRAM_BLOCK3 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))));
9
       
10
         DRAM_OUT<= RAM_BLOCK0 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
11
               &RAM_BLOCK1 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
12
               &RAM_BLOCK2 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))))
13
               &RAM_BLOCK3 (to_integer(unsigned( BBUS_IN.BADDR(addresswidth-1 downto 2))));
14
       
15
     end if;
16
   end process; 
17
18
19
   BBUS_OUT.BRDATA<=IRAM_out when (BBUS_IN.BSEL(0)='1' and BBUS_IN.Bactive='1') else DRAM_OUT ;

von fragi (Gast)


Lesenswert?

Lothar M. schrieb:
> Portierbarkeit.
> Denn sonst könnte man auch jedes einzelne Gatter und jedes Flipflop von
> Hand instantiieren und verdrahten...

Ich mache die Block-Rams immer mit einem VHDL-Instanz rein. Copy und 
Paste. Geht bei Lattice und Xilinx gleichermassen.

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


Lesenswert?

fragi schrieb:
> Geht bei Lattice und Xilinx gleichermassen.
Aber eben nicht mit der selben Instantiierung...

Und sogar vom selben Hersteller gibts je nach Familie unterschiedliche 
Templates.

von mhm (Gast)


Lesenswert?

Wir haben uns für Blockrams einfach Wrapper gebaut. Dann kann man die im 
gesamten Design immer gleich instanziieren und wenn man mal den 
FPGA-Hersteller oder sogar nur die Familie innerhalb eines Herstellers 
wechseln sollte, gibt es genau eine Stelle (im Wrapper), wo man etwas 
ändern muss (anderen Blockram instanziieren).

Damit erreicht man einen schönen Tradeoff zwischen Portierbarkeit und 
'das Synthese-Tool macht, was ich will'.

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


Lesenswert?

mhm schrieb:
> Damit erreicht man einen schönen Tradeoff
Zudem kann man für den Simulator ein schnelles generisches VHDL-RAM 
verwenden, und muss nicht unbedingt ein herstellerspezifisches Modell 
mitsimulieren...

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.