uart_rx: ein prozessmodell. spart weitere 3 logic elements :P
[hwmod.git] / src / beh_uart_tx_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_uart_tx_tb is
7 end entity beh_uart_tx_tb;
8
9 architecture sim of beh_uart_tx_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, txd, tx_new, tx_done : std_logic;
15         signal tx_data : std_logic_vector (7 downto 0);
16         signal stop : boolean := false;
17 begin
18         inst : uart_tx
19         generic map (
20                 CLK_FREQ => CLK_FREQ,
21                 BAUDRATE => BAUDRATE
22         )
23         port map (
24                 sys_clk => sys_clk,
25                 sys_res_n => sys_res_n,
26                 txd => txd,
27                 tx_data => tx_data,
28                 tx_new => tx_new,
29                 tx_done => tx_done
30         );
31
32         process
33         begin
34                 sys_clk <= '0';
35                 wait for 15 ns;
36                 sys_clk <= '1';
37                 wait for 15 ns;
38                 if stop = true then
39                         wait;
40                 end if;
41         end process;
42
43         process
44                 procedure exec_tc(testnr : integer;
45                         constant expectedresult : std_logic_vector(9 downto 0);
46                         constant testvector : std_logic_vector(7 downto 0)) is
47                         variable success : boolean := true;
48                 begin
49                         tx_new <= '1';
50                         tx_data <= testvector;
51                         icwait(sys_clk, 1);
52
53                         -- ein BAUD-cycle auf high warten
54                         icwait(sys_clk, BAUD);
55
56                         -- in der mitte abtasten
57                         icwait(sys_clk, BAUD/2);
58                         for i in 0 to 9 loop
59                                 if txd /= expectedresult(9-i) then
60                                         success := false;
61                                 end if;
62                                 if i /= 9 then
63                                         icwait(sys_clk, BAUD);
64                                 end if;
65                         end loop;
66
67                         wait until tx_done = '1';
68                         tx_new <= '0';
69                         wait until tx_done = '0';
70                         if success then
71                                 report "testfall " & integer'image(testnr) & " war erfolgreich";
72                         else
73                                 report "testfall " & integer'image(testnr) & " schlug fehl";
74                         end if;
75                         icwait(sys_clk, 3);
76                 end;
77         begin
78                 sys_res_n <= '0';
79                 tx_new <= '0';
80                 tx_data <= (others => '0');
81                 icwait(sys_clk, 10);
82                 sys_res_n <= '1';
83                 icwait(sys_clk, 2);
84
85                 -- 1. parameter: testfallnummer
86                 -- 2. parameter: STARTBIT (1 bit) - immer '0' | 8 DATENBITS (reversed) | 1 STOPBIT - immer '1'
87                 -- 3. parameter: byte das gesendet werden soll
88                 exec_tc(1, b"0000011111", b"11110000");
89                 exec_tc(2, b"0101010101", b"01010101");
90                 exec_tc(3, b"0110011001", b"00110011");
91                 exec_tc(4, b"0001100111", b"11001100");
92                 exec_tc(5, b"0010101011", b"10101010");
93                 exec_tc(6, b"0100110111", b"11011001");
94
95                 stop <= true;
96                 wait;
97         end process;
98 end sim;