FPGA基础程序学习
第二节 UART通信
串口发送模块
在程序中,我们将 tx_flag 提前 1/16 个停止位拉低,确保发送模块发送数据的时间略小于接收模块接收数据的时间,否则当连续传输大量数据时,发送数据的时间会不断累积,最终导致在做串口环回实验时丢失数据。
尽管串口发送数据只是接收数据的反过程,理论上传输时间上一致,考虑到模块里计算波特率会有较小的偏差,且串口对端的通信设备(如电脑等)收发数据的波特率同样可能会出现较小偏差,因此为了确保环回实验的成功,将发送模块的停止位略微提前结束。
需要说明的是,较小偏差的波特率在串口通信时是允许的,同样可以保证数据可靠稳定的传输。另外我们在代码中将用于标志串口发送过程的 tx_flag 信号赋值给uart_tx_busy,并通过模块端口输出。这样其他模块可以通过检测 uart_tx_busy 信号是否为低电平,判断串口发送模块是否处于空闲状态。若 uart_tx_busy 为高,那么 uart_send 正在发送,外部模块需要等待发送过程结束后,才能通过 uart_en 信号的上升沿来启动新的发送过程。
我们使用开发板通过串口向上位机向发送 16 进制数55。串口发送使能信号 uart_en 的上升沿。在检测到 uart_en 的上升沿后,en_flag会拉高一个时钟周期,此时将 uart_din 端口上的待发送数据寄存到 tx_data 中,并进入串口发送过程。在整个发送过程中 tx_flag 保持高电平,tx_cnt 对串口数据进行计数,同时 tx_data 的各个数据位依次通过串口发送端 uart_txd 发送出去。当 tx_cnt 计数到9时,串口数据发送完成,开始发送停止位。在一个波特率周期的停止位发送完成后,串口发送过程结束,uart_tx_busy 信号拉低,表明串口发送模块进入空闲状态。