Wie kann ich Herstellerunabhängig Blockram in VHDL beschreiben? Leider muss ich die Frage nochmal anbringen. Da ich es nicht richtig sicher hin bekommen.
http://vhdlguru.blogspot.de/2011/01/block-and-distributed-rams-on-xilinx.html Sollte von den meisten Synthesetools als Block-Ram erkannt werden
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; |
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
Was gibt es denn eigentlich für einen Vorteil, so ein RAm zu nehmen, statt einen fertigen Core?
Portierbarkeit. Denn sonst könnte man auch jedes einzelne Gatter und jedes Flipflop von Hand instantiieren und verdrahten...
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.
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 ; |
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.
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.
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'.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.