fpga_feixiang 发表于 2021-1-14 10:54:16

uart发送程序

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 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 input   wire                din_vld             , //输入数据的有效指示
24 outputreg               dout                  //输出数据
25 );
26 //========================< 信号 >==========================================
27 reg                         flag                ;
28 reg   [ 7:0]                din_tmp             ;
29 reg                   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;
103 end
104
105
106
107 endmodule

大鹏 发表于 2021-1-18 15:14:08

uart发送程序
页: [1]
查看完整版本: uart发送程序