]> rtime.felk.cvut.cz Git - fpga/uart.git/blob - tb/tb_uart.vhd
First working prototype of HW UART - TX part.
[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
15     );
16     port (
17       mclk        : in  std_logic;
18       per_addr    : in  std_logic_vector (7  downto 0);
19       per_din     : in  std_logic_vector (15 downto 0);
20       per_en      : in  std_logic;
21       per_wen     : in  std_logic_vector (1  downto 0);
22       puc         : in  std_logic;
23       --per_irq_acc : in  std_logic;
24       --per_irq     : out std_logic;
25       per_dout    : out std_logic_vector (15 downto 0);
26
27       txd         : out std_logic
28     );
29   end component;  
30   
31   signal clk   : std_logic;
32   signal reset : std_logic;
33   
34   constant period : time := 1 us;
35   constant offset : time := 2 us;
36
37
38   signal per_addr : std_logic_vector (7  downto 0);
39   signal per_din  : std_logic_vector (15 downto 0);
40   signal per_en   : std_logic;
41   signal per_wen  : std_logic_vector (1  downto 0);
42   signal per_dout : std_logic_vector (15 downto 0);
43
44   signal txd      : std_logic;
45
46
47   type test_record is record
48     we : std_logic;
49     word : std_logic;
50     data : std_logic_vector (15 downto 0);
51     addr : std_logic_vector (15 downto 0);
52   end record;
53   
54   type test_array is array (positive range <>) of test_record;
55   
56   constant test_vectors : test_array := (
57     ('1','1',X"0002",X"0100"),
58     ('1','0',X"0065",X"0102")
59   );
60
61 --------------------------------------------------------------------------------
62
63 begin
64   UUT : uart port map (
65     mclk      => clk,
66     per_addr  => per_addr,
67     per_din   => per_din,
68     per_en    => per_en,
69     per_wen   => per_wen,
70     puc       => reset,
71     per_dout  => per_dout,
72
73     txd       => txd
74   );
75
76
77   process
78   begin
79     clk <= '0';
80     wait for offset;
81     
82     loop
83       clk <= '1';
84       wait for period/2;
85       clk <= '0';
86       wait for period/2;
87     end loop;
88   end process;
89
90
91   process
92   begin
93     reset <= '0';
94     wait for period;
95     reset <= '1';
96     wait for period;
97     reset <= '0';
98     wait;
99   end process;
100
101
102   process
103     variable vector : test_record;
104   begin
105     per_addr <= X"00";
106     per_din  <= X"0000";
107     per_en   <= '0';
108     per_wen  <= "00";
109
110     wait for 3.1 * period;
111
112
113     for i in test_vectors'range loop
114       vector := test_vectors(i);
115
116       per_addr <= vector.addr (8 downto 1);
117       per_en <= '1';
118     
119       if (vector.word = '1') then
120         per_wen <= "11";
121         per_din <= vector.data (15 downto 0);
122         
123       else    
124         if (vector.addr(0) = '1') then
125           per_wen <= "10";
126           per_din <= vector.data (7 downto 0) & "00000000";
127         else
128           per_wen <= "01";
129           per_din <= "00000000" & vector.data (7 downto 0);
130         end if;
131       end if;
132       
133       wait for period;
134       
135       per_addr <= X"00";
136       per_din <= X"0000";
137       per_en <= '0';
138       per_wen <= "00";
139     end loop;
140
141     wait;
142   end process;
143   
144 end testbench;
145