FPGA定点数FFT过后转换为浮点数与Matlab计算的FFT结果进行比对

目录

  • 1.前言
  • 2.FPGA的testbench中如何读取数据文件
  • 3.FPGA的testbench中如何将输出数据存储在文件中
  • 4.Matlab去读取testbench存储的文件数据
    • 4.1纯数字不带编码
    • 4.2 带编码的数据,如定点数

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1.前言

前面一篇文章讲了,Matlab将调制映射后的数据转化为定点数,放入FPGA中进行处理。那么定点数,在FPGA中进行FFT过后,如何验证其正确性呢?这就需要将FFT的输出数据读取出来,在Matlab中转化为浮点数,然后与Matlab使用FFT处理后的结果进行对比。

FFT

2.FPGA的testbench中如何读取数据文件

在verilog中可以使用系统函数readmemb和 readmemh从文件中读取数据到存储器中。

读取的内容只包括:空白位置(空格、换行、制表格(tab和form-feeds),注释行、二进制或十六进制的数字。

数字中不能包含位宽说明和格式说明,其中readmemb要求每个数字是二进制数,readmemh要求每个数字必须是十六进制数字。数字中不定值x或X,高阻值z或Z,和下划线(_)的使用方法和代表意义与一般Verilog HDL程序中的用法一致。

在Verilog语法中,一共有以下六种用法:

(1)$readmemb(“<数据文件名>”,<存储器名>);

(2)$readmemb(“<数据文件名>”,<存储器名>,<起始地址>);

(3)$readmemb(“<数据文件名>”,<存储器名>,<起始地址>,<终止地址>);

(4)$readmemh(“<数据文件名>”,<存储器名>);

(5)$readmemh(“<数据文件名>”,<存储器名>,<起始地址>);

(6)$readmemh(“<数据文件名>”,<存储器名>,<起始地址>,<终止地址>);

下面代码逻辑,展示了将NUM个数据读取到存储器中,并转化为WIDTH宽度的数据,供测试使用。verilog的语法中涉及到地址必须使用绝对路径,这里使用{},拼接语法将地址拼成{PATH,"test_data.txt"}样式,PATH路径设置为宏参,在有多个文件需要读取时,如果文件路径变动,仅仅需要改变路径宏参即可。

parameter		PATH 	= "D:/FPGA/OFDM_802.11a_my/TX/matlab/OFDM_802_11a_TX/";//地址
parameter		WIDTH 	= 4'd8	;
parameter		NUM 	= 720	;//需要根据输入测试数据长度更改此宏参
integer					i					;
integer					j					;
reg   					test_data [NUM-1:0]	;
reg   	[WIDTH - 1:0]	test_data_byte [NUM/WIDTH-1:0]	;
initial begin$readmemb({PATH,"test_data.txt"},test_data);for(i=0;i<NUM/WIDTH;i=i+1)beginfor(j=0;j<WIDTH;j=j+1)test_data_byte[i][j] = test_data[i*WIDTH+j];end
end

3.FPGA的testbench中如何将输出数据存储在文件中

以下代码逻辑展示了,FPGA的testbench中如何将输出数据存储在文件中:

integer 				data_out		;
wire       [:]             dout         ;
initial begindata_out  =  $fopen({PATH,"data_out.txt"});
end	//数据存储
always@(posedge clk)
beginif()begin$fdisplay(data_out,"%b",dout);end
end

4.Matlab去读取testbench存储的文件数据

4.1纯数字不带编码

如果文件里面的数据是像这样:

image
数据只是单纯表示数,不带有编码,直接使用load函数,读取进行比较即可:

load函数:将文件变量加载到工作区中。

语法

load(filename)load(filename,variables)load(filename,"-ascii")load(filename,"-mat")load(filename,"-mat",variables)S = load(___)load filename

说明

load(filename) 将数据从 filename 加载到 MATLAB® 工作区。如果 filename 是 MAT 文件,则 load(filename) 从文件中加载变量;如果 filename 是 ASCII 文件,则 load(filename) 从该文件加载包含数据的双精度数组。

load(filename,variables) 加载 MAT 文件 filename 中的指定变量。
load(filename,“-ascii”) 将 filename 视为 ASCII 文件,而不管文件扩展名如何。

load(filename,“-mat”) 将 filename 视为 MAT 文件,而不管文件扩展名如何。

load(filename,“-mat”,variables) 加载 filename 中的指定变量。

S = load(___) 使用上述语法中的任何输入参量组合将数据加载到 S 中。如果 filename 是 MAT 文件,则 S 是结构体数组;如果 filename 是 ASCII 文件,则 S 是一个包含文件中数据的 m×n 双精度数组,其中 m 是文件中的行数,n 是每行上值的数目。

load filename 是该语法的命令形式。命令形式需要的特殊字符较少。您无需键入括号或者将输入括在单引号或双引号内。使用空格(而不是逗号)分隔各个输入项。如果任一输入包含空格,请用单引号将其引起来。

例如,要加载名为 test.mat 的文件,以下语句是等效的:

load test.mat % command form
load(“test.mat”) % function form
您可以包括上述语法中介绍的任何输入。例如,要从名为 my file.mat 的文件中加载变量 X,请执行以下命令:

load ‘my file.mat’ X % command form, using single quotes
load(“my file.mat”,“X”) % function form, using double quotes
当有任何输入(例如 filename)为变量时,请不要使用命令格式。

想了解更详细建议去官网:https://ww2.mathworks.cn/help/matlab/ref/load.html

读取代码和效果如下:

FPGA_conv_dout = load([PATH,'conv_data_out.txt'])';

image

4.2 带编码的数据,如定点数

如果是带有编码的定点数(复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示),比如这种定点数格式的FFT的输出,就需要转化为浮点数,再与Matlab中的仿真结果进行比较。

我们知道,Xilinx的FFT IP核,输入和输出实部和虚部是放一起的,高位为虚部,低位为实部,按照上面说的定点数格式,输出就是16bit。

FFT输出

我们使用readlines,以字符串数组形式读取文件行。
语法

S = readlines(filename)
S = readlines(filename,Name,Value)

说明
S = readlines(filename) 通过读取一个包含 N 行的文件创建一个 N×1 字符串数组。
S = readlines(filename,Name,Value) 基于文件创建一个字符串数组,并通过一个或多个名称-值对组参量指定其他选项。例如,‘EmptyLineRule’,‘skip’ 跳过空行。

想了解更详细建议去官网:https://ww2.mathworks.cn/help/matlab/ref/readlines.html

读取代码和效果如下:

FPGA_dac_dout = readlines([PATH,'dac_data_out.txt'],'EmptyLineRule','skip')';

image

然后还需要反量化,转化为浮点数,与Matlab仿真结果进行比较,使用bin2num函数,配合使用 quantizer 对象将 2 的二进制补码字符串转换为数字。

语法

y = bin2num(q,b)

说明

y = bin2num(q,b) 使用 quantizer 对象的 q 属性将二进制字符向量 b 转换为数值数组 y。

如果 b 是包含二进制字符串的元胞数组,则 y 将是包含数值数组的相同维度的元胞数组。

[y1,y2,…] = bin2num(q,b1,b2,…) 将二进制字符向量 (b1, b2, …) 转换为数值数组 (y1, y2, …)。

想了解更详细建议去官网:https://ww2.mathworks.cn/help/fixedpoint/ref/bin2num.html

quantizer函数的相关参数和使用方法,请去翻公众号上一篇文章,这里不再赘述。

处理代码和效果如下:

FPGA_Im_dac_dout = extractBefore(FPGA_dac_dout,9);
FPGA_Re_dac_dout = extractAfter(FPGA_dac_dout,8);
FPGA_Re_dac_dout = bin2num(q,FPGA_Re_dac_dout);
FPGA_Im_dac_dout = bin2num(q,FPGA_Im_dac_dout);

image
其中还使用到了extractBefore,extractAfter函数,使用很简单,就是取字符串的前几位和后几位。bin2num之后数据类型为cell,还需要再转换一下,使用cell2mat函数,代码如下:

FPGA_Re_dac_dout = cell2mat(FPGA_Re_dac_dout);
FPGA_Im_dac_dout = cell2mat(FPGA_Im_dac_dout);
FPGA_dac_dout = FPGA_Re_dac_dout + 1j*FPGA_Im_dac_dout;

成功转换为浮点数,可以与Matlab仿真结果进行比较了。
image

实部

虚部
微信公众号获取更多FPGA相关源码:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-C3模组上实现蓝牙BLE配网功能(2)

接前一篇文章&#xff1a;ESP32-C3模组上实现蓝牙BLE配网功能&#xff08;1&#xff09; 本文内容参考&#xff1a; 《ESP32-C3 物联网工程开发实战》 乐鑫科技 蓝牙的名字由来是怎样的&#xff1f;为什么不叫它“白牙”&#xff1f; 特此致谢&#xff01; 一、蓝牙知识基础…

[数据集][目标检测]吉他检测数据集VOC+YOLO格式66张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;66 标注数量(xml文件个数)&#xff1a;66 标注数量(txt文件个数)&#xff1a;66 标注类别数…

Three.js——tween动画、光线投射拾取、加载.obj/.mtl外部文件、使用相机控制器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

YOLOv8 segment介绍

1.YOLOv8图像分割支持的数据格式&#xff1a; (1).用于训练YOLOv8分割模型的数据集标签格式如下: 1).每幅图像对应一个文本文件&#xff1a;数据集中的每幅图像都有一个与图像文件同名的对应文本文件&#xff0c;扩展名为".txt"; 2).文本文件中每个目标(object)占一行…

iReport的下载与安装

下载官网&#xff1a;Home - Jaspersoft Community 网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Oy5opY4GxPZ_mllTlBZ-2w 提取码&#xff1a;75do 安装就是双击后一直点击下一步 安装好了之后要配置jdk环境 iReport 目前 并不支持 高版本jdk 只支持…

TQSDRPI开发板教程:UDP收发测试

项目资源分享 链接&#xff1a;https://pan.baidu.com/s/1gWNSA9czrGwUYJXdeuOwgQ 提取码&#xff1a;tfo0 LWIP自环教程&#xff1a;https://blog.csdn.net/mcupro/article/details/139350727?spm1001.2014.3001.5501 在lwip自环的基础上修改代码实现UDP的收发测试。新建一…

嫁接打印:经济与实用的完美结合

在制造领域&#xff0c;寻求经济且好用的技术方案至关重要。而在模具制造中&#xff0c;3D 打印随形水路在提升冷却效率和产品良率方面的卓越表现已得到广泛认同。如何更经济的应用3D打印技术&#xff0c;就不得不说嫁接打印了。 在嫁接打印的制造过程中&#xff0c;产品的一部…

音视频开发—H264 SPS 和 PPS 参数说明

文章目录 序列参数集 (SPS, Sequence Parameter Set)SPS的主要内容&#xff1a; 图像参数集 (PPS, Picture Parameter Set)PPS的主要内容&#xff1a; Slice Header 结构 在H.264视频编码标准中&#xff0c;SPS和PPS是关键的参数集&#xff0c;它们提供了解码所需的各种配置信息…

Pytorch创建张量

文章目录 1.torch.from_numpy()2. torch.zeros()3. torch.ones()4. torch.arange()5. torch.linspace()6. torch.logspace()7. torch.eye()8. torch.empty()9. torch.full()10. torch.complex()10. torch.rand()10. torch.randint()11. torch.randn12. torch.normal()13. torch…

[数据集][目标检测]剪刀石头布检测数据集VOC+YOLO格式1973张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1973 标注数量(xml文件个数)&#xff1a;1973 标注数量(txt文件个数)&#xff1a;1973 标注…

Docker 简介和安装

目录 Docker 是什么 跟普通虚拟机的对比 打包、分发、部署 Docker 部署的优势 Docker 通常用来做什么 重要概念&#xff1a;镜像、容器 安装 镜像加速源 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚…

SAP揭秘者- SAP PP模块日常常见运维问题之工单入库失败原因分析及快速处理

文章摘要&#xff1a; 无论您是负责SAP实施项目还是负责SAP运维项目&#xff0c;当用户发现有SAP PP模块的各种异常问题的时都需要作为SAP PP顾问的您快速地理解用户提交的问题&#xff0c;并快速地解决这些问题&#xff0c; 上篇文章跟大家聊了基本单位维护错了怎么修改的解决…

ARC学习(2)基本编程模型认识(二)

笔者继续来学习一下arc的编程模型的寄存器信息。 1、core寄存器深入 参数寄存器&#xff1a;r0-r7&#xff0c;8个参数&#xff0c;暂存器&#xff1a;r10-r15保存寄存器&#xff1a;r16-r25 调用函数需要保存的寄存器指针寄存器&#xff1a;gp&#xff08;全局指针&#xff09…

functional函数对象库学习

类模板 std::function 是一种通用多态函数包装器。std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标——函数&#xff08;通过其指针&#xff09;、lambda 表达式、bind 表达式或其他函数对象&#xff0c;以及成员函数指针…

FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录 前言一、实验原理二、Verilog文件2.1 时钟分频2.2 超声波测距2.3 超声波驱动 三、实现过程3.1 模块说明3.2 引脚分配 三、演示视频总结参考 前言 环境 硬件 DE2-115 HC-SR04超声波传感器 软件 Quartus 18.1 目标结果 使用DE2-115开发板驱动HC-SR04模块&#xff0…

Windows 下 PostgreSQL 图形化界面安装、配置详解

相信大家对PostgreSQL都不陌生吧&#xff0c;自从MySQL被Oracle所控制后&#xff0c;PostgreSQL就成为了国内去O的首选数据库了&#xff0c;并且PostgreSQL目前不受任何商业公司控制&#xff0c;所以国内很多厂商都是基于PostgreSQL做二次开发来实现数据库自主可控的目标(国内很…

简单模拟实现shell(Linux)

目录​​​​​​​ 前言 展示效果 实现代码 前言 该代码模拟了shell的实现&#xff0c;也就是解析类似于“ls -a -l"的命令&#xff0c;当我们启动我们自己写的shell的可执行程序时&#xff0c;我们输入"ls"的命令&#xff0c;也可以展示出在shell中输入&…

学习笔记——网络参考模型——TCP/IP模型(物理层)

一、TCP/IP模型-物理层 1、数据传输(交换)的形式 (1)电路交换 特点&#xff1a;通信双方独占通信链路。 优点&#xff1a;数据传输时延小&#xff0c;适用于实时通信&#xff1b;数据按序发送&#xff0c;不存在失序问题&#xff1b;适合模拟信号和数字信号传输。 缺点&am…

【前缀和】42. 接雨水

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&am…

IDEA+MyBatisX根据mapper方法自动添加注解和生成xml方法结构

前提&#xff1a;确保IDEA已安装并启用了MyBatisX插件 在service层写dao或mapper的方法结构&#xff0c;反向生成dao层方法声明&#xff0c;如下&#xff1a; void updateStock(Long skuId, Long wareId, Integer skuNum); 由于该方法传递多个参数&#xff0c;为了让MyBatis识…