16c9694eeb157e401695f5ef1639405e7c3bbe95
[bos2k9.git] / bos2k9_t.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- Testing the top level entity.
5 -----------------------------------------------------------------------
6
7 use work.bos2k9_globals.all;
8
9 library fhw_tools;
10 use fhw_tools.types.all;
11
12 library ieee;
13 use ieee.std_logic_1164.all;
14 use ieee.numeric_std.all;
15
16 use std.textio.all;
17 use work.txt_util.all;
18
19 -----------------------------------------------------------------------
20
21 entity bos2k9_t is
22   generic(
23     clock_interval : time   := clock_interval_c;
24     spi_filename   : string := "bos2k9_t.dat");
25 end bos2k9_t;
26
27 -----------------------------------------------------------------------
28
29 architecture test of bos2k9_t is
30
31   component bos2k9 is
32     port(
33       CLOCK_50 : in std_logic;
34     
35       KEY  : in  std_logic_vector(3 downto 0);
36       SW   : in  std_logic_vector(17 downto 0);
37       LEDR : out std_logic_vector(17 downto 0);
38       LEDG : out std_logic_vector(8 downto 0);
39     
40       SD_DAT  : in  std_logic;
41       SD_DAT3 : out std_logic;
42       SD_CMD  : out std_logic;
43       SD_CLK  : out std_logic);
44   end component;
45
46   file   spi_file : text open read_mode is spi_filename;
47   signal test_s   : integer;
48   
49   signal clock_s  : std_logic;
50   signal reset_s  : std_logic;
51   
52   signal KEY_s      : std_logic_vector(3 downto 0);
53   signal SW_s       : std_logic_vector(17 downto 0);
54   signal LEDR_s     : std_logic_vector(17 downto 0);
55   signal LEDG_s     : std_logic_vector(8 downto 0);
56   signal SD_DAT_s   : std_logic;
57   signal SD_DAT3_s  : std_logic;
58   signal SD_CMD_s   : std_logic;
59   signal SD_CLK_s   : std_logic;
60   
61   signal start_n : std_logic;
62   signal txd_s   : std_logic_byte_t;
63   signal rxd_s   : std_logic_byte_t;
64   signal spi_s   : spi_bus_t;
65   
66   signal simo_s  : std_logic_byte_t;
67 begin
68   dut : bos2k9 port map(clock_s,
69     KEY_s,
70     SW_s,
71     LEDR_s,
72     LEDG_s,
73     SD_DAT_s,
74     SD_DAT3_s,
75     SD_CMD_s,
76     SD_CLK_s);
77   SD_DAT_s   <= spi_s.miso;
78   spi_s.mosi <= SD_CMD_s;
79   spi_s.sck  <= SD_CLK_s;
80   spi_s.cs   <= SD_DAT3_s;
81   
82   stimulus : process
83   begin
84     
85   
86     
87     wait;
88   end process;
89   
90   slave : process
91     variable line_v  : line;
92     variable input_v : string(1 to 16);
93     variable count_v : integer;
94     variable index_v : integer;
95     variable data_v  : std_logic_byte_t;
96   begin
97     rxd_s      <= (others => 'U');
98     spi_s.miso <= 'Z';
99   
100     wait until falling_edge(spi_s.cs);
101     
102     readline(spi_file, line_v);
103     read(line_v, input_v);
104     rxd_s <= to_std_logic_vector(input_v(1 to 8));
105     txd_s <= to_std_logic_vector(input_v(9 to 16));
106     
107     index_v := 7;
108     count_v := 0;
109     wait until falling_edge(spi_s.cs);
110     data_v := rxd_s;
111     spi_s.miso <= 
112     miso_s  <= rxd_pattern(index_v);
113     
114     while spi_s.cs = '0' loop
115       wait until sck_s'event or ss_n'event;
116       if not (index_v = -1) then
117         count_v := count_v + 1;
118         -- Latch on odd edges, shift on even
119         if (count_v mod 2) = 1 then
120           rxd_s(0) <= spi_s.mosi;
121           index_v := index_v - 1;
122         else
123           rxd_s      <= rxd_s(6 downto 0) & rxd_s(7);
124           spi_s.miso <= rxd_pattern(index_v);
125         end if;
126       end if;
127     end loop;
128     
129     assert simo_s = data_v      report "neq:txd";
130     assert rxd_s  = rxd_pattern report "neq:rxd";
131     wait until falling_edge(clock_s);
132   end process;
133   
134   reset : process
135   begin
136     reset_s <= '1';
137     wait until rising_edge(clock_s);
138     wait until rising_edge(clock_s);
139     reset_s <= '0';
140     wait;
141   end process;
142   
143   clock : process
144   begin
145     clock_s <= '0';
146     wait for clock_interval / 2;
147     clock_s <= '1';
148     wait for clock_interval / 2;
149   end process;
150   
151 end test;