Forum: FPGA, VHDL & Co. Xilinx MIG 2.4 richtig beschalten


von Matze (Gast)


Lesenswert?

Hallo,

Ich versuche gerade Daten in den DDR2-RAM eines Nexys4DDR zu schreiben, 
Dabei nutze ich den MIG in der Version 2.4.

Dabei soll mit die Komponente RAM_2_DDR eine einfachere Steuerung für 
den DDR2-RAM zur Verfügung stellen.

So dass da User-Interface letztendlich nur noch aus den Signalen
1
    address             : in std_logic_vector(23 downto 0); --Addresse
2
    data_in             : in std_logic_vector(63 downto 0); --Schreib-Daten
3
    data_out            : out std_logic_vector(63 downto 0);--Lese_Daten
4
    R_w                 : in std_logic;                     --Write_en
5
    R_w_en              : in std_logic;                     --Read_enable
6
    
7
    DDR2_rdy            : out std_logic;                    --DDR2
besteht.

Hierbei sollen durch die Adressen lediglich 64-Bit Pakete adressiert 
werden, deshalb können die letzten 3 Adressbits des Controllers immer 
auf 0 liegen.

data_in soll die zu schreibenden Daten enthalten,
data_out die gelesenen.

Mit dem Signal R_w soll bei einer 1 ein Lesekommando, bei 0 ein 
Schreibkommando ausgeführt werden.

Die Gültigkeit des R_w signals wird durch eine 1 an R_w_en bestätigt.

Das Signal DDR2_rdy gibt an ob gerade Daten ins RAM Geschrieben/Gelesen 
werden können.

Zur Funktionsbeschreibung:
Zunächst muss hierbei ein Eintakten von einem 100MHz Systemtackt auf dem 
200MHZ UI-Clk des MIG erfolgen.

Dies geschieht im IDLE-State.
Hier wird das Signal DDR2_rdy für den fall, dass Rdy = 1 ist und wdf_rdy 
= 1 ist auf 1 gelegt.
--> Das DDR-RAM ist bereit sowohl Daten, als auch Kommandos anzunehmen.

Nun kann durch R_w + R_w_en eine Auswahl auf schreiben/lesen erfolgen.

Wird in den Write_state gewechselt,
so wird das RDY-Signal auf 0 gesetzt, gleichzeitig werden Adresse sowie 
Daten übernommen.
Auch wird das Schreibkommando angelegt, und das Signal zum schreiben in 
den FIFO wdf_wren aktiviert.

Nun wird in den Zustand write_wait_1 gesprungen,
Das DDR2-RAM wird wieder Deselektiert.
Gleichzeitig wird überprüft, ob zum Zeitpunkt des write - State eine 0 
an Rdy angelegen hat, denn dies würde bedeuten, dass das Kommando nicht 
übernommen wurde.

Falls dies der Fall ist, wird erneut in den state = write gewechselt.

Wenn das Kommando angenommen wurde, muss ein schreiben erfolgen, dies 
zeigt sich durch ein rücksetzen von wdf_rdy.

Also wird hierrauf gewartet. wenn es stattfindet, wird ein Merker 
"wdf_merker" gesetzt.
Geht wdf_rdy nun wider auf 1 so ist der Schreibvorgang abgeschlossen.
Es kann in den IDLE-State gewechselt und der Merker zurückgesetzt 
werden.


Erfolgte ein Lese-Kommando,
So wird in den state = read gesprungen.
Adressen und Kommando werden übernommen, und dass enable-Signal gesetzt.

Nächster Zustand ist read_wait_1, hier wird wieder überprüft, ob das 
rdy-Signal um read-State = 1 war.
Ist dies nicht der fall, so wird das Lesen wiederholt.

Wurde dass Kommando angenommen, so wird auf die Aktivierung von 
rd_data_valid gewartet.
Tritt dies ein, so können die gelesenen Daten abgegriffen werden.

Wird rd_data_valid wieder = 0, so kann in den Idle-State gewechselt 
werden.

Leider funktioniert dass nicht wirklich, habt ihr eine Idee, woran es 
liegen könnte, oder wie mann es richtig macht?

Interessant scheint dieser Beitrag:
Beitrag "Re: Xilinx MIG Userinterface Doku"

Jedoch scheint er nicht abzufragen, ob der MIG gerade bereit ist.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
Library UNISIM;
5
use UNISIM.vcomponents.all;
6
7
entity RAM_2_DDR is
8
    Port ( 
9
    DDR_clk             : in std_logic;
10
    ddr2_dq             : inout std_logic_vector(15 downto 0);
11
    ddr2_dm             : out std_logic_vector(1 downto 0);
12
    ddr2_dqs_p          : inout std_logic_vector(1 downto 0);
13
    ddr2_dqs_n          : inout std_logic_vector(1 downto 0); 
14
    ddr2_addr           : out std_logic_vector(12 downto 0);
15
    ddr2_ba             : out std_logic_vector(2 downto 0);
16
    ddr2_ck_p           : out   std_logic_vector(0 downto 0);
17
    ddr2_ck_n           : out   std_logic_vector(0 downto 0);
18
    ddr2_ras_n          : out   std_logic;
19
    ddr2_cas_n          : out   std_logic;
20
    ddr2_we_n           : out   std_logic;
21
    ddr2_cke            : out   std_logic_vector(0 downto 0);
22
    ddr2_odt            : out   std_logic_vector(0 downto 0);
23
    ddr2_cs_n           : out   std_logic_vector(0 downto 0);
24
    
25
    address             : in std_logic_vector(23 downto 0); --Addresse
26
    data_in             : in std_logic_vector(63 downto 0); --Schreib-Daten
27
    data_out            : out std_logic_vector(63 downto 0);--Lese_Daten
28
    R_w                 : in std_logic;                     --Write_en
29
    R_w_en              : in std_logic;                     --Read_enable
30
    
31
    DDR2_rdy            : out std_logic;                    --DDR2 controller bereit
32
    
33
    ui_clk_o            : out std_logic;
34
    Reset               : in STD_LOGIC;
35
    RES_out             : out STD_LOGIC;
36
    --Debug
37
    state_sig           : out STD_LOGIC_VECTOR(2 downto 0);
38
    wdf_rdy_sig         : out STD_LOGIC;
39
    rdy_sig             : out STD_LOGIC;
40
    cmd_sig             : out STD_LOGIC_VECTOR(2 downto 0);
41
    en_sig              : out STD_LOGIC;
42
    wdf_wren_sig        : out STD_LOGIC;
43
    wdf_data_sig        : out STD_LOGIC_VECTOR(63 downto 0);
44
    wdf_end_sig         : out STD_LOGIC;  
45
    rd_data_valid_sig   : out STD_LOGIC
46
    );
47
end RAM_2_DDR;
48
49
architecture Behavioral of RAM_2_DDR is
50
51
component ddr
52
   port (
53
      -- Inouts
54
      ddr2_dq              : inout std_logic_vector(15 downto 0); --
55
      ddr2_dqs_p           : inout std_logic_vector(1 downto 0); --
56
      ddr2_dqs_n           : inout std_logic_vector(1 downto 0); --
57
      -- Outputs
58
      ddr2_addr            : out   std_logic_vector(12 downto 0); --
59
      ddr2_ba              : out   std_logic_vector(2 downto 0); --
60
      ddr2_ras_n           : out   std_logic;                       --
61
      ddr2_cas_n           : out   std_logic;                       --
62
      ddr2_we_n            : out   std_logic;                       --
63
      ddr2_ck_p            : out   std_logic_vector(0 downto 0);    --
64
      ddr2_ck_n            : out   std_logic_vector(0 downto 0);    --
65
      ddr2_cke             : out   std_logic_vector(0 downto 0);    --
66
      ddr2_cs_n            : out   std_logic_vector(0 downto 0);    --
67
      ddr2_dm              : out   std_logic_vector(1 downto 0);    --
68
      ddr2_odt             : out   std_logic_vector(0 downto 0);    --
69
      -- Inputs
70
      sys_clk_i            : in    std_logic;
71
      sys_rst              : in    std_logic;
72
      -- user interface signals
73
      app_addr             : in    std_logic_vector(26 downto 0);
74
      app_cmd              : in    std_logic_vector(2 downto 0);
75
      app_en               : in    std_logic;
76
      app_wdf_data         : in    std_logic_vector(63 downto 0);
77
      app_wdf_end          : in    std_logic;
78
      app_wdf_mask         : in    std_logic_vector(7 downto 0);
79
      app_wdf_wren         : in    std_logic;
80
      app_rd_data          : out   std_logic_vector(63 downto 0);
81
      app_rd_data_end      : out   std_logic;
82
      app_rd_data_valid    : out   std_logic;
83
      app_rdy              : out   std_logic;
84
      app_wdf_rdy          : out   std_logic;
85
      app_sr_req           : in    std_logic;
86
      app_sr_active        : out   std_logic;
87
      app_ref_req          : in    std_logic;
88
      app_ref_ack          : out   std_logic;
89
      app_zq_req           : in    std_logic;
90
      app_zq_ack           : out   std_logic;
91
      ui_clk               : out   std_logic;
92
      ui_clk_sync_rst      : out   std_logic;
93
      device_temp_i        : in    std_logic_vector(11 downto 0);
94
      init_calib_complete  : out   std_logic);
95
end component;
96
97
signal addr : std_logic_vector(23 downto 0);        --> Addressen
98
signal cmd : std_logic_vector(2 downto 0);          --> Read = 001 / Write = 000 
99
signal en : std_logic;                              --> Handshake Ack rdy
100
signal wdf_data : std_logic_vector(63 downto 0);    --> Write-Fifo
101
signal wdf_end : std_logic;                         --> Daten in wdf_data nun zum letzten mal gültig 
102
signal wdf_mask : std_logic_vector(7 downto 0);     --> Welche Bits von WDF-Data geschriueben werden zusammenhängende 0-en auf Bytes setzen
103
signal wdf_wren : std_logic;                        --> Daten an wdf_data gültig
104
signal rd_data : std_logic_vector(63 downto 0);     --> lese FIFO
105
signal rd_data_end : std_logic;                     --> Daten an rd_data sind letzten daten für aktuelle Anfrage 
106
signal rd_data_valid : std_logic;                   --> Daten an rd_data gültig
107
signal rdy : std_logic;                             --> 
108
signal wdf_rdy : std_logic;                     --> 
109
signal ui_clk : std_logic;                      --> User-Interfce-CLK 
110
signal ui_clk_sync_rst : std_logic;             -->
111
signal init_calib_complete : std_logic;         --> Wenn controller Initialisiert --> 1
112
113
constant CMD_WRITE               : std_logic_vector(2 downto 0) := "000";
114
constant CMD_READ                : std_logic_vector(2 downto 0) := "001";
115
116
signal read_merker  : STD_LOGIC;
117
signal wdf_merker   : STD_LOGIC;
118
119
type statetype is (idle,write , read, read_wait_1, write_wait_1, RST);
120
signal state : statetype;
121
122
begin
123
    ui_clk_o <= ui_clk;
124
    wdf_rdy_sig     <= wdf_rdy; --: out STD_LOGIC;
125
    rdy_sig         <= rdy;     --: out STD_LOGIC;
126
    cmd_sig         <= cmd;     --: out STD_LOGIC_VECTOR(2 downto 0);
127
    en_sig          <= en;      --: out STD_LOGIC;
128
    wdf_wren_sig    <= wdf_wren;--: out STD_LOGIC;
129
    wdf_data_sig    <= wdf_data;--: out STD_LOGIC_VECTOR(63 downto 0);
130
    wdf_end_sig     <= wdf_end; --: out STD_LOGIC;
131
    rd_data_valid_sig <= rd_data_valid;
132
    p1: process(ui_clk, Reset)
133
    begin
134
        if Reset = '1' then
135
            RES_out <= '1';
136
            state <= RST;
137
        else --Reset = '0'
138
            if rising_edge(ui_clk) then
139
                if state = RST then
140
                    state_sig <= "000";
141
                    if ui_clk_sync_rst = '0' and init_calib_complete = '1' then
142
                        RES_out <= '0';
143
                        read_merker <= '0';
144
                        wdf_merker <= '0';
145
                        cmd <= CMD_READ;
146
                        en <= '0';
147
                        wdf_wren <= '0';
148
                        wdf_data <= x"0000000000000000";
149
                        wdf_end <= '0';                        
150
                        state <= idle;
151
                    end if;
152
                elsif state = idle then           --Idle
153
                    state_sig <= "001";
154
                    if rdy = '1' and wdf_rdy = '1' then -- MIG bereit
155
                        DDR2_rdy <= '1';--Controller bereit
156
                        if R_w_en = '1' and R_w = '0' then
157
                            state <= write;
158
                        elsif R_w_en = '1' and R_w = '1' then
159
                            state <= read;
160
                        end if;
161
                   else
162
                        DDR2_rdy <= '0';                     --Controller ! bereit
163
                   end if;
164
                elsif state = write then        --Schreiben
165
                    DDR2_rdy <= '0'; 
166
                    state_sig <= "010";
167
                    if wdf_rdy = '1' then   -- Schreib fifi bereit für Datenempfang
168
                        addr <= address;
169
                        cmd <= CMD_WRITE;
170
                        en <= '1';
171
                        wdf_wren <= '1';
172
                        wdf_data <= data_in;
173
                        wdf_end <= '1';
174
                        state <= write_wait_1;
175
                    end if;
176
                elsif state = write_wait_1 then
177
                    en <= '0';
178
                    wdf_wren <= '0';
179
                    wdf_end <= '0';
180
                    state_sig <= "100";
181
                    if rdy = '0' then
182
                        state <= write;
183
                    else
184
                        if wdf_rdy = '0' then
185
                            wdf_merker <= '1';
186
                        elsif wdf_rdy = '1' and wdf_merker = '1' then
187
                            state <= idle;
188
                            wdf_merker <= '0';
189
                        end if;
190
                    end if;                      
191
                elsif state = read then        --Lesen
192
                    addr <= address;
193
                    state_sig <= "101";
194
                    cmd <= CMD_READ;
195
                    en <= '1';
196
                    wdf_wren <= '0';
197
                    wdf_data <= x"0000000000000000";
198
                    wdf_end <= '0';
199
                    DDR2_rdy <= '0';
200
                    state <= read_wait_1;
201
                elsif state = read_wait_1 then
202
                    if rdy = '1' then
203
                        en <= '0';
204
                        if rd_data_valid = '1' and read_merker = '0' then
205
                            read_merker <= '1';
206
                            data_out <= rd_data;
207
                        end if;
208
                        if read_merker = '1' and rd_data_valid = '0' then
209
                            state <= idle;
210
                            read_merker <= '0';
211
                        end if;
212
                    else
213
                        state <= read;
214
                        state_sig <= "101";
215
                        en <= '0';                       
216
                    end if;
217
                end if;
218
            end if;
219
        end if;
220
    end process;
221
 
222
    DDR2: ddr 
223
        port map (
224
          -- Inouts
225
          ddr2_dq,       --       : inout std_logic_vector(15 downto 0); 
226
          ddr2_dqs_p,    --       : inout std_logic_vector(1 downto 0); 
227
          ddr2_dqs_n,    --       : inout std_logic_vector(1 downto 0); 
228
          -- Outputs
229
          ddr2_addr,     --       : out   std_logic_vector(12 downto 0); 
230
          ddr2_ba,       --       : out   std_logic_vector(2 downto 0); 
231
          ddr2_ras_n,    --       : out   std_logic;                       
232
          ddr2_cas_n,    --       : out   std_logic;                       
233
          ddr2_we_n,     --       : out   std_logic;                       
234
          ddr2_ck_p,     --       : out   std_logic_vector(0 downto 0);    
235
          ddr2_ck_n,     --       : out   std_logic_vector(0 downto 0);    
236
          ddr2_cke,      --       : out   std_logic_vector(0 downto 0);    
237
          ddr2_cs_n,     --       : out   std_logic_vector(0 downto 0);    
238
          ddr2_dm,       --       : out   std_logic_vector(1 downto 0);    
239
          ddr2_odt,      --       : out   std_logic_vector(0 downto 0);    
240
          -- Inputs
241
          DDR_clk,      --OK        : in    std_logic;
242
          not Reset,    --OK        : in    std_logic;
243
          
244
          -- user interface signals
245
          addr & "000", --             : in    std_logic_vector(26 downto 0);
246
          cmd,--              : in    std_logic_vector(2 downto 0);
247
          en,--               : in    std_logic;
248
          wdf_data,--         : in    std_logic_vector(63 downto 0);
249
          wdf_end,--          : in    std_logic;
250
          "00000000",--wdf_mask,--         : in    std_logic_vector(7 downto 0);
251
          wdf_wren,--         : in    std_logic;
252
          rd_data,--          : out   std_logic_vector(63 downto 0);
253
          rd_data_end,--      : out   std_logic;
254
          rd_data_valid,--    : out   std_logic;
255
          rdy,--              : out   std_logic;
256
          wdf_rdy,--          : out   std_logic;
257
          '0',--            : in    std_logic;
258
          open,--           : out   std_logic;
259
          '0',--            : in    std_logic;
260
          open,--           : out   std_logic;
261
          '0',--            : in    std_logic;
262
          open,--           : out   std_logic;
263
          ui_clk,--                 : out   std_logic;
264
          ui_clk_sync_rst,--        : out   std_logic;
265
          "000000000000",--         : in    std_logic_vector(11 downto 0);
266
          init_calib_complete);--   : out   std_logic);
267
268
end Behavioral;

Grüße und vielen Dank
Matze

von Peter (Gast)


Lesenswert?

Matze schrieb:

> Zur Funktionsbeschreibung:
> Zunächst muss hierbei ein Eintakten von einem 100MHz Systemtackt auf dem
> 200MHZ UI-Clk des MIG erfolgen.

Nein, das Synchen kann man (wie auch das "c" im Takt) weglassen. Du 
konfigurierst den einfach auf 100 MHz = 1/4 DDr Takt.

Dann musst du über dein rdy nachdenken. Was ist wenn es von aussen 
einmal kommt und der CTRL noch nicht kann?


> Das DDR2-RAM wird wieder Deselektiert.
???

> Leider funktioniert dass nicht wirklich, habt ihr eine Idee, woran es
> liegen könnte, oder wie mann es richtig macht?

Schau mal, WAS so alles nicht funktioniert.

von Matze (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Peter schrieb:
> Nein, das Synchen kann man (wie auch das "c" im Takt) weglassen. Du
> konfigurierst den einfach auf 100 MHz = 1/4 DDr Takt.

Ja, dass könnte ich, doch dann müsste das gesamte Design mit dem UI-Clk 
des MIG getaktet werden?


Peter schrieb:
> Dann musst du über dein rdy nachdenken. Was ist wenn es von aussen
> einmal kommt und der CTRL noch nicht kann?

Die äußere Beschaltung wartet darauf dass mein DDR2_rdy wieder 1 wird, 
davor macht sie garnichts mit dem MIG.

Peter schrieb:
> Schau mal, WAS so alles nicht funktioniert.

Ich habe das Datenblatt nun nochmal ganz genau durchgesehen und den 
Entwurf danach verändert.

Problem ist nun, dass einige Werte 2 oder auch 3 mal geschreiben/gelesen 
werden.

Wie in der Abbildung zu sehen, ist beim schreiben wdf_wren zwei Zyklen 
lang auf 1.

Wie kann das Sein?
Denn in der konkreten Beschreibung sind wie beim Ablauf wie im 
beigefügten Bild beide Rdy-Signale des MIG dauerhaft auf 1.

Folglich müsste die abfrage auf wdf_rdy genauso wie dir Abfrage auf rdy 
schon beim 1. mal mit kommando angenommen erkannt werden.

Dennoch bleibt wdf_wren 2 Zyklen auf 1 was ein Doppeltes schreiben 
bedeuten würde?

Wie kann dass in diesem Abschnitt möglich sein?
1
                elsif state = cmd_cmd then  
2
                    if R_w = '0' then               -- Schreiben
3
                        cmd <= CMD_WRITE;
4
                        en <= '1';
5
                        addr <= address;
6
                        state <= cmd_wait_write;
7
                    else --R_w = '1'                -- Lesen
8
                        cmd <= CMD_READ;
9
                        en <= '1';
10
                        addr <= address;
11
                        state <= cmd_wait_read;
12
                    end if;
13
                elsif state = cmd_wait_write then   
14
                    if rdy = '1' then               --Kommando angenommen!
15
                        en <= '0';                  --Kommando absetzen
16
                        --Daten anlegen
17
                        wdf_data <= data_in;
18
                        wdf_wren <= '1';
19
                        wdf_end <= '1';
20
                        state <= cmd_wait_write_wait;
21
                    else                            --Kommando nicht angenommen
22
                        state <= cmd_cmd;               --Neuer Versuch
23
                    end if;
24
                elsif state = cmd_wait_write_wait then-- Wurde auch das Schreiben in den FIFO angenommen?
25
                    if wdf_rdy = '1' then           -- Daten wurden angenommen
26
                        -- Kommando deaktivieren
27
                        wdf_wren <= '0';
28
                        wdf_end <= '0';
29
                        state <= idle;              --Bereit für neues
30
                    else                            -- Keine Annahme --> Neuer versuch
31
                        state <= cmd_wait_write;
32
                    end if;

Hier noch der aktuelle Gesamtcode:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
Library UNISIM;
5
use UNISIM.vcomponents.all;
6
7
entity RAM_2_DDR is
8
    Port ( 
9
    DDR_clk             : in std_logic;
10
    ddr2_dq             : inout std_logic_vector(15 downto 0);
11
    ddr2_dm             : out std_logic_vector(1 downto 0);
12
    ddr2_dqs_p          : inout std_logic_vector(1 downto 0);
13
    ddr2_dqs_n          : inout std_logic_vector(1 downto 0); 
14
    ddr2_addr           : out std_logic_vector(12 downto 0);
15
    ddr2_ba             : out std_logic_vector(2 downto 0);
16
    ddr2_ck_p           : out   std_logic_vector(0 downto 0);
17
    ddr2_ck_n           : out   std_logic_vector(0 downto 0);
18
    ddr2_ras_n          : out   std_logic;
19
    ddr2_cas_n          : out   std_logic;
20
    ddr2_we_n           : out   std_logic;
21
    ddr2_cke            : out   std_logic_vector(0 downto 0);
22
    ddr2_odt            : out   std_logic_vector(0 downto 0);
23
    ddr2_cs_n           : out   std_logic_vector(0 downto 0);
24
    
25
    address             : in std_logic_vector(23 downto 0); --Addresse
26
    data_in             : in std_logic_vector(63 downto 0); --Schreib-Daten
27
    data_out            : out std_logic_vector(63 downto 0);--Lese_Daten
28
    R_w                 : in std_logic;                     --Write_en
29
    R_w_en              : in std_logic;                     --Read_enable
30
    
31
    DDR2_rdy            : out std_logic;                    --DDR2 controller bereit
32
    
33
    ui_clk_o            : out std_logic;
34
    Reset               : in STD_LOGIC;
35
    RES_out             : out STD_LOGIC;
36
    --Debug
37
    state_sig           : out STD_LOGIC_VECTOR(2 downto 0);
38
    wdf_rdy_sig         : out STD_LOGIC;
39
    rdy_sig             : out STD_LOGIC;
40
    cmd_sig             : out STD_LOGIC_VECTOR(2 downto 0);
41
    en_sig              : out STD_LOGIC;
42
    wdf_wren_sig        : out STD_LOGIC;
43
    wdf_data_sig        : out STD_LOGIC_VECTOR(63 downto 0);
44
    wdf_end_sig         : out STD_LOGIC;  
45
    rd_data_valid_sig   : out STD_LOGIC
46
    );
47
end RAM_2_DDR;
48
49
architecture Behavioral of RAM_2_DDR is
50
51
component ddr
52
   port (
53
      -- Inouts
54
      ddr2_dq              : inout std_logic_vector(15 downto 0); --
55
      ddr2_dqs_p           : inout std_logic_vector(1 downto 0); --
56
      ddr2_dqs_n           : inout std_logic_vector(1 downto 0); --
57
      -- Outputs
58
      ddr2_addr            : out   std_logic_vector(12 downto 0); --
59
      ddr2_ba              : out   std_logic_vector(2 downto 0); --
60
      ddr2_ras_n           : out   std_logic;                       --
61
      ddr2_cas_n           : out   std_logic;                       --
62
      ddr2_we_n            : out   std_logic;                       --
63
      ddr2_ck_p            : out   std_logic_vector(0 downto 0);    --
64
      ddr2_ck_n            : out   std_logic_vector(0 downto 0);    --
65
      ddr2_cke             : out   std_logic_vector(0 downto 0);    --
66
      ddr2_cs_n            : out   std_logic_vector(0 downto 0);    --
67
      ddr2_dm              : out   std_logic_vector(1 downto 0);    --
68
      ddr2_odt             : out   std_logic_vector(0 downto 0);    --
69
      -- Inputs
70
      sys_clk_i            : in    std_logic;
71
      sys_rst              : in    std_logic;
72
      -- user interface signals
73
      app_addr             : in    std_logic_vector(26 downto 0);
74
      app_cmd              : in    std_logic_vector(2 downto 0);
75
      app_en               : in    std_logic;
76
      app_wdf_data         : in    std_logic_vector(63 downto 0);
77
      app_wdf_end          : in    std_logic;
78
      app_wdf_mask         : in    std_logic_vector(7 downto 0);
79
      app_wdf_wren         : in    std_logic;
80
      app_rd_data          : out   std_logic_vector(63 downto 0);
81
      app_rd_data_end      : out   std_logic;
82
      app_rd_data_valid    : out   std_logic;
83
      app_rdy              : out   std_logic;
84
      app_wdf_rdy          : out   std_logic;
85
      app_sr_req           : in    std_logic;
86
      app_sr_active        : out   std_logic;
87
      app_ref_req          : in    std_logic;
88
      app_ref_ack          : out   std_logic;
89
      app_zq_req           : in    std_logic;
90
      app_zq_ack           : out   std_logic;
91
      ui_clk               : out   std_logic;
92
      ui_clk_sync_rst      : out   std_logic;
93
      device_temp_i        : in    std_logic_vector(11 downto 0);
94
      init_calib_complete  : out   std_logic);
95
end component;
96
97
signal addr     : std_logic_vector(23 downto 0);        --> Addressen
98
signal cmd      : std_logic_vector(2 downto 0);          --> Read = 001 / Write = 000 
99
signal en       : std_logic;                              --> Handshake Ack rdy
100
signal wdf_data : std_logic_vector(63 downto 0);    --> Write-Fifo
101
signal wdf_end  : std_logic;                         --> Daten in wdf_data nun zum letzten mal gültig 
102
signal wdf_mask : std_logic_vector(7 downto 0);     --> Welche Bits von WDF-Data geschriueben werden zusammenhängende 0-en auf Bytes setzen
103
signal wdf_wren : std_logic;                        --> Daten an wdf_data gültig
104
signal rd_data  : std_logic_vector(63 downto 0);     --> lese FIFO
105
signal rd_data_end : std_logic;                     --> Daten an rd_data sind letzten daten für aktuelle Anfrage 
106
signal rd_data_valid : std_logic;                   --> Daten an rd_data gültig
107
signal rdy      : std_logic;                             --> 
108
signal wdf_rdy  : std_logic;                     --> 
109
signal ui_clk   : std_logic;                      --> User-Interfce-CLK 
110
signal ui_clk_sync_rst : std_logic;             -->
111
signal init_calib_complete : std_logic;         --> Wenn controller Initialisiert --> 1
112
113
constant CMD_WRITE               : std_logic_vector(2 downto 0) := "000";
114
constant CMD_READ                : std_logic_vector(2 downto 0) := "001";
115
116
signal read_merker  : STD_LOGIC;
117
signal wdf_merker   : STD_LOGIC;
118
119
type statetype is (idle, cmd_cmd, cmd_wait_write, cmd_wait_read , cmd_wait_write_wait, RST);
120
signal state : statetype;
121
122
begin
123
    ui_clk_o <= ui_clk;
124
    wdf_rdy_sig     <= wdf_rdy; --: out STD_LOGIC;
125
    rdy_sig         <= rdy;     --: out STD_LOGIC;
126
    cmd_sig         <= cmd;     --: out STD_LOGIC_VECTOR(2 downto 0);
127
    en_sig          <= en;      --: out STD_LOGIC;
128
    wdf_wren_sig    <= wdf_wren;--: out STD_LOGIC;
129
    wdf_data_sig    <= wdf_data;--: out STD_LOGIC_VECTOR(63 downto 0);
130
    wdf_end_sig     <= wdf_end; --: out STD_LOGIC;
131
    rd_data_valid_sig <= rd_data_valid;
132
    p1: process(ui_clk, Reset)
133
    begin
134
        if Reset = '1' then
135
            RES_out <= '1';
136
            state <= RST;
137
        else --Reset = '0'
138
            if rising_edge(ui_clk) then
139
                if state = RST then
140
                    state_sig <= "000";
141
                    if ui_clk_sync_rst = '0' and init_calib_complete = '1' then
142
                        RES_out <= '0';
143
                        read_merker <= '0';
144
                        wdf_merker <= '0';
145
                        cmd <= CMD_READ;
146
                        en <= '0';
147
                        wdf_wren <= '0';
148
                        wdf_data <= x"0000000000000000";
149
                        wdf_end <= '0';                        
150
                        state <= idle;
151
                    end if;
152
                elsif state = idle then           --Idle
153
                    state_sig <= "001";                 
154
                    if rdy = '1' and wdf_rdy = '1' then -- MIG bereit
155
156
                        if R_w_en = '1' then
157
                            state <= cmd_cmd;
158
                            DDR2_rdy <= '0';--Controller bereit
159
                        else
160
                            DDR2_rdy <= '1';--Controller bereit
161
                        end if;
162
                   else
163
                        DDR2_rdy <= '0';                     --Controller ! bereit
164
                   end if;
165
                elsif state = cmd_cmd then  
166
                    if R_w = '0' then               -- Schreiben
167
                        cmd <= CMD_WRITE;
168
                        en <= '1';
169
                        addr <= address;
170
                        state <= cmd_wait_write;
171
                    else --R_w = '1'                -- Lesen
172
                        cmd <= CMD_READ;
173
                        en <= '1';
174
                        addr <= address;
175
                        state <= cmd_wait_read;
176
                    end if;
177
                elsif state = cmd_wait_write then   
178
                    if rdy = '1' then               --Kommando angenommen!
179
                        en <= '0';                  --Kommando absetzen
180
                        --Daten anlegen
181
                        wdf_data <= data_in;
182
                        wdf_wren <= '1';
183
                        wdf_end <= '1';
184
                        state <= cmd_wait_write_wait;
185
                    else                            --Kommando nicht angenommen
186
                        state <= cmd_cmd;               --Neuer Versuch
187
                    end if;
188
                elsif state = cmd_wait_write_wait then-- Wurde auch das Schreiben in den FIFO angenommen?
189
                    if wdf_rdy = '1' then           -- Daten wurden angenommen
190
                        -- Kommando deaktivieren
191
                        wdf_wren <= '0';
192
                        wdf_end <= '0';
193
                        state <= idle;              --Bereit für neues
194
                    else                            -- Keine Annahme --> Neuer versuch
195
                        state <= cmd_wait_write;
196
                    end if; 
197
                else-- state = cmd_wait_read then
198
                    if rdy = '1' then               --Kommando angenommen!
199
                        en <= '0';                  --Kommando absetzen
200
                        if rd_data_valid = '1' then --Wenn Daten gültig
201
                            data_out <= rd_data;
202
                            state <= idle;          
203
                        end if;
204
                    else                            -- Kommando nicht angenommen
205
                        state <= cmd_cmd;               -- Neuer Versuch
206
                    end if;
207
                end if;
208
            end if;
209
        end if;
210
    end process;
211
 
212
    DDR2: ddr 
213
        port map (
214
          -- Inouts
215
          ddr2_dq,       --       : inout std_logic_vector(15 downto 0); 
216
          ddr2_dqs_p,    --       : inout std_logic_vector(1 downto 0); 
217
          ddr2_dqs_n,    --       : inout std_logic_vector(1 downto 0); 
218
          -- Outputs
219
          ddr2_addr,     --       : out   std_logic_vector(12 downto 0); 
220
          ddr2_ba,       --       : out   std_logic_vector(2 downto 0); 
221
          ddr2_ras_n,    --       : out   std_logic;                       
222
          ddr2_cas_n,    --       : out   std_logic;                       
223
          ddr2_we_n,     --       : out   std_logic;                       
224
          ddr2_ck_p,     --       : out   std_logic_vector(0 downto 0);    
225
          ddr2_ck_n,     --       : out   std_logic_vector(0 downto 0);    
226
          ddr2_cke,      --       : out   std_logic_vector(0 downto 0);    
227
          ddr2_cs_n,     --       : out   std_logic_vector(0 downto 0);    
228
          ddr2_dm,       --       : out   std_logic_vector(1 downto 0);    
229
          ddr2_odt,      --       : out   std_logic_vector(0 downto 0);    
230
          -- Inputs
231
          DDR_clk,      --OK        : in    std_logic;
232
          not Reset,    --OK        : in    std_logic;
233
          
234
          -- user interface signals
235
          addr & "000", --             : in    std_logic_vector(26 downto 0);
236
          cmd,--              : in    std_logic_vector(2 downto 0);
237
          en,--               : in    std_logic;
238
          wdf_data,--         : in    std_logic_vector(63 downto 0);
239
          wdf_end,--          : in    std_logic;
240
          "00000000",--wdf_mask,--         : in    std_logic_vector(7 downto 0);
241
          wdf_wren,--         : in    std_logic;
242
          rd_data,--          : out   std_logic_vector(63 downto 0);
243
          rd_data_end,--      : out   std_logic;
244
          rd_data_valid,--    : out   std_logic;
245
          rdy,--              : out   std_logic;
246
          wdf_rdy,--          : out   std_logic;
247
          '0',--            : in    std_logic;
248
          open,--           : out   std_logic;
249
          '0',--            : in    std_logic;
250
          open,--           : out   std_logic;
251
          '0',--            : in    std_logic;
252
          open,--           : out   std_logic;
253
          ui_clk,--                 : out   std_logic;
254
          ui_clk_sync_rst,--        : out   std_logic;
255
          "000000000000",--         : in    std_logic_vector(11 downto 0);
256
          init_calib_complete);--   : out   std_logic);
257
258
end Behavioral;

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.