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 uart发送程序
页:
[1]