记录一次debug过程

一、描述

之前做了一个串口发送,后来进行了几处优化。

  • 本来触发发送的send_en需要在整个数据发送过程中都要拉高,改成只需要在出发时拉高一个时钟周期。然后再利用send_en一个时钟周期的高脉冲和其他逻辑实现baud_cnt在数据发送期间一直能计数。

  • 还有就是在send_en拉高时,将data_byte用data_byte_reg寄存一级,确保取数据时数据是稳定的

然后在top中实现按一次按键,数据发送一个字节。

module uart_tx_top
(
    input       wire                clk         ,
    input       wire                rst_n       ,
    input       wire                key_in      ,
    
    output      wire                rs232_tx    ,
    output      wire                uart_state
);

wire send_en;
wire [7:0] data_byte;
wire tx_done;
wire key_flag;
wire key_state;


uart_tx uart_tx_inst
(
    .clk         (clk),
    .rst_n       (rst_n),
    .send_en     (send_en),
    .baud_set    (20'd9600),
    .data_byte   (8'h35),

    .rs232_tx    (rs232_tx),
    .tx_done     (tx_done),
    .uart_state  (uart_state)
);


key_filter key_filter
(   
    .clk         (clk),
    .rst_n       (rst_n),
    .key_in      (key_in),

    .key_flag    (key_flag),
    .key_state   (key_state)
);

assign send_en = key_flag & (!key_state);

endmodule

发现在按一次复位时,会收到长度不等的几个字节的数据!是00,或者是其他。

分析:

  1. 错误发送不止一个字节可以理解,因为复位键是没有经过消抖的,表面上按下一次,可能在20ns的时钟速度下几ms内已经检测到了多次rst_n == 0,从而触发多次复位。

  1. 原因应该在rst_n == 0 时,触发了一些赋值,从而会错误发送。

解决:在tb中只对复位信号给数据

发现在复位信号有效期间,uart_state信号有效了!导致整个rst_n ==0 期间会发送数据。找到代码中,确定是一个逻辑BUG。

改为在复位时,uart_state赋值为0,再硬件验证,发现bug被完美修复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李亚有鸭梨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值