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) 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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值