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?
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)
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 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 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.
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 | SimualtionsVersion 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.