当前位置: 首页 > news >正文

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;//接收最大的字节个数,假设为10reg [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)beginif(!rst_n)r_rx_ready <= 2'b00;elser_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)beginif(!rst_n)rx_data_length <= 16’b0;else if(r_rx_ready==2'b01)rx_data_length <= rx_data_length + 1'b1;elserx_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)beginif(!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;elserx_data_sum <= rx_data_sum;
end

http://www.lryc.cn/news/455074.html

相关文章:

  • 复习HTML(基础)
  • Linux聊天集群开发之环境准备
  • can 总线入门———can简介硬件电路
  • 【重学 MySQL】六十、空间类型
  • python实现DES算法
  • 基于LORA的一主多从监测系统_框架搭建
  • 优化理论及应用精解【25】
  • 贝锐蒲公英网盘首发,秒建私有云,高速远程访问
  • [ 蓝桥 ·算法双周赛 ] 第 19 场 小白入门赛
  • HTML+CSS基础 第二季课堂笔记
  • 【Easy RL】Easy RL蘑菇书全书学习笔记
  • JavaWeb(二)
  • 【C++】--类和对象(2)
  • 最新BurpSuite2024.9专业中英文开箱即用版下载
  • C++ 观察者模式
  • 基于pytorch的手写数字识别-训练+使用
  • SpringBoot接收前端传递参数
  • 【LeetCode周赛】第 418 场
  • Android学习7 -- NDK2 -- 几个例子
  • 问:说说JVM不同版本的变化和差异?
  • 计算机毕业设计 基于Python的社交音乐分享平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • 51单片机的水位检测系统【proteus仿真+程序+报告+原理图+演示视频】
  • Python和R及Julia妊娠相关疾病生物剖析算法
  • Web安全 - 重放攻击(Replay Attack)
  • Python项目文档生成常用工具对比
  • 教育领域的技术突破:SpringBoot系统实现
  • RabbitMQ入门3—virtual host参数详解
  • 【Nacos入门到实战十四】Nacos配置管理:集群部署与高可用策略
  • UE5+ChatGPT实现3D AI虚拟人综合实战
  • [图形学]smallpt代码详解(2)