@@ -17,6 +17,7 @@ UartRx UR1 (
17
17
.rx_data(),
18
18
.rx_busy(),
19
19
.rx_done(),
20
+ .rx_err(),
20
21
.rxd()
21
22
);
22
23
defparam UR1.CLK_HZ = 200_000_000;
@@ -25,7 +26,7 @@ defparam UR1.BAUD = 9600; // max. BAUD is CLK_HZ / 2
25
26
--- INSTANTIATION TEMPLATE END ---*/
26
27
27
28
28
- module UartRx (clk, nrst, rx_data, rx_busy, rx_done, rxd);
29
+ module UartRx (clk, nrst, rx_data, rx_busy, rx_done, rx_err, rxd);
29
30
30
31
parameter CLK_HZ = 200_000_000;
31
32
parameter BAUD = 9600 ;
@@ -37,6 +38,7 @@ input wire nrst;
37
38
output reg [7 :0 ] rx_data = 0 ;
38
39
output reg rx_busy = 0 ;
39
40
output reg rx_done = 0 ; // read strobe
41
+ output reg rx_err = 0 ; // read strobe
40
42
input wire rxd;
41
43
42
44
@@ -60,6 +62,7 @@ always @ (posedge clk) begin
60
62
rx_data[7 :0 ] <= 0 ;
61
63
rx_busy <= 0 ;
62
64
rx_done <= 0 ;
65
+ rx_err <= 0 ;
63
66
rx_sample_cntr[15 :0 ] <= (BAUD_DIVISOR_2 - 1 );
64
67
rx_data_cntr[3 :0 ] <= 4'b1000 ;
65
68
end else begin
@@ -69,6 +72,7 @@ always @ (posedge clk) begin
69
72
rx_data[7 :0 ] <= 0 ;
70
73
rx_busy <= 1 ;
71
74
rx_done <= 0 ;
75
+ rx_err <= 0 ;
72
76
rx_data_cntr[3 :0 ] <= 4'b1000 ;
73
77
end // start_bit_strobe
74
78
end else begin
@@ -84,17 +88,18 @@ always @ (posedge clk) begin
84
88
if (rxd) begin
85
89
rx_done <= 1 ;
86
90
end else begin
87
- rx_busy <= 0 ;
91
+ rx_err <= 1 ;
88
92
end // rxd
89
93
end else begin // do sample and shift data
90
94
rx_data[7 :0 ] <= {rxd, rx_data[7 :1 ]};
91
95
rx_data_cntr[3 :0 ] <= rx_data_cntr[3 :0 ] - 1 ;
92
96
end // rx_data_cntr[3:0]
93
97
end // rx_do_sample
94
98
95
- if (rx_done) begin
99
+ if (rx_done || rx_err ) begin
96
100
rx_busy <= 0 ;
97
101
rx_done <= 0 ;
102
+ rx_err <= 0 ;
98
103
end // rx_done
99
104
100
105
end // ~rx_busy
0 commit comments