UART 通信逻辑协议设计(2)

5 . 各模块详细设计
1)波特率发生器模块:假定系统时钟为50M,波特率为115200,则传输每一位所需的时间为8.6805us,而将其分频至波特率的16倍则需计数则在系统时钟下当计数值为27时则将Baud16Tick置为1,其他时间都为0。要得到波特率脉冲时则在Baud16Tick节拍下计数至16时将BaudTick置为1,其他值时为0。程序如下:

  always @(posedge clk )    
  begin
      if (rst)
        begin
                OverSampleCnt <=8'b0;
                Baud16Tick <= 1'b0;
         end
      elseif(OverSampleCnt== OverSampleCntnum)
        OverSampleCnt <= 1'b0;
      else 
        OverSampleCnt <=OverSampleCnt+1;
      case(OverSampleCnt== OverSampleCntnum/2)  
        OverSampleCntnum/2:Baud16Tick <= 1'b1;
        default:Baud16Tick <= 1'b0;
  endcase   
  End
 always @(posedge clk or negedge rst)
begin
  if (rst)
    begin
        BaudTick <= 1'b0;
         BaudTickCnt <= 4'b0000 ;
    end
  else if (Baud16Tick&&BaudTick_EN)
  BaudTickCnt = BaudTickCnt +1 ;
  elseif((BaudTickCnt== 4’b1111)
  BaudTickCnt <= 4'b0000 ;  
  case(BaudTickCnt) 
  4'b1000:BaudTick <= 1'b1;
  default:BaudTick <= 1'b0;
   endcase
end

2)数据发送器模块:在Baud16Tick的节拍下捕捉TXD_start的下降沿,之后将din8的数据存入缓冲器tbr中,再启动BaudTick脉冲并计数,在计数为4’b0000时发送停止位0,在4’b0001至4’b1000时发送数据位,并在之后两位发送奇偶校验位和停止位。没有发送是则发送空闲位1。校验每发一位就将parity进行异或数据位得到其值并发送。当发送停止位后,即将发送完成标志位TXD_done置1.程序如下:

always@(posedge clk)
    begin
        if(rst)
            begin
                {TxD_start0,TxD_start1} <= {
  1'b0,1'b0};
            end
        else 
            TxD_start0 <= TxD_start;
            TxD_start1 <= TxD_start0;   
    end
assign start = TxD_start1&!TxD_start0;
always@(posedge clk or posedge rst)
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值