DSP

串口回环测试思考

2019-07-13 20:19发布

  这两天测试FPGA串口发送接收时,按照彬哥书上,搭建串口回环测试,但是自己写的模块总是相邻两个字符丢失一个字符,使用Modelsim功能仿真,发现了一些问题,记录在此。
  如果是按照过采样的方法设计的串口发送与接收模块,那么在PC向FPGA连续发送字符时,可以想象的到,每10个字符间隔(1 start+8bits+1 stop),接收模块就会产生一个接收标志rx_flag。回环测试时,由于发送模块的发送使能信号tx_en接入接收模块的接收标志rx_flag,故在接收完成的时刻,发送模块同时开启发送,在10个字符过后,发送完成信号tx_done和下一字符接收完成标志rx_flag会在同一时刻置高,若此时发送模块状态机采用单独的时序逻辑进行当前状态和下一状态的切换,那么如图1所示,下一个时钟上升沿,当前状态寄存器才会更新回到初始状态,而此时发送使能信号已经拉低,故会丢失一个字符。
  MyUART
  而彬哥的串口例子中,状态判断和切换在一个always块中,故在rx_flag拉高(和tx_en连接)时,状态寄存器就更新回到了初试状态,在下一个时钟周期,由于txd_en仍有效,故继续进行字符发送。
  彬哥Crazybingo代码仿真
  而在实际的应用中,尤其是串口作为外设和CPU进行通讯时,回环测试中这种发送完成和发送使能同时有效的情况是不存在的,很容易想到,只有在串口模块给出发送完成的信号后,CPU才能继续给出发送使能信号进行数据的发送。