uart_rx: ein prozessmodell. spart weitere 3 logic elements :P
[hwmod.git] / src / beh_loopback_tb.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
4 use work.gen_pkg.all;
5
6 entity beh_loopback_tb is
7 end entity beh_loopback_tb;
8
9 architecture sim of beh_loopback_tb is
10         constant CLK_FREQ : integer := 33000000;
11         constant BAUDRATE : integer := 115200;
12         constant BAUD : integer := CLK_FREQ/BAUDRATE;
13
14         signal sys_clk, sys_res_n, rxd, rx_new : std_logic;
15         signal rx_data : std_logic_vector (7 downto 0);
16         signal txd, tx_new, tx_done : std_logic;
17         signal tx_data : std_logic_vector (7 downto 0);
18         signal stop : boolean := false;
19 begin
20         inst_rx : uart_rx
21         generic map (
22                 CLK_FREQ => CLK_FREQ,
23                 BAUDRATE => BAUDRATE
24         )
25         port map (
26                 sys_clk => sys_clk,
27                 sys_res_n => sys_res_n,
28                 rxd => rxd,
29                 rx_data => rx_data,
30                 rx_new => rx_new
31         );
32         inst_tx : uart_tx
33         generic map (
34                 CLK_FREQ => CLK_FREQ,
35                 BAUDRATE => BAUDRATE
36         )
37         port map (
38                 sys_clk => sys_clk,
39                 sys_res_n => sys_res_n,
40                 txd => txd,
41                 tx_data => tx_data,
42                 tx_new => tx_new,
43                 tx_done => tx_done
44         );
45
46         process
47         begin
48                 sys_clk <= '0';
49                 wait for 15 ns;
50                 sys_clk <= '1';
51                 wait for 15 ns;
52                 if stop = true then
53                         wait;
54                 end if;
55         end process;
56
57         process
58                 procedure exec_tc(testnr : integer;
59                         constant testvector : std_logic_vector(9 downto 0);
60                         constant expectedresult : std_logic_vector(7 downto 0)) is
61                 begin
62                         -- vorher auf high setzen um falling edge simulieren zu koennen
63                         rxd <= '1';
64                         icwait(sys_clk, 2);
65
66                         for i in 0 to 9 loop
67                                 rxd <= testvector(9-i);
68                                 if i /= 9 then
69                                         icwait(sys_clk, BAUD);
70                                 end if;
71                         end loop;
72                 
73                         wait until rx_new = '1';
74                         if expectedresult = rx_data then
75                                 report "testfall " & integer'image(testnr) & " war erfolgreich";
76                         else
77                                 report "testfall " & integer'image(testnr) & " schlug fehl";
78                         end if;
79                         tx_new <= '1';
80                         tx_data <= rx_data;
81                         icwait(sys_clk, 1);
82                         wait until tx_done = '1';
83                         tx_new <= '0';
84                         wait until tx_done = '0';
85                         icwait(sys_clk, 3);
86                 end;
87
88                 variable testvector : std_logic_vector(9 downto 0);
89                 variable expectedresult : std_logic_vector(7 downto 0);
90         begin
91                 sys_res_n <= '0';
92                 rxd <= '1';
93                 tx_new <= '0';
94                 tx_data <= (others => '0');
95                 icwait(sys_clk, 10);
96                 sys_res_n <= '1';
97                 icwait(sys_clk, 2);
98
99                 -- 1. parameter: testfallnummer
100                 -- 2. parameter: STARTBIT (1 bit) - immer '0' | 8 DATENBITS | 1 STOPBIT - immer '1'
101                 -- 3. parameter: byte das rauskommen soll
102                 exec_tc(1, b"0000011111", b"11110000");
103                 exec_tc(2, b"0101010101", b"01010101");
104                 exec_tc(3, b"0110011001", b"00110011");
105                 exec_tc(4, b"0001100111", b"11001100");
106                 exec_tc(5, b"0010101011", b"10101010");
107                 exec_tc(6, b"0100110111", b"11011001");
108
109                 stop <= true;
110                 wait;
111         end process;
112 end sim;