集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1508|回复: 3

uart接收程序

[复制链接]
fpga_feixiang 发表于 2021-1-14 10:53:21 | 显示全部楼层 |阅读模式
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 parameter  CLK              = 50_000_000        , //系统时钟,50Mhz
15 parameter  BPS              = 9600              , //波特率
16 parameter  BPS_CNT          = CLK/BPS             //波特率计数
17 )
18 //========================< 端口 >==========================================
19 (
20 input   wire                clk                 , //时钟,50Mhz
21 input   wire                rst_n               , //复位,低电平有效
22 input   wire                din                 , //输入数据
23 output  reg   [7:0]         dout                , //输出数据
24 output  reg                 dout_vld              //输出数据的有效指示
25 );
26 //========================< 信号 >==========================================
27 reg                         rx0                 ;
28 reg                         rx1                 ;
29 reg                         rx2                 ;
30 wire                        rx_en               ;
31 reg                         flag                ;
32 reg   [15:0]                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[cnt1-1] <= rx2;                         //或 dout <= {rx2,dout[7:1]};
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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-17 01:36 , Processed in 0.062013 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表