3a8fd833d989169ef3712e69e0f781829e7cc931
[bos2k9.git] / fhw_rs232_t / rs232_send_t.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- Testing the RS232 sending unit.
5 -----------------------------------------------------------------------
6 -- This entity is part of the following library:
7 -- pragma library fhw_rs232_t
8 library fhw_rs232_t;
9 library fhw_rs232;
10 use fhw_rs232.rs232_globals_p.all;
11
12 library ieee;
13 use ieee.std_logic_1164.all;
14 use ieee.numeric_std.all;
15
16 library stefanvhdl;
17 use stefanvhdl.txt_util.all;
18
19 -----------------------------------------------------------------------
20
21 entity rs232_send_t is
22   generic(
23     clock_interval : time := 20 ns);
24 end rs232_send_t;
25
26 architecture test of rs232_send_t is
27   constant div_c : positive := 4;
28   subtype std_logic_byte_t is std_logic_vector(7 downto 0);
29   component rs232_send is
30     generic(
31       clock_divider  : positive;
32       data_width     : positive;
33       parity_enabled : std_logic;
34       parity_type    : std_logic);
35     port(
36       clk : in  std_logic;
37       rst : in  std_logic;
38       
39       tx  : out std_logic;
40       txd : in  std_logic_byte_t;
41       txn : in  std_logic;
42       txb : out std_logic);
43    end component;
44    
45    signal clock_s : std_logic;
46    signal reset_s : std_logic;
47    
48    signal tx_8n1_o_s  : std_logic;
49    signal txd_8n1_o_s : std_logic_byte_t;
50    signal txd_8n1_i_s : std_logic_byte_t;
51    signal txn_8n1_i_s : std_logic;
52    signal txb_8n1_o_s : std_logic;
53    signal tx_8o1_o_s  : std_logic;
54    signal txd_8o1_o_s : std_logic_byte_t;
55    signal txd_8o1_i_s : std_logic_byte_t;
56    signal txn_8o1_i_s : std_logic;
57    signal txb_8o1_o_s : std_logic;
58    signal tx_8e1_o_s  : std_logic;
59    signal txd_8e1_o_s : std_logic_byte_t;
60    signal txd_8e1_i_s : std_logic_byte_t;
61    signal txn_8e1_i_s : std_logic;
62    signal txb_8e1_o_s : std_logic;
63    
64    signal busy_s : std_logic;
65    
66 begin
67   tx_8n1 : rs232_send generic map(div_c, 8, '0', '0') port map(clock_s, reset_s, tx_8n1_o_s, txd_8n1_i_s, txn_8n1_i_s, txb_8n1_o_s);
68   tx_8o1 : rs232_send generic map(div_c, 8, '1', '0') port map(clock_s, reset_s, tx_8o1_o_s, txd_8o1_i_s, txn_8o1_i_s, txb_8o1_o_s);
69   tx_8e1 : rs232_send generic map(div_c, 8, '1', '1') port map(clock_s, reset_s, tx_8e1_o_s, txd_8e1_i_s, txn_8e1_i_s, txb_8e1_o_s);
70   
71   busy_s <= txb_8n1_o_s or txb_8o1_o_s or txb_8e1_o_s;
72   
73   stimulus : process
74     procedure send(
75        word : in std_logic_byte_t) is
76     begin
77       txn_8n1_i_s <= '1'; txd_8n1_i_s <= word;
78       txn_8o1_i_s <= '1'; txd_8o1_i_s <= word;
79       txn_8e1_i_s <= '1'; txd_8e1_i_s <= word;
80       wait until rising_edge(clock_s);
81       txn_8n1_i_s <= '0';
82       txn_8o1_i_s <= '0';
83       txn_8e1_i_s <= '0';
84       wait until falling_edge(busy_s);
85     end send;
86   begin
87     wait until falling_edge(reset_s);
88     
89     send("01000111");
90     send("10010010");
91     send("11111111");
92     send("00000000");
93     
94     wait;
95   end process;
96   
97   verify : process
98     variable wait_v : natural;
99   begin
100     txd_8n1_o_s <= (others => '-');
101     txd_8o1_o_s <= (others => '-');
102     txd_8e1_o_s <= (others => '-');
103     wait until falling_edge(tx_8n1_o_s);
104     txd_8n1_o_s <= (others => 'U');
105     txd_8o1_o_s <= (others => 'U');
106     txd_8e1_o_s <= (others => 'U');
107     for i in div_c downto 1 loop
108       wait until rising_edge(clock_s);
109     end loop;
110     for i in 0 to 7 loop
111       txd_8n1_o_s(i) <= tx_8n1_o_s;
112       txd_8o1_o_s(i) <= tx_8o1_o_s;
113       txd_8e1_o_s(i) <= tx_8e1_o_s;
114       for t in div_c downto 1 loop
115         wait until rising_edge(clock_s);
116       end loop;
117
118       wait until rising_edge(clock_s);
119     end loop;
120     assert txd_8n1_o_s = txd_8n1_i_s report "data mismatch 8n1: got: " & str(txd_8n1_o_s) & " exp: " & str(txd_8n1_i_s);
121     assert txd_8o1_o_s = txd_8n1_i_s report "data mismatch 8o1: got: " & str(txd_8o1_o_s) & " exp: " & str(txd_8o1_i_s);
122     assert txd_8e1_o_s = txd_8n1_i_s report "data mismatch 8e1: got: " & str(txd_8e1_o_s) & " exp: " & str(txd_8e1_i_s);
123   end process;
124   
125   reset : process
126   begin
127     reset_s <= '1';
128     wait until rising_edge(clock_s);
129     wait until rising_edge(clock_s);
130     reset_s <= '0';
131     wait;
132   end process;
133   
134   clock : process
135   begin
136     clock_s <= '0';
137     wait for clock_interval / 2;
138     clock_s <= '1';
139     wait for clock_interval / 2;
140   end process;
141
142 end test;