-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuart_rx_tb.vhd
More file actions
97 lines (81 loc) · 2.9 KB
/
uart_rx_tb.vhd
File metadata and controls
97 lines (81 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity uart_rx_tb is
generic(
baud_rate : std_logic_vector (1 downto 0) := "00"
);
end uart_rx_tb;
architecture tb of uart_rx_tb is
signal reset_in_tb : std_logic := '0';
signal clock_in_tb : std_logic := '0';
signal uart_data_rx_tb : std_logic := '1';
signal uart_rate_rx_sel_tb : std_logic_vector(1 downto 0) := baud_rate;
signal data_p_out_tb : std_logic_vector(7 downto 0);
signal data_p_en_out_tb : std_logic;
signal data_received : std_logic_vector(7 downto 0);
type data_array is array (7 downto 0) of std_logic_vector(0 to 7);
signal data : data_array := (
0 => "10110101", -- B5
1 => "01001111", -- 9F
2 => "11010001", -- D1
3 => "00111100", -- 3C
4 => "10001110", -- 8E
5 => "11111000", -- F8
6 => "01100110", -- 66
7 => "10000101" -- 85
);
signal Tbit : time := 10416 ns;
begin
-- Clock gerado com base no clk_period
clock_in_tb <= not clock_in_tb after 5 ns;
--------------------------------------------------------------
data_received <= data_p_out_tb when data_p_en_out_tb = '1';
uart_rate_rx_sel_tb <= baud_rate;
Tbit<= 10416 ns when baud_rate = "00" else-- 9600 bps
5208 ns when baud_rate = "01" else -- 19200 bps
3472 ns when baud_rate = "10" else -- 28800 bps
1736 ns when baud_rate = "11" else -- 57600 bps
10416 ns;
uart: entity work.uart_rx
PORT MAP(
clock_in => clock_in_tb,
reset_in => reset_in_tb,
uart_data_rx => uart_data_rx_tb,
uart_rate_rx_sel => uart_rate_rx_sel_tb,
data_p_out => data_p_out_tb,
data_p_en_out => data_p_en_out_tb
);
stim_proc: process
begin
-- Reset
reset_in_tb <= '1';
wait for 100 ns;
reset_in_tb <= '0';
wait for 100 ns;
-- Loop de transmissão UART
for i in 0 to 7 loop -- data list
--- Start bit
uart_data_rx_tb <= '0';
wait for Tbit;
----------------------------------------------------------------------------
for j in 0 to 7 loop
uart_data_rx_tb <= data(i)(j);
wait for Tbit;
end loop;
--- Stop bit
uart_data_rx_tb <= '1';
-- Espera ativa até DUT sinalizar que o dado foi recebido
wait until data_p_en_out_tb = '1';
wait for Tbit;
-- Aqui, opcionalmente, imprimir o que foi recebido
report "Byte recebido: " & integer'image(to_integer(unsigned(data_p_out_tb)));
assert data_p_out_tb = data(i)(0 to 7)
report "ERRO: byte recebido incorreto!" severity error;
-- Aguarda um pouco após o stop bit
uart_data_rx_tb <= '1';
wait for Tbit * 2;
end loop;
wait; -- fim da simulação
end process;
end tb;