news 2026/4/24 22:50:28

FPGA 通过 UART 通讯解析上位机数据包:三段式状态机实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FPGA 通过 UART 通讯解析上位机数据包:三段式状态机实战

实际项目开发中用到的代码,FPGA通过uart通讯解析上位机发送的数据包,并实现数据存储和调用,采用三段式状态机,Verilog语言。 数据包包含帧头、命令、数据长度、数据、16位的crc校验(会给出对应的多项式)、帧尾。 为了保证帧头和帧尾唯一性,使用了字符转义,并且在检测出帧头错误,校验错误,帧尾错误时会返回特定的指令给上位机,实现与PC端握手。 资料包含工程文件(可选quartus或Xilinx),代码(带注释),testbench,可运行仿真查看波形。

在实际项目开发里,FPGA 与上位机通过 UART 通讯实现数据交互是非常常见的需求。今天咱就唠唠如何用 Verilog 语言结合三段式状态机,让 FPGA 准确解析上位机发送的数据包,并完成数据存储和调用。

数据包结构剖析

咱们要解析的数据包包含这么几个部分:帧头、命令、数据长度、数据、16 位的 CRC 校验(对应的多项式会给出)以及帧尾。为了保证帧头和帧尾的唯一性,这里还用到了字符转义。

比如说,假设帧头定义为8'hAA,帧尾定义为8'hBB。一旦检测出帧头错误、校验错误或者帧尾错误,FPGA 就得返回特定指令给上位机,实现与 PC 端握手。

三段式状态机 Verilog 代码实现

状态定义

typedef enum reg [2:0] { IDLE = 3'b000, WAIT_HEADER = 3'b001, RECEIVE_CMD = 3'b010, RECEIVE_LEN = 3'b011, RECEIVE_DATA = 3'b100, RECEIVE_CRC = 3'b101, CHECK_CRC = 3'b110, WAIT_TAIL = 3'b111 } state_t;

这里我们定义了不同的状态,IDLE是初始空闲状态,等待接收数据。WAIT_HEADER用于等待帧头,后续每个状态对应数据包不同部分的接收和处理。

状态转移逻辑

always @(posedge clk or negedge rst_n) begin if (!rst_n) begin current_state <= IDLE; end else begin case (current_state) IDLE: begin if (uart_rx_valid) begin if (uart_rx_data == HEADER) begin current_state <= WAIT_HEADER; end end end WAIT_HEADER: begin if (uart_rx_valid) begin if (uart_rx_data == HEADER) begin current_state <= RECEIVE_CMD; end else begin current_state <= IDLE; end end end // 其他状态转移类似,这里省略部分代码 CHECK_CRC: begin if (crc_calculated == uart_rx_crc) begin current_state <= WAIT_TAIL; end else begin // 返回校验错误指令给上位机 send_error_cmd(CRC_ERROR); current_state <= IDLE; end end WAIT_TAIL: begin if (uart_rx_valid) begin if (uart_rx_data == TAIL) begin // 数据解析成功,存储数据 store_data(); current_state <= IDLE; end else begin // 返回帧尾错误指令给上位机 send_error_cmd(TAIL_ERROR); current_state <= IDLE; end end end endcase end end

在这段代码里,从IDLE状态开始,一旦检测到uartrxvalid信号有效且接收到正确的帧头,就转移到WAITHEADER状态进一步确认帧头。CHECKCRC状态下,比较计算出的 CRC 和接收到的 CRC,如果不一致就返回校验错误指令给上位机。WAIT_TAIL状态则检查帧尾是否正确,不正确同样返回错误指令。

数据存储和调用

reg [7:0] data_store [0:255]; reg data_index; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin data_index <= 0; end else if (current_state == RECEIVE_DATA) begin data_store[data_index] <= uart_rx_data; data_index <= data_index + 1; end end function [7:0] get_data; input [7:0] index; begin get_data = data_store[index]; end endfunction

这里定义了一个数组datastore来存储接收到的数据,dataindex记录存储位置。在RECEIVEDATA状态时,将接收到的数据存入数组。getdata函数用于后续调用存储的数据。

工程相关资料

资料里包含工程文件(可以选择 quartus 或者 Xilinx),代码都是带有详细注释的,方便大家理解每一步的操作。同时还有 testbench,通过运行仿真就能查看波形,直观地验证我们设计的正确性。比如说,通过观察波形,我们可以看到各个状态的转移是否正确,数据的接收和存储是否符合预期。

通过这样一套设计,我们就实现了 FPGA 通过 UART 通讯准确解析上位机数据包,并完成数据存储和调用,利用三段式状态机让整个流程清晰明了,有条不紊。希望这篇博文能给大家在相关项目开发中提供一些有用的思路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 17:05:42

Twitter智能运营系统构建:基于Tweepy的自动化生态实践

Twitter智能运营系统构建&#xff1a;基于Tweepy的自动化生态实践 【免费下载链接】tweepy tweepy/tweepy: Tweepy 是一个 Python 库&#xff0c;用于访问 Twitter API&#xff0c;使得在 Python 应用程序中集成 Twitter 功能变得容易。 项目地址: https://gitcode.com/gh_mi…

作者头像 李华
网站建设 2026/4/20 9:16:03

d3dx10_35.dll文件免费下载方法 解决打不开程序丢失找不到问题

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/23 11:32:43

d3dx10_37.dll文件免费下载方法 解决程序丢失找不到打不开的问题

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/25 2:58:19

如何用AI助手快速解决Kubernetes性能瓶颈:完整实战指南

如何用AI助手快速解决Kubernetes性能瓶颈&#xff1a;完整实战指南 【免费下载链接】kubectl-ai AI powered Kubernetes Assistant 项目地址: https://gitcode.com/GitHub_Trending/kub/kubectl-ai 在云原生应用快速发展的今天&#xff0c;Kubernetes已成为企业级容器编…

作者头像 李华
网站建设 2026/4/24 3:23:36

Sandboxie Classic 在 Windows 11 24H2 中的访问令牌兼容性深度解析

Sandboxie Classic 在 Windows 11 24H2 中的访问令牌兼容性深度解析 【免费下载链接】Sandboxie Sandboxie Plus & Classic 项目地址: https://gitcode.com/gh_mirrors/sa/Sandboxie 问题现象&#xff1a;突然失效的沙箱环境 近期&#xff0c;不少用户反馈在Window…

作者头像 李华
网站建设 2026/4/18 18:17:05

终极指南:3步掌握U-Net模型注意力可视化技术

终极指南&#xff1a;3步掌握U-Net模型注意力可视化技术 【免费下载链接】Pytorch-UNet PyTorch implementation of the U-Net for image semantic segmentation with high quality images 项目地址: https://gitcode.com/gh_mirrors/py/Pytorch-UNet 你是不是经常困惑于…

作者头像 李华