探究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了,所以要取这个状态,如果改成其他状态,照样锁不住这第一个字符。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述