参考时钟频率为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) begin
if(!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) begin
if(!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) begin
if(!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]};
end
assign uart_tx = trans_out[0];
endmodule