mikrocontroller.net

Forum: FPGA, VHDL & Co. RAM simulieren?


Autor: Christian Peters (kron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte per Simulation (mit Xilinx ISE & Modelsim) grob das Verhalten 
eines (Dual Port) SRAMs simulieren, also ganz einfach, dass zum 
Zeitpunkt t eine Adresse x anliegt und dann bei t+y anliegende Daten 
unter x gespeichert werden. Und andersrum lege ich wiederum Adresse x an 
und bei t+z werden die Daten dann bereitgestellt.

Ist das prinzipiell machbar?
Was muss ich näheres dabei beachten?

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du nur eine einfache funktionelle Simulation brauchst, kannst du 
vielleicht core generator von ise verwenden und einen entsprechenden 
Speicher erstellen.
Das ist zwar eigentlich fuer fpga-interne Speicher RAMs gedacht, aber 
von er Funktion her duerfte es keinen Unterschied geben (von 
bidirektionalen Daten-I/Os abgesehen)

Autor: GagoSoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar ist das möglich!

Wie genau brauchst Du die Simulation?
synchroner SRAM oder asynchron?
soll der dualRAM auf beiden Ports lesen und schreiben können?

zB asynchroner singleport 8Bit Memory
(schreib die Daten bei steigender Flanke von CS_n oder WE_n - wobei ich 
*_n für negierte Eingänge verwende)
entity RAM is
  generic(
    tdelay : time :=  10 ns  -- Address Access Time             
  )
  port(
    ....
end entity RAM;

architecture sim_Bhv of RAM is

type     Tmemory is array(0 to 2**(Address'high)-1) of std_logic_vector(7 downto 0);
signal   Data : ext_memory;

signal ...

begin

  ChipAddress <= transport Address after tdelay;
  Address_Valid <= Address = Chipadress;
  write_Trigger <= (CS_n or WE_n)

  writeData : process(Write_Trigger)is
  begin
    if write_Trigger'event and Write_Trigger = '1' and Address_Valid then
      Data(conv_integer(unsigned(ChipAddress))) <= Data_In;
    end if;
  end process WriteData;

  ReadData : process(Address,ChipAddress)is
  begin
    if Address'event or ChipAddress'event then
      if Address_valid = '0' then
        Data_out <= (others => 'U');
      else
        Data_Out <= Data(conv_integer(unsigned(ChipAddress)));
      end if;
    end if;
  end process;

naja, mal so aus dem Ärmel geschüttelt und nicht simuliert...
Wenn Du einen Lese und einen SchreibPort benötigst, musst Du einfach den 
Addressteil zweimal zweimal ausführen.

mfg GagoSoft
----------------------------------
wer Rechtschreibfehler findet, darf sie behalten, Inhaltliche Fehler 
nehme ich gerne zurück

Autor: Philip Kirchhoff (plip)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Xilinx gibts son pdf, wo unter anderem die Beschreibung 
unterschiedlicher RAMs aufgelistet ist. Find grad den link nicht...
Xilinx unterscheidet neben synchron und asynchron auch noch beim 
Schreib-Ausgabeverhalten, also was am Ausgang eines ports steht, während 
Du über diesen schreibst.

Autor: damicha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Von Xilinx gibts son pdf, wo unter anderem die Beschreibung
>unterschiedlicher RAMs aufgelistet ist. Find grad den link nicht...

Hallo.

Ist bei der ISE Installation mit dabei. Unter:
$XILINX\doc\usenglish\books\docs\xst\
in der Datei xst.pdf.

Abschnitt:
XST User Guide -> XST HDL Coding Techniques -> RAM and ROMs HDL Coding 
Techniques.

Gruß DaMicha.

Autor: GagoSoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun ist hier die wichtigste Frage:

Wollen wir einen SRAM im FPGA oder einen externen SRAM simulieren?

XST spricht (meiner Erkenntniss nach) eigentlich nur von internen 
RAM/ROM Blocks bzw internem distributed RAM/ROM.

Auch wenn der RAM im FPGA sein soll, macht es Sinn, ein einfaches 
Simulationsmodell in VHDL zu verwenden, da die Simulation von 
Xilinx-RAM/ROM unendlich viel langsamer ist als ein einfaches VHDL 
Modell.
Das ist besonders wichtig, wenn Du ein grosses Design simulieren willst.
Auch benötigt das Xilinx-Modell eine höhere Auflösung der 
Simulationszeit.

Sim-RAM vs Xilinx-RAM machte bei mir in einem grossen Design den 
Unterschied zwischen :
Simualtions­Version        18:19 Arbeitszeit für 2200 ms Simulationszeit bei einer Auflösung von 1 ns
Synthesefähige Version  1:30:34 Arbeitszeit für 2200 ms Simulationszeit bei einer Auflösung von 1 ps
----------------------------------
wer Rechtschreibfehler findet, darf sie behalten, Inhaltliche Fehler
nehme ich gerne zurück

Autor: GagoSoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oops, natürlich muss das in meinem gestrigen Posting
signal   Data : Tmemory;
und nicht
signal   Data : ext_memory;
heissen.
(wozu würd' ich sonst den Type deklarieren?!)

----------------------------------
wer Rechtschreibfehler findet, darf sie behalten, Inhaltliche Fehler
nehme ich gerne zurück

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.