]> rtime.felk.cvut.cz Git - fpga/uart.git/blob - tb/tb_uart.vhd
Receiving capability added to the top component.
[fpga/uart.git] / tb / tb_uart.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
5
6 entity tb_uart is
7 end tb_uart;
8
9
10 architecture testbench of tb_uart is
11
12   component uart is
13     generic (
14       output_fifo_width : integer := 2;
15       input_fifo_width  : integer := 2
16     );
17     port (
18       mclk        : in  std_logic;
19       per_addr    : in  std_logic_vector (7  downto 0);
20       per_din     : in  std_logic_vector (15 downto 0);
21       per_en      : in  std_logic;
22       per_wen     : in  std_logic_vector (1  downto 0);
23       puc         : in  std_logic;
24       per_irq_acc : in  std_logic;
25       per_irq     : out std_logic;
26       per_dout    : out std_logic_vector (15 downto 0);
27
28       rxd         : in  std_logic;
29       txd         : out std_logic
30     );
31   end component;  
32   
33   signal clk   : std_logic;
34   signal reset : std_logic;
35   
36   constant period : time := 200 ns;
37   constant offset : time := 2 * period;
38
39
40   signal per_addr : std_logic_vector (7  downto 0);
41   signal per_din  : std_logic_vector (15 downto 0);
42   signal per_en   : std_logic;
43   signal per_wen  : std_logic_vector (1  downto 0);
44   signal per_dout : std_logic_vector (15 downto 0);
45   signal per_irq  : std_logic;
46
47   signal rxd      : std_logic;
48   signal txd      : std_logic;
49
50
51   type per_test_record is record
52     we   : std_logic;
53     word : std_logic;
54     data : std_logic_vector (15 downto 0);
55     addr : std_logic_vector (15 downto 0);
56   end record;
57   
58   type per_test_array is array (positive range <>) of per_test_record;
59   type rxd_test_array is array (positive range <>) of std_logic_vector (7 downto 0);
60   
61   constant addr_offset : std_logic_vector (15 downto 0) := X"0100";
62   
63   constant per_test_vectors : per_test_array := (
64     ('1','1',X"0002",X"0000"),
65     ('1','0',X"0065",X"0002")
66   );
67
68   constant rxd_test_vectors : rxd_test_array := (
69     "01000011",
70     "01000100"
71   );
72
73 --------------------------------------------------------------------------------
74
75 begin
76   UUT : uart port map (
77     mclk        => clk,
78     per_addr    => per_addr,
79     per_din     => per_din,
80     per_en      => per_en,
81     per_wen     => per_wen,
82     puc         => reset,
83     per_irq_acc => '0',
84     per_irq     => per_irq,
85     per_dout    => per_dout,
86     
87     rxd         => rxd,
88     txd         => txd
89   );
90
91   
92   -- Clock generation
93   process
94   begin
95     clk <= '0';
96     wait for offset;
97     
98     loop
99       clk <= '1';
100       wait for period/2;
101       clk <= '0';
102       wait for period/2;
103     end loop;
104   end process;
105
106   
107   -- Reset generation
108   process
109   begin
110     reset <= '0';
111     wait for period;
112     reset <= '1';
113     wait for period;
114     reset <= '0';
115     wait;
116   end process;
117
118   
119   -- Bus communication with UART peripherial (per_test_vector)
120   process
121     variable vector : per_test_record;
122   begin
123     per_addr <= X"00";
124     per_din  <= X"0000";
125     per_en   <= '0';
126     per_wen  <= "00";
127
128     wait for 3.1 * period;
129
130
131     for i in per_test_vectors'range loop
132       vector := per_test_vectors(i);
133       vector.addr := vector.addr + addr_offset;
134       
135       per_addr <= vector.addr (8 downto 1);
136       per_en <= '1';
137     
138       if (vector.word = '1') then
139         per_wen <= "11";
140         per_din <= vector.data (15 downto 0);
141         
142       else    
143         if (vector.addr(0) = '1') then
144           per_wen <= "10";
145           per_din <= vector.data (7 downto 0) & "00000000";
146         else
147           per_wen <= "01";
148           per_din <= "00000000" & vector.data (7 downto 0);
149         end if;
150       end if;
151       
152       wait for period;
153       
154       per_addr <= X"00";
155       per_din <= X"0000";
156       per_en <= '0';
157       per_wen <= "00";
158     end loop;
159
160     wait;
161   end process;
162
163
164   -- UART RXD signal generation (rxd_test_vector)
165   process
166     constant baud_period : time := 6 * period;
167     constant extra_wait  : time := 2 * baud_period;  -- waiting between frames
168     variable vector      : std_logic_vector (7 downto 0);
169   begin
170     rxd <= '1';
171
172     wait for 4.1 * period;
173
174     for i in rxd_test_vectors'range loop
175       vector := rxd_test_vectors (i);
176
177       rxd <= '0';
178       wait for baud_period;
179
180       for j in 7 downto 0 loop
181         rxd <= vector (j);
182         wait for baud_period;
183       end loop;
184
185       rxd <= '1';
186       wait for baud_period;
187       wait for extra_wait;
188     end loop;
189
190     wait;      
191   end process;
192   
193 end testbench;
194