FPGA-UART串口接收模块的理解

UART串口接收模块

背景

在之前就有写过关于串口模块的文章------《串口RS232的学习》。工作后很多项目都会用到串口模块,又来重新理解一下FPGA串口接收的代码思路。

关于串口相关的参数,以及在文章《串口RS232的学习》中已有详细的描述,这里就不过多的赘述了。

uart_rx模块理解

一般来说,用FPGA实现串口数据的接收,其模块的输入和输出大多都会写成以下形式。

在该模块的输入端,时钟和复位信号不必多说;FPGA模块的Rx信号则是通过串口线与上位机的Tx端相连接进行数据的传输。

而在该模块的输出端,Rx_ready信号代表一帧数据(起始位+数据+校验位+停止位,校验位不一定有)的接收完成,当上位机传输了一帧数据之后,Rx_ready信号会被拉高一个时钟周期,代表接收到了一帧数据;而Rx_data一般代表一帧数据中的8位数据,当Rx_ready信号被拉高时,Rx_data=上位机发送过来的8位数据。

uart_rx接收数据后的处理

假设上位机向我们的FPGA板卡发送9 Byte的数据,这9 Byte的数据分别为8'H11、8'H22、8'H33、8'H44、8'H55、8'H66、8'H77、8'H88、8'H99。我们应该如何接收呢?

在不考虑超时处理和校验处理的情况下,可以用以下代码来接收上位机向FPGA板卡发送的数据。

复制代码
parameter MAX_RX_DATA_NUM = 10;//接收最大的字节个数,假设为10

reg [1:0]	r_rx_ready;			//缓存数据便于采集沿
reg [15:0] 	rx_data_length;		//接收数据的长度
reg [MAX_RX_DATA_NUM*8-1:0] rx_data_sum; //每个字节为10Bit,10字节所占的Bit为10*8


//当r_rx_ready=2'b01时,代表一帧数据的接收完成。
always(posedge clk or negedge rst_n)begin
	if(!rst_n)
		r_rx_ready <= 2'b00;
	else
		r_rx_ready <= {r_rx_ready[0],rx_ready}
end

//当r_rx_ready=2'b01时,代表接收到了一个字节的数据,接收数据的长度+1;
//由于接收9字节的数据,则rx_data_length的最大值为8
always(posedge clk or negedge rst_n)begin
	if(!rst_n)
		rx_data_length <= 16'b0;
	else if(r_rx_ready==2'b01)
		rx_data_length <= rx_data_length + 1'b1;
	else
		rx_data_length <= rx_data_length;
end

//将从上位机接收到的9字节数据,先发送的数据存入高位,按序依次放入rx_data_sum中
//此时,rx_data_sum[79:72]=8'H11;rx_data_sum[71:64]=8'H22;.....rx_data_sum[15:8]=8'H99;rx_data_sum[7:0]=8'H00;
always(posedge clk or negedge rst_n)begin
	if(!rst_n)
		rx_data_sum <= 'd0;
	else if(r_rx_ready==2'b01)
		rx_data_sum[((MAX_RX_DATA_NUM-rx_data_length)*8-1)-:8] <= rx_data;
	else
		rx_data_sum <= rx_data_sum;
end
相关推荐
Saniffer_SH19 小时前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡1 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安1 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐2 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯2 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客2 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA2 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发
明德扬2 天前
AD采集卡应用示例交流:从传感器采集到高速信号验证
fpga开发
傻童:CPU2 天前
PS与PL之间的交互
fpga开发
神奇元创2 天前
商用级光路加速卡:大模型推理的极速落地方案
python·神经网络·fpga开发·dsp开发