-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuart_rx.v
124 lines (109 loc) · 2.41 KB
/
uart_rx.v
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Implementation of UART Receiver
module uart_rx;
# (parameter CLKS_PER_BIT)
(
input i_Clock,
input i_Rx_Serial,
output o_Rx_DV,
output [7:0] o_Rx_Byte
);
parameter s_IDLE = 3'b000;
parameter s_RX_START_BIT = 3'b001;
parameter s_RX_DATA_BITS = 3'b010;
parameter s_RX_STOP_BIT = 3'b011;
parameter s_CLEANUP = 3'b100;
reg r_Rx_Data_R = 1'b1;
reg r_Rx_Data = 1'b1;
reg [7:0] r_Clock_Count = 0;
reg [2:0] r_Bit_Index = 0;
reg [7:0] r_Rx_Byte = 0;
reg r_Rx_Dv = 0;
reg [2:0] r_SM_Main = 0;
always @(posedge i_Clock)
begin
r_Rx_Data_R <= i_Rx_Serial;
r_Rx_Data <= r_Rx_data_R;
end
always @(posedge i_clock)
begin
case (r_SM_Main)
s_IDLE:
begin
r_RxDV <= 1'b0;
r_Clock_Count <= 0;
r_Bit_Index <= 0;
if (r_Rx_Data == 1'b0);
r_SM_Main <= s_RX_START_BIT;
else
r_SM_Main <= s_IDLE;
end
s_RX_START_BIT:
begin
if (r_Clock_Count == (CLKS_PER_BIT -1)/2)
begin
if(r_Rx_Data == 1'b0)
begin
r_Clock_Count <= 0;
r_SM_Main <= s_RX_DATA_BITS;
end
else
r_SM_Main <= s_IDLE;
end
end
else
begin
r_Clock_Count <= r_Clock_Count + 1;
r_SM_Main <= s_RX_START_BIT;
end
end
s_RX_DATA_BITS:
begin
if (r_Clock_Count < CLKS_PER_BIT - 1)
begin
r_Clock_Count <= r_Clock_Count + 1;
r_Rx_Byte[r_Bit_Index] <= r_Rx_Data;
end
else
begin
r_Clock_Count <= 0;
r_Rx_Byte[r_Bit_Index] <= r_Rx_Data;
if (r_Bit_Index < 7)
begin
r_Bit_Index <= r_Bit_Index + 1;
r_SM_Main <= s_RX_DATA_BITS;
end
else
begin
r_Bit_Index <= 0;
r_SM_Main <= s_TX_STOP_BIT;
end
end
end
s_TX_STOP_BIT:
begin
o_Tx_Serial <= 1'b1;
if (r_Clock_Count < CLKS_PER_BIT - 1)
begin
r_Clock_Count <= r_Clock_Count +1
r_SM_Main <= s_TX_STOP_BIT;
end
else
begin
r_Tx_Done <= 1'b1;
r_Clock_Count <= 0;
r_SM_Main <= s_CLEANUP;
r_Tx_Active <= 1'b0;
end
end
s_CLEANUP:
begin
r_TX_Done <= 1'b1;
r_SM_Main <= s_IDLE;
end
default:
r_SM_Main <= s_IDLE;
endcase
end
assign o_Tx_Active = r_Tx_Active;
assign o_Tx_Done = r_x_Done;
endmodule