串口发送实现"/>
Verilog 简单的串口发送实现
参考时钟频率为5Mhz;寄存器使用异步复位;
传输波特率 由时钟分频可得到9600、115200等典型波特率
以波特率115200进行说明
T_clk5M = 200ns
T_B115200 ≈ 8680.556ns
115200 :baud_rate = T_B115200/T_clk5M ≈ 43.40
数据帧组成:一位起始位,八位数据位,一位(或两位)结束位。
模块带有一个开关使能信号
以下代码:
1.不考虑奇偶校验位
2.不考虑数据FIFO缓存防堵塞
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@** file name :uart_tx_out.v ** description:a simple uart trans demo * * author :菊月朔十 ** 阳光开朗远离玉玉积极向上从不摸鱼菊月朔十 **@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
module uart_tx_out(input wire clk , //5M时钟 input wire rstn , //低有效复位input wire [9:0] baud_rate , //波特率分频计数值input wire [7:0] trans_data , //要发送的数据input wire dv_syn , //发送数据更新脉冲input wire enable , //高有效发送使能信号output wire uart_tx //uart_tx输出信号);//====================================================
reg [9:0] baud_div_cnt ;
reg [3:0] trans_cnt ;
reg [9:0] trans_data ;
//====================================================
//进行波特率分频计数
always @(posedge clk or negedge rstn) beginif(!rstn)baud_div_cnt <= 10'b0;else if(!enable)baud_div_cnt <= 10'b0;else if(trans_cnt == 4'd10)baud_div_cnt <= 10'b0;else if(baud_div_cnt == baud_rate)baud_div_cnt <= 10'b0;else if(|trans_cnt)baud_div_cnt <= baud_div_cnt + 1'b1;
end//进行发送bit的计数
always @(posedge clk or negedge rstn) beginif(!rstn)trans_cnt <= 4'b0;else if(!enable)trans_cnt <= 4'b0;else if(trans_cnt == 4'd10)trans_cnt <= 4'b0;else if(baud_div_cnt == baud_rate)trans_cnt <= trans_cnt + 1'b1;else if(dv_syn)trans_cnt <= 4'b1;
end//uart_tx的数据移位发出
always @(posedge clk or negedge rstn) beginif(!rstn)trans_out <= 10'h3ff;else if(!enable)trans_out <= 10'h3ff;else if(dv_syn)trans_out <= {1'b1,trans_data,1'b0};else if(baud_div_cnt == baud_rate)trans_out <= {1'b1,trans_out[9:1]};
endassign uart_tx = trans_out[0];endmodule
更多推荐
Verilog 简单的串口发送实现
发布评论