集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1196|回复: 2

uart发送程序

[复制链接]
fpga_feixiang 发表于 2021-1-14 10:54:16 | 显示全部楼层 |阅读模式
1 //**************************************************************************
  2 // *** 名称 : uart_tx.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_tx
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  [7:0]         din                 , //输入数据
23 input   wire                din_vld             , //输入数据的有效指示
24 output  reg                 dout                  //输出数据
25 );
26 //========================< 信号 >==========================================
27 reg                         flag                ;
28 reg   [ 7:0]                din_tmp             ;
29 reg   [15:0]                cnt0                ;
30 wire                        add_cnt0            ;
31 wire                        end_cnt0            ;
32 reg   [ 3:0]                cnt1                ;
33 wire                        add_cnt1            ;
34 wire                        end_cnt1            ;
35 wire  [ 9:0]                data                ;
36
37 //==========================================================================
38 //==    数据暂存(din可能会消失,暂存住)
39 //==========================================================================
40 always @ (posedge clk or negedge rst_n) begin
41     if(!rst_n)
42         din_tmp <=8'd0;
43     else if(din_vld)
44         din_tmp <= din;
45 end
46
47 //==========================================================================
48 //==    发送状态指示
49 //==========================================================================
50 always  @(posedge clk or negedge rst_n)begin
51     if(!rst_n)
52         flag <= 0;
53     else if(din_vld)
54         flag <= 1;
55     else if(end_cnt1)
56         flag <= 0;
57 end
58
59 //==========================================================================
60 //==    波特率计数
61 //==========================================================================
62 always @(posedge clk or negedge rst_n) begin
63     if(!rst_n)
64         cnt0 <= 0;
65     else if(add_cnt0) begin
66         if(end_cnt0)
67             cnt0 <= 0;
68         else
69             cnt0 <= cnt0 + 1;
70     end
71 end
72
73 assign add_cnt0 = flag;
74 assign end_cnt0 = cnt0== BPS_CNT-1 || end_cnt1;
75
76 //==========================================================================
77 //==    开始1位 + 数据8位 + 停止0.5位,共10位
78 //==========================================================================
79 always @(posedge clk or negedge rst_n) begin
80     if(!rst_n)
81         cnt1 <= 0;
82     else if(add_cnt1) begin
83         if(end_cnt1)
84             cnt1 <= 0;
85         else
86             cnt1 <= cnt1 + 1;
87     end
88 end
89
90 assign add_cnt1 = end_cnt0;
91 assign end_cnt1 = cnt1==10-1 && cnt0==BPS_CNT/2-1;
92
93 //==========================================================================
94 //==    数据输出(用case语句也行)
95 //==========================================================================
96 assign data = {1'b1,din_tmp,1'b0};  //停止,数据,开始
97
98 always @(posedge clk or negedge rst_n) begin
99     if(!rst_n)
100         dout <= 1'b1;
101     else if(flag)
102         dout <= data[cnt1];
103 end
104
105
106
107 endmodule
大鹏 发表于 2021-1-18 15:14:08 | 显示全部楼层
uart发送程序
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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