Forum: FPGA, VHDL & Co. RAM simulieren?


von Christian P. (kron)


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?

von Jan M. (mueschel)


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)

von GagoSoft (Gast)


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)
1
entity RAM is
2
  generic(
3
    tdelay : time :=  10 ns  -- Address Access Time             
4
  )
5
  port(
6
    ....
7
end entity RAM;
8
9
architecture sim_Bhv of RAM is
10
11
type     Tmemory is array(0 to 2**(Address'high)-1) of std_logic_vector(7 downto 0);
12
signal   Data : ext_memory;
13
14
signal ...
15
16
begin
17
18
  ChipAddress <= transport Address after tdelay;
19
  Address_Valid <= Address = Chipadress;
20
  write_Trigger <= (CS_n or WE_n)
21
22
  writeData : process(Write_Trigger)is
23
  begin
24
    if write_Trigger'event and Write_Trigger = '1' and Address_Valid then
25
      Data(conv_integer(unsigned(ChipAddress))) <= Data_In;
26
    end if;
27
  end process WriteData;
28
29
  ReadData : process(Address,ChipAddress)is
30
  begin
31
    if Address'event or ChipAddress'event then
32
      if Address_valid = '0' then
33
        Data_out <= (others => 'U');
34
      else
35
        Data_Out <= Data(conv_integer(unsigned(ChipAddress)));
36
      end if;
37
    end if;
38
  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

von Philip K. (plip)


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.

von damicha (Gast)


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.

von GagoSoft (Gast)


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 :
1
Simualtions­Version        18:19 Arbeitszeit für 2200 ms Simulationszeit bei einer Auflösung von 1 ns
2
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

von GagoSoft (Gast)


Lesenswert?

oops, natürlich muss das in meinem gestrigen Posting
1
signal   Data : Tmemory;
und nicht
1
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

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
Noch kein Account? Hier anmelden.