Forum: FPGA, VHDL & Co. VIVADO, MIG Block Simulieren, dauerreset?


von Matze (Gast)


Lesenswert?

Hallo,

Kann man den einen erzeugten MIG in Vivado richtig simulieren?

Grundsätzlich wohl schon, doch da gibt es ein Problem:

Ich erzeuge in der Simulation einen 100MHZ CLK, diesen erhöhe ich per 
PLL auf 200MHZ.

Der MIG-Block ist zu Beginn im reset.
Nachdem die PLL = LOCKED ist, wird weitere 9 100MHZ Clk's gewartet bis 
der Reset vom MIG weggenommen wird. Nun sollte er also arbeiten.

Demnach sollte er sich zuerst kalibrieren, wenn die Kalibrierung 
abgeschlossen ist, sollte er das Signal init_calib_complete setzen.
Dies passiert jedoch nicht, das signal bleibt immer auf 'X'.

Danach sollte der ui_clk_rst von '1' auf '0' gehen und der und ein Tackt 
für das User-Interface ui_clk ausgegeben werden.

Soweit kommt es jedoch nicht.

Da ich zum 1. mal versuche einen MIG-Block zu simulieren.
Kann es sein, dass ich da irgendwie einen RAM anschließen muss?
Müsste ich also für den verwendeten DDR2-RAM MT47H64M16 von MICRON eine 
VHDL-Beschreibung haben?

Oder hat die Vivado schon?
Da er hier in der Liste der unterstützten Speicher auftaucht: 
http://www.xilinx.com/support/answers/54025.html

Welche Gründe für das beschriebene Verhalten könnte es geben?

von Christian R. (supachris)


Lesenswert?

Klar muss da ein RAM Modell dran, was soll der sonst einstellen und 
kalibrieren?
Modelle gibts auch bei Micron direkt, muss man sich aber registrieren.

von FPGA-user (Gast)


Lesenswert?

Matze schrieb:
> Kann man den einen erzeugten MIG in Vivado richtig simulieren?

Der MIG ist ein toll, simulieren willst Du sicher dessen Ausgaben:

Er erzeugt ein demo design und ein user design, das du anpassen muss. 
Das demo design läuft normalweise direkt in der Simulation. "Normal" 
heisst dabei, dass der Simulator "ModelSim SE" heisst und nicht etwa 
ISIM oder Vivado-Sim, denn mit den letzt genannten ist es noch keinem 
gelungen, ein DDR-design komplett zu simulieren.



> Ich erzeuge in der Simulation einen 100MHZ CLK, diesen erhöhe ich per
> PLL auf 200MHZ.
Die muss entsprechend verdrahtet werden und zwar im user design. Du 
musst die 200 MHz DDR-clk und die REF-clk anschleßen.

> Demnach sollte er sich zuerst kalibrieren, wenn die Kalibrierung
> abgeschlossen ist, sollte er das Signal init_calib_complete setzen.
> Dies passiert jedoch nicht, das signal bleibt immer auf 'X'.

Kann nicht sein. Sobald der Core das Signal treibt, ist es 0. Später 
dann 1. Du hast was falsch angeschlossen.

von Matze (Gast)


Lesenswert?

Christian R. schrieb:
> Klar muss da ein RAM Modell dran, was soll der sonst einstellen und
> kalibrieren?
> Modelle gibts auch bei Micron direkt, muss man sich aber registrieren.

Stimmt bei Micron gibt's Modelle, registrieren muss man sich nicht.
https://www.micron.com/parts/dram/ddr2-sdram/mt47h64m16hr-25e
Dann werd ich mich nun in Verilog einlesen.

FPGA-user schrieb im Beitrag #4531307:
> Er erzeugt ein demo design und ein user design, das du anpassen muss.
> Das demo design läuft normalweise direkt in der Simulation. "Normal"
> heisst dabei, dass der Simulator "ModelSim SE" heisst und nicht etwa
> ISIM oder Vivado-Sim, denn mit den letzt genannten ist es noch keinem
> gelungen, ein DDR-design komplett zu simulieren.

Stimmt, um das Micron-Model nutzen zu können brauche ich wohl ModelSim.
Bei der Umstellung des Simulators auf ModelSim kommt diese Meldung:
1
ModelSim Simulator requires that Xilinx libraries are pre-compiled. 
2
You can compile Xilinx simulation libraries by going to tools menu and 
3
clicking on compile simulation libraries. Make sure that the compiled 
4
library location in simulation settings menu is pointing to the correct 
5
Modelsim.ini file. To confirm the status of the compiled libraries run 
6
report_simlib_info Tcl command.

Enthält das IniFile eine "Voreinstellung" des Simulators?

FPGA-user schrieb im Beitrag #4531307:
>> Ich erzeuge in der Simulation einen 100MHZ CLK, diesen erhöhe ich per
>> PLL auf 200MHZ.
> Die muss entsprechend verdrahtet werden und zwar im user design. Du
> musst die 200 MHz DDR-clk und die REF-clk anschleßen.

Die PLL bekommt den 100MHZ-Clk als CLKIN1 und gibt die 200MHZ am CLKOUT0 
aus sobald LOCKED auf '1' geht. Dies bekommt der MIG-Block.
Dies steht im Synthetisierten Design, so sollte es doch passen?

FPGA-user schrieb im Beitrag #4531307:
>> Demnach sollte er sich zuerst kalibrieren, wenn die Kalibrierung
>> abgeschlossen ist, sollte er das Signal init_calib_complete setzen.
>> Dies passiert jedoch nicht, das signal bleibt immer auf 'X'.
>
> Kann nicht sein. Sobald der Core das Signal treibt, ist es 0. Später
> dann 1. Du hast was falsch angeschlossen.

Der MIG hat folgendes Interface:
1
component ddr
2
   port (
3
-- Signale zum DDR2-RAM-Controller ----------------------------------------------------------------
4
      -- Inouts
5
      ddr2_dq              : inout std_logic_vector(15 downto 0); --
6
      ddr2_dqs_p           : inout std_logic_vector(1 downto 0); --
7
      ddr2_dqs_n           : inout std_logic_vector(1 downto 0); --
8
      -- Outputs
9
      ddr2_addr            : out   std_logic_vector(12 downto 0); --
10
      ddr2_ba              : out   std_logic_vector(2 downto 0); --
11
      ddr2_ras_n           : out   std_logic;                       --
12
      ddr2_cas_n           : out   std_logic;                       --
13
      ddr2_we_n            : out   std_logic;                       --
14
      ddr2_ck_p            : out   std_logic_vector(0 downto 0);    --
15
      ddr2_ck_n            : out   std_logic_vector(0 downto 0);    --
16
      ddr2_cke             : out   std_logic_vector(0 downto 0);    --
17
      ddr2_cs_n            : out   std_logic_vector(0 downto 0);    --
18
      ddr2_dm              : out   std_logic_vector(1 downto 0);    --
19
      ddr2_odt             : out   std_logic_vector(0 downto 0);    --
20
      -- Inputs
21
      sys_clk_i            : in    std_logic;
22
      sys_rst              : in    std_logic;
23
      -- user interface signals
24
      app_addr             : in    std_logic_vector(26 downto 0);
25
      app_cmd              : in    std_logic_vector(2 downto 0);
26
      app_en               : in    std_logic;
27
      app_wdf_data         : in    std_logic_vector(63 downto 0);
28
      app_wdf_end          : in    std_logic;
29
      app_wdf_mask         : in    std_logic_vector(7 downto 0);
30
      app_wdf_wren         : in    std_logic;
31
      app_rd_data          : out   std_logic_vector(63 downto 0);
32
      app_rd_data_end      : out   std_logic;
33
      app_rd_data_valid    : out   std_logic;
34
      app_rdy              : out   std_logic;
35
      app_wdf_rdy          : out   std_logic;
36
      app_sr_req           : in    std_logic;
37
      app_sr_active        : out   std_logic;
38
      app_ref_req          : in    std_logic;
39
      app_ref_ack          : out   std_logic;
40
      app_zq_req           : in    std_logic;
41
      app_zq_ack           : out   std_logic;
42
      ui_clk               : out   std_logic;
43
      ui_clk_sync_rst      : out   std_logic;
44
      device_temp_i        : in    std_logic_vector(11 downto 0);
45
      init_calib_complete  : out   std_logic);
46
end component;

Reset und Clk sind sinvoll belegt, erst nach > 10 Clk-Zyklen nach dem 
Locked der PLL geht der Reset-Eingang auf High.
1
sys_rst   => reset 
2
sys_clk_i => CLK200MHZ


Die Signale:
1
      app_addr             : in    std_logic_vector(26 downto 0);
2
      app_cmd              : in    std_logic_vector(2 downto 0);
3
      app_en               : in    std_logic;
4
      app_wdf_data         : in    std_logic_vector(63 downto 0);
5
      app_wdf_end          : in    std_logic;
6
      app_wdf_mask         : in    std_logic_vector(7 downto 0);
7
      app_wdf_wren         : in    std_logic;
8
      app_rd_data          : out   std_logic_vector(63 downto 0);
9
      app_rd_data_end      : out   std_logic;
10
      app_rd_data_valid    : out   std_logic;
11
      app_rdy              : out   std_logic;
12
      app_wdf_rdy          : out   std_logic;
Sind mit sinvollen signalen belegt.


Diese werden wohl nicht benötigt, da sie auch in der
Digilent DDR2SRAM SRAM-DDR umsetzer Einheit
https://reference.digilentinc.com/nexys4-ddr:sram
nicht genutzt werden und die Eingänge dort mit '0' beschaltet sind. So 
hab ich's auch.
1
      app_sr_req           : in    std_logic;
2
      app_sr_active        : out   std_logic;
3
      app_ref_req          : in    std_logic;
4
      app_ref_ack          : out   std_logic;
5
      app_zq_req           : in    std_logic;
6
      app_zq_ack           : out   std_logic;


Aus ui_clk kommt kein clk raus, der ui_clk_sync_rst bleibt immer auf 
'1',
device_temp _i habe ich mit x'000' belegt.
Das Signal init_calib_complete geht niemals auf einen anderen Zustand 
als 'X'
1
      ui_clk               : out   std_logic;
2
      ui_clk_sync_rst      : out   std_logic;
3
      device_temp_i        : in    std_logic_vector(11 downto 0);
4
      init_calib_complete  : out   std_logic);

Was könnte ich falsch angeschlossen haben?

Danke für die bisherige unterstützung ;)

von Vivado User (Gast)


Lesenswert?

Kann es sein, dass die ack eine 1 haben müssen, damit das user design 
richtig arbeitet?

von Kameramann (Gast)


Lesenswert?

Nein, die ACK kommen nur, wenn man einen SR angetriggert hat. 
Normalerweise sollte der Controller das selber tun und leisten. Man 
sieht es an dem rhythmischen app_ready, das immer mal wieder low ist, 
ohne, dass man ein Kommando gesendet hätte.

Der Ablauf des Controller Starts ist wie folgt:

- asynch reset anlegen
- clock anlegen
- warten

- nach einer weile kommt das calib complete und
- dann kommt irgendwann die interne clock
- dann der user Interface reset, den man verwenden sollte, seine state 
machine zu starten
- dann kommt das regelmässige app_ready

> Das Signal init_calib_complete geht niemals auf einen anderen Zustand
als 'X'
Dann ist das Signal nicht angeschlossen oder es wird getrieben. Es muss 
null sein und dann auf 1 gehen.

von Kameramann (Gast)


Lesenswert?

Nun fällt mir noch etwas ein:

Wenn die Signale noch nicht getrieben werden, könnten sie auch wegen des 
Resets hängen. Den kann man im Design bekanntlich einstellen. Ist die 
Polarität richtig vorgewählt worden und entsprechend angelegt?

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.