uart接收程序
1 //**************************************************************************2 // *** 名称 : uart_rx.v
3 // *** 作者 : xianyu_FPGA
4 // *** 博客 : https://www.cnblogs.com/xianyufpga/
5 // *** 日期 : 2019-01-10
6 // *** 描述 : 串口接收模块,计数9.5下,其中停止位0.5下
7 // 因为串口助手发送本次停止位和下次开始位中间没有留空闲位
8 // 若计满10下,则才结束本次传输下次数据就来了,会来不及接收
9 //**************************************************************************
10
11 module uart_rx
12 //========================< 参数 >==========================================
13 #(
14 parameterCLK = 50_000_000 , //系统时钟,50Mhz
15 parameterBPS = 9600 , //波特率
16 parameterBPS_CNT = CLK/BPS //波特率计数
17 )
18 //========================< 端口 >==========================================
19 (
20 input wire clk , //时钟,50Mhz
21 input wire rst_n , //复位,低电平有效
22 input wire din , //输入数据
23 outputreg dout , //输出数据
24 outputreg dout_vld //输出数据的有效指示
25 );
26 //========================< 信号 >==========================================
27 reg rx0 ;
28 reg rx1 ;
29 reg rx2 ;
30 wire rx_en ;
31 reg flag ;
32 reg cnt0 ;
33 wire add_cnt0 ;
34 wire end_cnt0 ;
35 reg [ 3:0] cnt1 ;
36 wire add_cnt1 ;
37 wire end_cnt1 ;
38 reg [ 7:0] data ;
39
40 //==========================================================================
41 //== 消除亚稳态 + 下降沿检测
42 //==========================================================================
43 always @(posedge clk or negedge rst_n) begin
44 if(!rst_n) begin
45 rx0 <= 1;
46 rx1 <= 1;
47 rx2 <= 1;
48 end
49 else begin
50 rx0 <= din;
51 rx1 <= rx0;
52 rx2 <= rx1;
53 end
54 end
55
56 assign rx_en = rx2 && ~rx1;
57
58 //==========================================================================
59 //== 接收状态指示
60 //==========================================================================
61 always @(posedge clk or negedge rst_n) begin
62 if(!rst_n)
63 flag <= 0;
64 else if(rx_en)
65 flag <= 1;
66 else if(end_cnt1)
67 flag <= 0;
68 end
69
70 //==========================================================================
71 //== 波特率计数
72 //==========================================================================
73 always @(posedge clk or negedge rst_n) begin
74 if(!rst_n)
75 cnt0 <= 0;
76 else if(add_cnt0) begin
77 if(end_cnt0)
78 cnt0 <= 0;
79 else
80 cnt0 <= cnt0 + 1;
81 end
82 end
83
84 assign add_cnt0 = flag;
85 assign end_cnt0 = cnt0== BPS_CNT-1 || end_cnt1;
86
87 //==========================================================================
88 //== 开始1位(不接收) + 数据8位 + 停止0.5位(不接收),共10位
89 //==========================================================================
90 always @(posedge clk or negedge rst_n) begin
91 if(!rst_n)
92 cnt1 <= 0;
93 else if(add_cnt1) begin
94 if(end_cnt1)
95 cnt1 <= 0;
96 else
97 cnt1 <= cnt1 + 1;
98 end
99 end
100
101 assign add_cnt1 = end_cnt0;
102 assign end_cnt1 = cnt1==10-1 && cnt0==BPS_CNT/2-1;
103
104 //==========================================================================
105 //== 缓存数据
106 //==========================================================================
107 always @ (posedge clk or negedge rst_n)begin
108 if(!rst_n)
109 data <= 8'd0;
110 else if(cnt1>=1 && cnt1<=8 && cnt0==BPS_CNT/2-1) //中间采样
111 data <= rx2; //或 dout <= {rx2,dout};
112 end
113
114 //==========================================================================
115 //== 输出数据
116 //==========================================================================
117 always @ (posedge clk or negedge rst_n)begin
118 if(!rst_n)
119 dout <= 0;
120 else if(end_cnt1)
121 dout <= data;
122 end
123
124 always @ (posedge clk or negedge rst_n)begin
125 if(!rst_n)
126 dout_vld <= 0;
127 else if(end_cnt1)
128 dout_vld <= 1;
129 else
130 dout_vld <= 0;
131 end
132
133
134
135 endmodule uart接收程序 uart接收程序
页:
[1]