探究FPGA串口发送时次次丢失第一个字符

由于当时在STM32的板子也偶尔出现串口发送的时候老是丢第一个字符,这次在FPGA上进行串口发送时也发现了这个问题,好在FPGA更底层点,所以花了点时间找原因。直接进入正题。
FPGA:黑金AX301B,芯片型号EP4CE6F17C8N,用的是uart_test的代码,代码结构如下:
在这里插入图片描述
运行以后:
在这里插入图片描述
把提供的源码的uart_tx里的tx_reg <= tx_data_latch[bit_cnt]改成tx_reg <= tx_data[bit_cnt];或者把else if(state == S_IDLE && tx_data_valid == 1’b1)中的if语句去掉,就会变成:
在这里插入图片描述
原因:
总结来说就是没有成功锁存第一个字符,导致每次发都缺第一个字符。
在uart_test的代码中,字符串是这么定义的:在这里插入图片描述
主要就是tx_cnt不断加一,然后赋值给tx_str,再由tx_str赋值给tx_data,然后发送出去,在一开始的时候,从下面代码可以看出tx_data=‘H’,由于一开始tx_data_valid为0,tx_data_ready为1,所以一开始uart_test中将对tx_data_valid进行置1。一旦置1以后可了不得,由于tx_data_valid和tx_data_ready都是1,这个时候tx_cnt会加1,于是tx_data马上会变成‘E’,这样就少了一个字符了。
**那么应该怎么办呢?**于是出现了一个判断语句:else if(state == S_IDLE && tx_data_valid == 1’b1),用tx_data_latch <= tx_data;存住第一个字符,为什么是S_IDLE这个状态呢?因为state的状态马上要变成S_START了,所以要取这个状态,如果改成其他状态,照样锁不住这第一个字符。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用SignalTap仿真了一下,果然如此:
首先是没改代码以后的波形:
在这里插入图片描述
然后是改了代码以后的波形:
在这里插入图片描述
可以看到tx_data_latch没有存住一开始‘H’,符合分析

最近刚学了ModelSim,对改了代码后的文件进行仿真也可以看到这个结果:
在这里插入图片描述
在这里插入图片描述
State为3,也就是转到发送字符状态的时候data_latch里只有E了,H字符没被锁存住

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值