mikrocontroller.net

Forum: FPGA, VHDL & Co. Quartus dual-port asynchronous RAM


Autor: Erik W. (exor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

für ein Projekt benötige ich einen true dual port asynchronous ram. Da 
das ganze auf verschiedenen Plattformen (Xilinx, Altera, Lattice) laufen 
soll, muss der RAM-Block über Inferenz vom Synthesetool erzeugt werden.

folgenden VHDL-Code habe ich dazu genutzt:
--
-- Dual-Port Block RAM with Two Write Ports
--

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity TDPR is
  generic(  width  :  natural := 16;
        depth :  natural := 6);
      
    port  (  clka  :   in   std_logic;
        clkb  :   in   std_logic;
        ena   :  in   std_logic;
        enb   :  in   std_logic;
        wea   :  in   std_logic;
        web   :  in   std_logic;
        rsta  :  in   std_logic;
        rstb  :  in   std_logic;
        addra :  in   std_logic_vector(depth-1 downto 0);
        addrb :  in   std_logic_vector(depth-1 downto 0);
        dia   :  in   std_logic_vector(width-1 downto 0);
        dib   :  in   std_logic_vector(width-1 downto 0);
        doa   :  out   std_logic_vector(width-1 downto 0);
        dob   :  out   std_logic_vector(width-1 downto 0));
end TDPR;

architecture syn of TDPR is
    type ram_type is array ((2**depth)-1 downto 0) of std_logic_vector(width-1 downto 0);
    shared variable RAM : ram_type;
begin
    process(CLKA)
    begin
        if CLKA'event and CLKA = '1' then
            if ENA = '1' then
                if WEA = '1' then
                    RAM(conv_integer(ADDRA)) := DIA;
                end if;
               if  rsta  =  '1'  then               --  optional  reset
             doa  <=  (others  =>  '0');
           else
             doa  <=  ram(conv_integer(addra))  ;
           end  if;
            end if;
        end if;
    end process;
   
    process (CLKB)
    begin
        if CLKB'event and CLKB = '1' then
            if ENB = '1' then
                if WEB = '1' then
                    RAM(conv_integer(ADDRB)) := DIB;
                end if;
                if  rstb  =  '1'  then               --  optional  reset
             dob  <=  (others  =>  '0');
           else
             dob  <=  ram(conv_integer(addrb))  ;
           end  if;
        end if;
    end if;
    end process;
end syn;

Das ganze wird von Xilinx ISE auch wie gewünscht umgesetzt. Quartus 
hingegen spuckt mir die Fehlermeldung "Error: Cannot synthesize 
dual-port RAM logic "TDPR:inst|RAM"" mit einem internal Error aus, 
scheinbar kann Quartus die shared variable RAM nicht korrekt umsetzen.
Hat jemand damit schon Erfahrungen? Gibt es vllt ne andere Möglichkeit 
den RAM-Block zu beschreiben?


mit besten Grüßen, exor

Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja du kannst 3 verschiedene vhdl-files verwenden und da jeweils direkt 
das ram instanziieren

Autor: Erik W. (exor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das problem ist ja, dass sich die vhdl beschreibung im quartus nicht 
synthetisieren lässt.

Autor: sunny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

in der altera KB steht eine lösung für das problem

http://www.altera.com/support/kdb/solutions/rd1119...

hast du das schon probiert?

gruß sunny

Autor: Erik W. (exor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt rausgefunden, dass quartus keine inferenz von asynchronem ram 
unterstützt.

gruß exor

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.