www.mikrocontroller.net

Forum: FPGA, VHDL & Co. quartus, vhdl und blockram


Autor: sunny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
servus

gibt es eigendlich in quartus die möglichkeit ein ram in vhdl zu 
beschreiben was dann im EAB und nicht in den LE's erzeugt wird? Ich hab 
nur die möglichkeit gefunden eine ram komponente mit dem megawizard zu 
erstellen und die dann ins desigen einzubinden. Das kann doch aber nicht 
die ultimative lösung sein. Zumal es bei xilinx ja auch über vhdl code 
funktioniert.
Weiß da jemand genaueres?

gruß sunny

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Regel wird immer ein Blockram verwendet, außer du hast eine 
krumme Anzahl an Indizes, also keinen "vollen" Ram genutzt.

In dem Fall kannst du in den Optionen aber immer noch einstellen, das 
auch für solche Fälle Blockram verwendet werden soll.


Ansonsten einfach mal den code zur Deklaration und Verwendung des Rams 
zeigen.

Weiß z.b. nicht ob es automatisch instanziiert wird, wenn man in einem 
Takt von mehreren Adressen liest oder solche Späße.

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst mindestens ein Register am Eingang oder Ausgang und darfst 
keine speziellen Operationen auf ihnen durchführen. (Aufpassen mit 
Resetsignalen) Der folgende Code inferiert RAM in Cyclone FPGAs.
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity SampleRecorder is
port(
    signal clk, reset : in std_logic;
    signal ctrl_address : in std_logic_vector(1 downto 0);
    signal ctrl_writedata : in std_logic_vector(31 downto 0);
    signal ctrl_write : in std_logic;
    signal samples_address : in std_logic_vector(11 downto 0);
    signal samples_readdata : out std_logic_vector(31 downto 0);
    signal samples_read : in std_logic;
    signal sample_in : in std_logic_vector(23 downto 0);
    signal sample_in_strobe : in std_logic
);
end entity;

architecture arch of SampleRecorder is
    subtype sample_memword_t is std_logic_vector(23 downto 0);
    type sample_mem_t is array(0 to 4095) of sample_memword_t;
    signal sample_mem : sample_mem_t;
    signal sample_writeaddr : unsigned(11 downto 0);
    signal sample_writedata : std_logic_vector(23 downto 0);
    signal sample_write : std_logic;
begin
    process(clk, reset)
    begin
        if reset = '1' then
            sample_writeaddr <= (others=>'0');
            sample_writedata <= (others=>'0');
            sample_write <= '0';
        elsif rising_edge(clk) then
            if sample_in_strobe = '1' then
                sample_writeaddr <= sample_writeaddr+1;
                sample_writedata <= sample_in;
                sample_write <= '1';
            else
                sample_write <= '0';
            end if;
            if sample_write = '1' then
                sample_mem(to_integer(sample_writeaddr)) <= sample_writedata;
            end if;
            if samples_read = '1' then
                samples_readdata <= X"00"&sample_mem(to_integer(unsigned(samples_address)));
            end if;
            if ctrl_write = '1' then
                sample_writeaddr <= unsigned(ctrl_writedata(11 downto 0));
            end if;
        end if;
    end process;
end arch;

Autor: sunny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich hab mal noch ein bischen weiter gespielt. wirklich weiter gekommen 
bin ich aber nicht.
meine plattform ist ein FLEX10KA (EPF10K100A...).
dieser code
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ramtest is
port(
    signal clk, wr : in std_logic;
    signal waddr,raddr : in std_logic_vector(7 downto 0);
    signal outdata : out std_logic_vector(7 downto 0);
  signal indata:in std_logic_vector(7 downto 0));
end entity;

architecture arch of ramtest is
    subtype sample_memword_t is std_logic_vector(7 downto 0);
    type sample_mem_t is array(0 to 255) of sample_memword_t;
    signal mem : sample_mem_t;
begin
    process(clk,raddr)
    variable adv:integer range 0 to 255;
    begin
    adv:=conv_integer(waddr);
        if wr = '1' then
            if rising_edge(clk) then
        mem(adv)<=indata;
            end if;
    else
     null;
     end if;
   adv:=conv_integer(raddr);
  outdata<=mem(adv);
    end process;
end arch;

sollte doch eigendlich ein RAM in einem der EAB's erzeugen? (würde auch 
genau in einen rein passen) tut er aber nicht. er bildet das ram aus 
knapp 3700 LE's. es macht auch keinen unterschied ob ich die 
ein/ausgänge registered mache oder nicht. immer das selbe. das ram 
landet in den LE's.
welche option muss ich denn setzen oder wie muss ich den code schreiben 
damit es hin haut?

@serioussam
mit dem code funktioniert es auch nicht. das ram wird dabei auch in den 
LE's erzeugt. zumindest bei mir. egal ob ich cyclone oder flex10k als 
zielplattform auswähle.

gruß sunny

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst entweder outdata oder raddr (und ev. auch waddr und indata) 
registrieren, damit ein RAM-Block gebraucht werden kann. Der Compiler 
schiebt dann das Register an den richtigen Platz (Eingang,Adresse).

Autor: ein_unwissender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kenn mich eher mit Xilinx aus, aber vielleicht ist es ja ähnlich:

Kann man überhaupt ein RAM direkt aus VHDL erzeugen? Für die Simulation 
ja, aber für FPGA sollte normalerweise mit einem Werkzeug des 
Herstellers ein RAM-Block als IP erzeugt werden. Da wird dann eine Datei 
erzeugt, die man bei der Synthese mit einbindet. Dieser IP hat dann alle 
RAM-Signale wie Adressbits/Datenbits und R/W OE usw....Der IP kann dann 
als BlackBox im VHDL instantiiert werden....als COMPONENT mit der 
richtigen Bezeichnung, so dass die Synthesesoftware dann den fertig 
erzeugten Core benutzt.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein_unwissender schrieb:
> Kann man überhaupt ein RAM direkt aus VHDL erzeugen?
Ja, man kann. Bei Xilinx steht das im "XST User Guide". Bei Altera wird 
es ein ähnliches Dokument geben.

Ich persönliche finde diese Schreibweise schöner, als einen 
instanziierten Blockram, der komische (und evtl. überflüssige) 
Signalnamen verwendet.

Duke

Autor: ein_unwissender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, wieder was gelernt.

Jedoch denke ich, dass man mit der BlackBox-Methode vielleicht als 
RAM-Neuling anfangen sollte um keinen unsinnigen RAM zu erstellen. Für 
die Profis ist es natürlich Geschmackssache, wenn man weiss was man tut.

Autor: sunny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tatsache! raddr muss registered sein!?!
    process(clk,raddr)
    variable adv,adv2:integer range 0 to 255;
    begin
        adv:=conv_integer(waddr);
        if rising_edge(clk) then
        if wr = '1' then
        mem(adv)<=indata;
        else
        adv2:=conv_integer(raddr);
        end if;
        end if;
        outdata<=mem(adv2);
    end process;
so funktionierts. ist ja doof. das auch das lesen taktsyncron erfolgen 
muss. aber o.k. damit muss man dann warscheinlich leben.
danke für eure hilfe!

gruß sunny

Autor: sunny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder auch nicht.
das target device stand noch auf cyclone. (war mir erst gar nicht 
aufgefallen) wenn man es wieder auf flex10k stellt funktioniert es 
wieder nicht. sch... technik.

gruß sunny

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.