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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.