news 2026/7/28 18:31:54

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/7/17 7:31:39

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

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

作者头像 李华
网站建设 2026/7/21 3:20:09

lottie-web完全指南:让设计师的AE动画在网页上完美呈现

还在为网页动画开发而烦恼吗&#xff1f;设计师精心制作的After Effects动画&#xff0c;到了开发环节却要重新编写代码&#xff1f;lottie-web正是为解决这一痛点而生&#xff01;作为Airbnb开源的高性能动画渲染库&#xff0c;它能让设计师导出的JSON文件直接在网页上流畅播放…

作者头像 李华
网站建设 2026/7/24 8:20:47

错过Open-AutoGLM就等于错过AI未来?10位专家联合推荐的必读评测

第一章&#xff1a;Open-AutoGLM智能体 评测Open-AutoGLM 是一个基于 GLM 架构构建的开源自动化智能体框架&#xff0c;专注于任务分解、工具调用与多步推理能力的实现。该智能体能够在无需人工干预的情况下完成复杂指令&#xff0c;适用于自动化客服、代码生成、数据分析等多种…

作者头像 李华
网站建设 2026/7/19 11:34:09

岐金兰AI元人文构想:是什么,不是什么

岐金兰AI元人文构想&#xff1a;是什么&#xff0c;不是什么人类在环、语境主权、规则内生&#xff1a;https://zsyyb.cn/abs/202512.03695引言&#xff1a;一次范式的地壳运动在人工智能与人类文明关系的讨论已趋于概念化、术语化的今天&#xff0c;“岐金兰AI元人文构想”的出…

作者头像 李华
网站建设 2026/7/24 14:28:00

ormpp C++ ORM框架实战指南:高效简化数据库操作

ormpp C ORM框架实战指南&#xff1a;高效简化数据库操作 【免费下载链接】ormpp modern C ORM, C17, support mysql, postgresql,sqlite 项目地址: https://gitcode.com/gh_mirrors/or/ormpp 在现代C开发中&#xff0c;数据库操作是不可或缺的一环。传统的数据库编程往…

作者头像 李华
网站建设 2026/7/27 14:44:30

Media Downloader:让多媒体下载变得简单高效

还在为复杂的命令行下载工具而头疼吗&#xff1f;Media Downloader为您提供了完美的解决方案。这款基于Qt/C开发的开源软件&#xff0c;将多个命令行下载引擎整合到一个直观的图形界面中&#xff0c;让多媒体下载变得前所未有的简单。 【免费下载链接】media-downloader Media …

作者头像 李华