串口接收实验

该博客详细介绍了UART串口通信模块的设计过程,包括波特率设置、信号检测及计数器的实现。通过参数化设置支持不同波特率,并在接收端使用同步信号检测及计数机制来正确输出LED显示和标志位。模块内部包含多个状态寄存器和计数器,用于确保通信的准确性和实时性。
摘要由CSDN通过智能技术生成

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/25 13:30:32
// Design Name: 
// Module Name: uart
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart #
(
parameter num_cnt2=4'd9

)
(
input clk_sys      ,
input rst_n        ,
input  i_uart       ,
output reg[7:0] o_led  ,
output reg o_cnt_flag ,
input[1:0]i_sel_bps

);

reg reg1_uart;
reg reg2_uart;
reg reg3_uart;
reg [17:0] para_bps;
reg [17:0]cnt1;
reg [3:0]cnt2;

always@(*)
begin
     case(i_sel_bps)
          2'b0:para_bps<=104167;//9600
          2'b1:para_bps<=8681;//115200
          default:para_bps<=104167;//9600
     endcase     
end

// inter_clock
always@(posedge clk_sys or negedge rst_n  )
begin
     if(rst_n==0)
          begin
               reg1_uart<=0;
               reg2_uart<=0;
               reg3_uart<=0;
          end    
     else 
          begin
               reg1_uart<=i_uart;
               reg2_uart<=reg1_uart ; 
               reg3_uart<=reg2_uart;
          end       
end   


//negedge check & output o_cnt_flag
always@(posedge clk_sys or negedge rst_n  )
begin
     if(rst_n==0)
          o_cnt_flag<=0;
     else if(reg2_uart==1&&reg3_uart==0)
          o_cnt_flag<=1;
     else if(cnt2==num_cnt2-1)
          o_cnt_flag<=0;     
      else
          o_cnt_flag<=o_cnt_flag;         
end     

//cnt1
always@(posedge clk_sys or negedge rst_n  )
begin
     if(rst_n==0)
          cnt1<=0;
     else if(cnt1==para_bps-1)
          cnt1<=0;  
      else if(o_cnt_flag)
          cnt1<=cnt1+1; 
      else
          cnt1<=cnt1;             
end  
//cnt2
always@(posedge clk_sys or negedge rst_n  )
begin
     if(rst_n==0)
          cnt2<=0;
     else if(cnt2==num_cnt2-1)
          cnt2<=0;  
      else if(cnt1==para_bps-1)
          cnt2<=cnt2+1;
      else
          cnt2<=cnt2;             
end  
//LED
always@(posedge clk_sys or negedge rst_n  )
begin
     if(rst_n==0)
          o_led<=0;
     else if(cnt2==num_cnt2/2-1)
          o_led[cnt2-1]<=i_uart;  
      else
          o_led<=o_led;             
end  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值