OpenCores
URL https://opencores.org/ocsvn/spiflashcontroller/spiflashcontroller/trunk

Subversion Repositories spiflashcontroller

[/] [spiflashcontroller/] [trunk/] [tb_spi_ctrl.vhd] - Blame information for rev 8

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 johannesha
 
2
library ieee;
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.all;
5
 
6
entity test_spi_ctrl is
7
end test_spi_ctrl;
8
 
9
architecture test of test_spi_ctrl is
10 6 johannesha
  signal rst, clk, sel, rd, wr : std_logic;
11
  signal addr : std_logic_vector (2 downto 0);
12 2 johannesha
  signal spi_clk, spi_cs, spi_din, spi_dout : std_logic;
13
  signal d_in, d_out, stat, data : std_logic_vector (7 downto 0);
14
  -- FLASH commands
15
  constant NOP  : std_logic_vector (7 downto 0) := x"FF";  -- no cmd to execute
16
  constant WREN : std_logic_vector (7 downto 0) := x"06";  -- write enable
17
  constant WRDI : std_logic_vector (7 downto 0) := x"04";  -- write disable
18
  constant RDSR : std_logic_vector (7 downto 0) := x"05";  -- read status reg
19
  constant WRSR : std_logic_vector (7 downto 0) := x"01";  -- write stat. reg
20 6 johannesha
  constant RDCMD: std_logic_vector (7 downto 0) := x"03";  -- read data
21 2 johannesha
  constant F_RD : std_logic_vector (7 downto 0) := x"0B";  -- fast read data
22
  constant PP :   std_logic_vector (7 downto 0) := x"02";  -- page program
23
  constant SE :   std_logic_vector (7 downto 0) := x"D8";  -- sector erase
24
  constant BE :   std_logic_vector (7 downto 0) := x"C7";  -- bulk erase
25
  constant DP :   std_logic_vector (7 downto 0) := x"B9";  -- deep power down
26
  constant RES :  std_logic_vector (7 downto 0) := x"AB";  -- read signature
27
 
28
  -- status register bit masks
29
  constant STAT_BUSY : std_logic_vector (7 downto 0) := x"01";
30
  constant STAT_TXE :  std_logic_vector (7 downto 0) := x"02";
31
  constant STAT_RXR :  std_logic_vector (7 downto 0) := x"04";
32
  constant STAT_WDAT : std_logic_vector (7 downto 0) := x"08";
33
begin
34
  dut : entity work.spi_ctrl port map (
35 6 johannesha
    clk_in => clk,
36 2 johannesha
    rst => rst,
37
    spi_clk => spi_clk,
38
    spi_cs => spi_cs,
39
    spi_din => spi_din,
40
    spi_dout => spi_dout,
41
    sel => sel,
42 6 johannesha
    wr => wr,
43 2 johannesha
    addr => addr,
44
    d_in => d_in,
45
    d_out => d_out
46
  );
47
 
48
  process is
49
  begin
50 6 johannesha
    clk <= '0'; wait for 20 ns;
51
    clk <= '1'; wait for 20 ns;
52 2 johannesha
  end process;
53 6 johannesha
 
54 2 johannesha
  process is
55
  begin
56
    rst <= '0'; wait for 50 ns;
57
    rst <= '1'; wait for 120 ns;
58
    rst <= '0';
59
    wait;
60
  end process;
61
 
62
  process
63
  begin
64
    -- initial condition
65 6 johannesha
    sel <= '0'; addr <= "000"; rd <= '0'; wr <= '0'; d_in <= x"FF";
66 2 johannesha
    wait for 1420 ns;
67
 
68
    -- write command WREN
69 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= WREN; wait for 5 ns;
70
    wr <= '1'; wait for 100 ns;
71
    wr <= '0'; wait for 5 ns;
72 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 2 us;
73
 
74
    -- write command WRDI
75 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= WRDI; wait for 5 ns;
76
    wr <= '1'; wait for 100 ns;
77
    wr <= '0'; wait for 5 ns;
78 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 2 us;
79
 
80
    -- write command WRSR: data
81 6 johannesha
    sel <= '1'; addr <= "000"; d_in <= x"55"; wait for 5 ns;
82
    wr <= '1'; wait for 100 ns;
83
    wr <= '0'; wait for 5 ns;
84 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
85
    -- the command
86 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= WRSR; wait for 5 ns;
87
    wr <= '1'; wait for 100 ns;
88
    wr <= '0'; wait for 5 ns;
89 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 4 us;
90
 
91 6 johannesha
    -- write command SE:
92 2 johannesha
    -- address low
93 6 johannesha
    sel <= '1'; addr <= "010"; d_in <= x"AB"; wait for 5 ns;
94
    wr <= '1'; wait for 100 ns;
95
    wr <= '0'; wait for 5 ns;
96 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
97 6 johannesha
    --address mid
98
    sel <= '1'; addr <= "011"; d_in <= x"CD"; wait for 5 ns;
99
    wr <= '1'; wait for 100 ns;
100
    wr <= '0'; wait for 5 ns;
101
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
102
    -- address high
103
    sel <= '1'; addr <= "100"; d_in <= x"EF"; wait for 5 ns;
104
    wr <= '1'; wait for 100 ns;
105
    wr <= '0'; wait for 5 ns;
106
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
107 2 johannesha
    -- the command
108 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= SE; wait for 5 ns;
109
    wr <= '1'; wait for 100 ns;
110
    wr <= '0'; wait for 5 ns;
111 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 6.5 us;
112
 
113 6 johannesha
    -- write command PP:
114 2 johannesha
    -- address low
115 6 johannesha
    sel <= '1'; addr <= "010"; d_in <= x"45"; wait for 5 ns;
116
    wr <= '1'; wait for 100 ns;
117
    wr <= '0'; wait for 5 ns;
118 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
119 6 johannesha
    -- address mid
120
    sel <= '1'; addr <= "011"; d_in <= x"67"; wait for 5 ns;
121
    wr <= '1'; wait for 100 ns;
122
    wr <= '0'; wait for 5 ns;
123
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
124
    -- address high
125
    sel <= '1'; addr <= "100"; d_in <= x"89"; wait for 5 ns;
126
    wr <= '1'; wait for 100 ns;
127
    wr <= '0'; wait for 5 ns;
128
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
129 2 johannesha
    -- the command
130 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= PP; wait for 5 ns;
131
    wr <= '1'; wait for 100 ns;
132
    wr <= '0'; wait for 5 ns;
133 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 100 ns;
134
    -- some data
135
    for i in 0 to 20 loop
136
      -- wait for tx_empty
137
      stat <= x"00"; wait for 10 ns;
138
      while (stat and STAT_WDAT) /= STAT_WDAT loop
139 6 johannesha
        sel <= '1'; addr <= "001"; wait for 5 ns;
140
        rd <= '1'; wait for 100 ns;
141
        stat <= d_out; rd <= '0'; wait for 5 ns;
142 2 johannesha
        sel <= '0'; wait for 1 us;
143
      end loop;
144
      -- write new data
145 6 johannesha
      sel <= '1'; addr <= "000";
146 2 johannesha
      d_in <= std_logic_vector(TO_UNSIGNED(i, d_in'Length)); wait for 5 ns;
147 6 johannesha
      wr <= '1'; wait for 100 ns;
148
      wr <= '0'; wait for 5 ns;
149 2 johannesha
      sel <= '0'; d_in <= x"FF"; wait for 1 us;
150
    end loop;
151
    -- send one more byte
152
    wait for 10 us;
153 6 johannesha
    sel <= '1'; addr <= "000"; d_in <= x"AA"; wait for 5 ns;
154
    wr <= '1'; wait for 100 ns;
155
    wr <= '0'; wait for 5 ns;
156 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 1 us;
157
    -- write the NOP command to terminate
158 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= NOP; wait for 5 ns;
159
    wr <= '1'; wait for 100 ns;
160
    wr <= '0'; wait for 5 ns;
161 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 100 ns;
162
 
163
    wait for 40 us;
164
 
165
    -- now receive something, cmd RDSR
166 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= RDSR; wait for 5 ns;
167
    wr <= '1'; wait for 100 ns;
168
    wr <= '0'; wait for 5 ns;
169 2 johannesha
    sel <= '0'; d_in <= x"FF";
170
    -- poll for rx_ready
171
    stat <= x"00"; wait for 10 ns;
172
    while (stat and STAT_RXR) /= STAT_RXR loop
173
      wait for 200 ns;
174 6 johannesha
      sel <= '1'; addr <= "001"; wait for 5 ns;
175
      rd <= '1'; wait for 100 ns;
176
      stat <= d_out; rd <= '0'; wait for 5 ns;
177 2 johannesha
      sel <= '0';
178
    end loop;
179
    wait for 100 ns;
180
    -- read the data            
181 6 johannesha
    sel <= '1'; addr <= "000"; wait for 5 ns;
182
    rd <= '1'; wait for 100 ns;
183
    data <= d_out; rd <= '0'; wait for 5 ns;
184 2 johannesha
    sel <= '0'; wait for 1.5 us;
185
 
186
    -- RES command
187 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= RES; wait for 5 ns;
188
    wr <= '1'; wait for 100 ns;
189
    wr <= '0'; wait for 5 ns;
190 2 johannesha
    sel <= '0'; d_in <= x"FF";
191
    -- poll for rx_ready
192
    stat <= x"00"; wait for 10 ns;
193
    while (stat and STAT_RXR) /= STAT_RXR loop
194
      wait for 200 ns;
195 6 johannesha
      sel <= '1'; addr <= "001"; wait for 5 ns;
196
      rd <= '1'; wait for 100 ns;
197
      stat <= d_out; rd <= '0'; wait for 5 ns;
198 2 johannesha
      sel <= '0';
199
    end loop;
200
    wait for 100 ns;
201
    -- read the data
202 6 johannesha
    sel <= '1'; addr <= "000"; wait for 5 ns;
203
    rd <= '1'; wait for 100 ns;
204
    data <= d_out; rd <= '0'; wait for 5 ns;
205 2 johannesha
    sel <= '0'; wait for 1.5 us;
206
 
207
    -- READ command
208
    -- address low
209 6 johannesha
    sel <= '1'; addr <= "010"; d_in <= x"12"; wait for 5 ns;
210
    wr <= '1'; wait for 100 ns;
211
    wr <= '0'; wait for 5 ns;
212 2 johannesha
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
213 6 johannesha
    -- address mid
214
    sel <= '1'; addr <= "011"; d_in <= x"34"; wait for 5 ns;
215
    wr <= '1'; wait for 100 ns;
216
    wr <= '0'; wait for 5 ns;
217
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
218
    -- address high
219
    sel <= '1'; addr <= "100"; d_in <= x"56"; wait for 5 ns;
220
    wr <= '1'; wait for 100 ns;
221
    wr <= '0'; wait for 5 ns;
222
    sel <= '0'; d_in <= x"FF"; wait for 10 ns;
223 2 johannesha
    -- the command
224 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= RDCMD; wait for 5 ns;
225
    wr <= '1'; wait for 100 ns;
226
    wr <= '0'; wait for 5 ns;
227 2 johannesha
    sel <= '0'; d_in <= x"FF";
228
    -- read data
229
    for i in 1 to 10 loop
230
      -- poll for rx_ready
231
      stat <= x"00"; wait for 10 ns;
232
      while (stat and STAT_RXR) /= STAT_RXR loop
233
        wait for 200 ns;
234 6 johannesha
        sel <= '1'; addr <= "001"; wait for 5 ns;
235
        rd <= '1'; wait for 100 ns;
236
        stat <= d_out; rd <= '0'; wait for 5 ns;
237 2 johannesha
        sel <= '0';
238
      end loop;
239
      wait for 100 ns;
240
      -- read the data
241 6 johannesha
      sel <= '1'; addr <= "000"; wait for 5 ns;
242
      rd <= '1'; wait for 100 ns;
243
      data <= d_out; rd <= '0'; wait for 5 ns;
244 2 johannesha
      sel <= '0';
245
    end loop;
246
    wait for 1 us;
247
    -- write the NOP command to terminate
248 6 johannesha
    sel <= '1'; addr <= "001"; d_in <= NOP; wait for 5 ns;
249
    wr <= '1'; wait for 100 ns;
250
    wr <= '0'; wait for 5 ns;
251 2 johannesha
    sel <= '0'; d_in <= x"FF";
252
 
253
    wait;
254
  end process;
255
 
256
  process
257
  begin
258 6 johannesha
    spi_din <= '1'; wait for 144.880 us;
259 2 johannesha
 
260
    -- input data for RDSR cmd 0x54
261
    spi_din <= '0'; wait for 160 ns;
262
    spi_din <= '1'; wait for 160 ns;
263
    spi_din <= '0'; wait for 160 ns;
264
    spi_din <= '1'; wait for 160 ns;
265
    spi_din <= '0'; wait for 160 ns;
266
    spi_din <= '1'; wait for 160 ns;
267
    spi_din <= '0'; wait for 160 ns;
268
    spi_din <= '0'; wait for 160 ns;
269
 
270 6 johannesha
    spi_din <= '1'; wait for 7.68 us;
271 2 johannesha
 
272
    -------------------------------
273
 
274
    -- input data for RES cmd 0xAB
275
    spi_din <= '1'; wait for 160 ns;
276
    spi_din <= '0'; wait for 160 ns;
277
    spi_din <= '1'; wait for 160 ns;
278
    spi_din <= '0'; wait for 160 ns;
279
    spi_din <= '1'; wait for 160 ns;
280
    spi_din <= '0'; wait for 160 ns;
281
    spi_din <= '1'; wait for 160 ns;
282
    spi_din <= '1'; wait for 160 ns;
283
 
284 6 johannesha
    spi_din <= '1'; wait for 8.0 us;
285 2 johannesha
 
286
    -------------------------------
287
 
288
    -- input data for RD cmd 0x01
289
    spi_din <= '0'; wait for 160 ns;
290
    spi_din <= '0'; wait for 160 ns;
291
    spi_din <= '0'; wait for 160 ns;
292
    spi_din <= '0'; wait for 160 ns;
293
    spi_din <= '0'; wait for 160 ns;
294
    spi_din <= '0'; wait for 160 ns;
295
    spi_din <= '0'; wait for 160 ns;
296
    spi_din <= '1'; wait for 160 ns;
297
 
298 6 johannesha
    spi_din <= '1'; wait for 480 ns;
299 2 johannesha
 
300
    -- input data for RD cmd 0x02
301
    spi_din <= '0'; wait for 160 ns;
302
    spi_din <= '0'; wait for 160 ns;
303
    spi_din <= '0'; wait for 160 ns;
304
    spi_din <= '0'; wait for 160 ns;
305
    spi_din <= '0'; wait for 160 ns;
306
    spi_din <= '0'; wait for 160 ns;
307
    spi_din <= '1'; wait for 160 ns;
308
    spi_din <= '0'; wait for 160 ns;
309
 
310
    spi_din <= '1'; wait for 480 ns;
311
 
312
    -- input data for RD cmd 0x03
313
    spi_din <= '0'; wait for 160 ns;
314
    spi_din <= '0'; wait for 160 ns;
315
    spi_din <= '0'; wait for 160 ns;
316
    spi_din <= '0'; wait for 160 ns;
317
    spi_din <= '0'; wait for 160 ns;
318
    spi_din <= '0'; wait for 160 ns;
319
    spi_din <= '1'; wait for 160 ns;
320
    spi_din <= '1'; wait for 160 ns;
321
 
322
    spi_din <= '1'; wait for 480 ns;
323
 
324
    -- input data for RD cmd 0x04
325
    spi_din <= '0'; wait for 160 ns;
326
    spi_din <= '0'; wait for 160 ns;
327
    spi_din <= '0'; wait for 160 ns;
328
    spi_din <= '0'; wait for 160 ns;
329
    spi_din <= '0'; wait for 160 ns;
330
    spi_din <= '1'; wait for 160 ns;
331
    spi_din <= '0'; wait for 160 ns;
332
    spi_din <= '0'; wait for 160 ns;
333
 
334 6 johannesha
    spi_din <= '1'; wait for 480 ns;
335 2 johannesha
 
336
    -- input data for RD cmd 0x05
337
    spi_din <= '0'; wait for 160 ns;
338
    spi_din <= '0'; wait for 160 ns;
339
    spi_din <= '0'; wait for 160 ns;
340
    spi_din <= '0'; wait for 160 ns;
341
    spi_din <= '0'; wait for 160 ns;
342
    spi_din <= '1'; wait for 160 ns;
343
    spi_din <= '0'; wait for 160 ns;
344
    spi_din <= '1'; wait for 160 ns;
345
 
346 6 johannesha
    spi_din <= '1'; wait for 480 ns;
347 2 johannesha
 
348
    -- input data for RD cmd 0x06
349
    spi_din <= '0'; wait for 160 ns;
350
    spi_din <= '0'; wait for 160 ns;
351
    spi_din <= '0'; wait for 160 ns;
352
    spi_din <= '0'; wait for 160 ns;
353
    spi_din <= '0'; wait for 160 ns;
354
    spi_din <= '1'; wait for 160 ns;
355
    spi_din <= '1'; wait for 160 ns;
356
    spi_din <= '0'; wait for 160 ns;
357
 
358 6 johannesha
    spi_din <= '1'; wait for 640 ns;
359 2 johannesha
 
360
    -- input data for RD cmd 0x07
361
    spi_din <= '0'; wait for 160 ns;
362
    spi_din <= '0'; wait for 160 ns;
363
    spi_din <= '0'; wait for 160 ns;
364
    spi_din <= '0'; wait for 160 ns;
365
    spi_din <= '0'; wait for 160 ns;
366
    spi_din <= '1'; wait for 160 ns;
367
    spi_din <= '1'; wait for 160 ns;
368
    spi_din <= '1'; wait for 160 ns;
369
 
370 6 johannesha
    spi_din <= '1'; wait for 480 ns;
371 2 johannesha
 
372
    -- input data for RD cmd 0x08
373
    spi_din <= '0'; wait for 160 ns;
374
    spi_din <= '0'; wait for 160 ns;
375
    spi_din <= '0'; wait for 160 ns;
376
    spi_din <= '0'; wait for 160 ns;
377
    spi_din <= '1'; wait for 160 ns;
378
    spi_din <= '0'; wait for 160 ns;
379
    spi_din <= '0'; wait for 160 ns;
380
    spi_din <= '0'; wait for 160 ns;
381
 
382 6 johannesha
    spi_din <= '1'; wait for 480 ns;
383 2 johannesha
 
384
    -- input data for RD cmd 0x09
385
    spi_din <= '0'; wait for 160 ns;
386
    spi_din <= '0'; wait for 160 ns;
387
    spi_din <= '0'; wait for 160 ns;
388
    spi_din <= '0'; wait for 160 ns;
389
    spi_din <= '1'; wait for 160 ns;
390
    spi_din <= '0'; wait for 160 ns;
391
    spi_din <= '0'; wait for 160 ns;
392
    spi_din <= '1'; wait for 160 ns;
393
 
394 6 johannesha
    spi_din <= '1'; wait for 480 ns;
395 2 johannesha
 
396
    -- input data for RD cmd 0x0A
397
    spi_din <= '0'; wait for 160 ns;
398
    spi_din <= '0'; wait for 160 ns;
399
    spi_din <= '0'; wait for 160 ns;
400
    spi_din <= '0'; wait for 160 ns;
401
    spi_din <= '1'; wait for 160 ns;
402
    spi_din <= '0'; wait for 160 ns;
403
    spi_din <= '1'; wait for 160 ns;
404
    spi_din <= '0'; wait for 160 ns;
405
 
406
    spi_din <= '1';
407
 
408
    wait;
409
  end process;
410
end test;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.