BLOCKRAM VHDL Beschreibung

OP (Firma: www.dossmatik.de) #4555139
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;
Gast #4555156
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
OP (Firma: www.dossmatik.de) #4556961
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 ;
Gast #4559058
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'.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren