Verilog HDL-串口RS232实现

  • 串口简介

        通用异步收发传输器,简称UART。

        UART是一种通用的数据通信协议,发送数据时将并行数据转换为串行数据来传输,接收数据时将接收到的串行数据转换为并行数据。

  • 整体原理绘制框图:

    

  • 绘制UART-RX波形          

使用多级寄存器,减少亚稳态,如下图所示:

        经过三级寄存器,减少亚稳态。

        时钟周期为20ns,波特率为9600,可以计算出一个波特占用的周期数如下:

                         (1/9600*10^9)/20=5208(个)

       取中间值做信号提取,波形图如下:

编写串口模块代码如下:

module  uart_rx
#(
    parameter   UART_BPS    =   'd9600      ,
    parameter   CLK_FREQ    =   'd50_000_000
)
(
    input   wire            sys_clk     ,
    input   wire            sys_rst_n   ,
    input   wire            rx          ,

    output  reg    [7:0]    po_data     ,
    output  reg             po_flag
);

parameter   BAUD_CNT_MAX    =   CLK_FREQ / UART_BPS;

reg         rx_reg1     ;
reg         rx_reg2     ;
reg         rx_reg3     ;
reg         start_flag ;
reg         work_en     ;
reg [12:0]  baud_cnt    ;
reg         bit_flag    ;
reg [3:0]   bit_cnt     ;
reg [7:0]   rx_data     ;
reg         rx_flag     ;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        rx_reg1 <=  1'b1;
    else
        rx_reg1 <=  rx;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        rx_reg2 <=  1'b1;
    else
        rx_reg2 <=  rx_reg1;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        rx_reg3 <=  1'b1;
    else
        rx_reg3 <=  rx_reg2;
        
always@(posedge sys_clk or negedge sy
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUAA舜哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值