@@ -24,6 +24,7 @@ end entity;
2424
2525architecture a of uart_slave is
2626 signal baud_rate : natural := uart.p_baud_rate;
27+ signal parity : natural := uart.p_parity;
2728 signal local_event : std_logic := '0' ;
2829 constant data_queue : queue_t := new_queue;
2930begin
3738
3839 if msg_type = uart_set_baud_rate_msg then
3940 baud_rate <= pop(msg);
40-
41+ elsif msg_type = uart_set_parity_msg then
42+ parity <= pop(msg);
4143 elsif msg_type = stream_pop_msg then
4244 reply_msg := new_msg;
4345 if not (length (data_queue) > 0 ) then
5658 recv : process
5759 procedure uart_recv(variable data : out std_logic_vector ;
5860 signal rx : in std_logic ;
59- baud_rate : integer ) is
61+ baud_rate : integer ;
62+ parity : natural ) is
6063 constant time_per_bit : time := (10 ** 9 / baud_rate) * 1 ns ;
6164 constant time_per_half_bit : time := (10 ** 9 / (2 * baud_rate)) * 1 ns ;
65+ variable parity_bit : std_logic ;
66+ variable parity_calc : std_logic ;
6267 begin
6368 wait for time_per_half_bit; -- middle of start bit
6469 assert rx = not uart.p_idle_state;
@@ -69,13 +74,37 @@ begin
6974 wait for time_per_bit;
7075 end loop ;
7176
77+ if parity = 1 then
78+ parity_bit := rx;
79+ parity_calc := odd_parity(data);
80+ wait for 0 ns ;
81+
82+ if parity_bit /= parity_calc then
83+ report " odd parity mismatch"
84+ severity WARNING ;
85+ end if ;
86+
87+ wait for time_per_bit;
88+ elsif parity = 2 then
89+ parity_bit := rx;
90+ parity_calc := even_parity(data);
91+ wait for 0 ns ;
92+
93+ if parity_bit /= parity_calc then
94+ report " even parity mismatch"
95+ severity WARNING ;
96+ end if ;
97+
98+ wait for time_per_bit;
99+ end if ;
100+
72101 assert rx = uart.p_idle_state;
73102 end procedure ;
74103
75104 variable data : std_logic_vector (uart.p_data_length- 1 downto 0 );
76105 begin
77106 wait on rx until rx = not uart.p_idle_state;
78- uart_recv(data, rx, baud_rate);
107+ uart_recv(data, rx, baud_rate, parity );
79108 push_std_ulogic_vector(data_queue, data);
80109 local_event <= '1' ;
81110 wait for 0 ns ;
0 commit comments