fpga_feixiang 发表于 2021-1-14 10:53:21

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

大鹏 发表于 2021-1-20 14:42:05

uart接收程序

大鹏 发表于 2021-1-28 13:34:59

uart接收程序
页: [1]
查看完整版本: uart接收程序