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 ;)