FPGA之手把手教你写串口协议解析(STM32与FPGA数据互传) 您所在的位置:网站首页 串口数据包解析 FPGA之手把手教你写串口协议解析(STM32与FPGA数据互传)

FPGA之手把手教你写串口协议解析(STM32与FPGA数据互传)

2023-05-18 05:05| 来源: 网络整理| 查看: 265

文章目录 博主的念叨一、任务介绍1、本文目标2、设计思路3、设计注意事项 二、设计代码1.串口接收代码2.串口发送代码3.串口解析代码4.顶层代码 总结

博主的念叨

最近趁热打铁做了一个关于STM32与FPGA通信并且控制高速DA模块产生不同频率信号的正弦波、方波、三角波和锯齿波的项目,从中收获到了很多东西,也踩了一些雷和坑,将分为几篇文章将整个过程分享出来。

这一次准备分享的是对串口数据的解析和赋值。解析的数据由STM32发出,通过串口连接至FPGA开发板的串口上,通过串口接收模块接收到数据后在回环模块中将数据进行处理,最终将处理的数据送到FPGA的串口发送模块中并将数据反馈回STM32中。

本文参考正点原子EP4CE系列开发板的源码,做了部分修改

一、任务介绍 1、本文目标

实现STM32和FPGA的串口通信,并将STM32传输过来的频率信息和波形信息解析存入定义的reg变量中。后续其他外设需要调用频率信息或者波形信息只需要实例化此串口模块即可。

2、设计思路

根据设计需求,需要对串口数据进行接收解析,同时需要把解析的数据传送给内存单元以及串口发送单元。其中发送单元的作用为方便调试观察数据是否被成功解析,解析的数据传输给内存单元单独设置一个v文件进行赋值。底层文件设置好以后设置顶层文件,实例化底层v文件,其中输入为时钟线、复位信号以及串口输入信号,输出为解析出的数据及串口输出信号。

3、设计注意事项

1、串口通信属于异步通信方式,因此出现信号是不确定的,为了防止亚稳态的产生,需要对信号打拍子避免亚稳态的产生。

2、一般采集数据在计数到数据位中间时采集较为稳定

3、串口波特率要对的上,否则无法进行正常通信

4、请事先了解一下串口通信协议

5、本文串口通信协议是 EA 频率高位 频率中位 频率低位 波形 AE,其中EA代表起始标志,AE代表停止标志。频率高位代表频率/65536,中位代表%65536/256,低位代表%65526%256

二、设计代码 1.串口接收代码 //****************************************Copyright (c)***********************************// //---------------------------------------------------------------------------------------- // File name: uart_recv // Last modified Date: 2023/4/27 15:02:00 // Last Version: V1.1 // Descriptions: UART串口接收模块 //---------------------------------------------------------------------------------------- // Created by: 技术小董 // Created date: 2023/4/27 15:02:00 // Version: V1.0 // Descriptions: The original version //---------------------------------------------------------------------------------------- //****************************************************************************************// module uart_recv( input sys_clk, //系统时钟 input sys_rst_n, //系统复位,低电平有效 input uart_rxd, //UART接收端口 output reg uart_done, //接收一帧数据完成标志 output reg rx_flag, //接收过程标志信号 output reg start_status, //开始接收标志 output reg stop_status, //停止接收标志 output reg [ 3:0] rx_cnt, //接收数据计数器 output reg [ 7:0] rxdata, output reg [ 7:0] uart_data //接收的数据 ); //parameter define parameter CLK_FREQ = 50000000; //系统时钟频率 parameter UART_BPS = 9600; //串口波特率 localparam BPS_CNT = CLK_FREQ/UART_BPS; //为得到指定波特率,需要对系统时钟计数BPS_CNT次 //reg define reg uart_rxd_d0; reg uart_rxd_d1; reg [15:0] clk_cnt; //系统时钟计数器 //wire define wire start_flag; //***************************************************** //** main code //***************************************************** //捕获接收端口下降沿(起始位),得到一个时钟周期的脉冲信号 assign start_flag = uart_rxd_d1 & (~uart_rxd_d0); //对UART接收端口的数据延迟两个时钟周期 always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin uart_rxd_d0


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有