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