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.rhkb.cn/news/338262.html

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

相关文章

基础—SQL—DCL(数据控制语言)小结

一、总结 在SQL分类中的DCL语句部分&#xff0c;主要讲到了两个部分的知识。 1、用户管理 用户管理&#xff0c;主要是管理哪些用户可以访问当前 mysql 数据库。 包括&#xff1a;创建用户、修改用户密码以及删除用户 2、权限控制 权限管理&#xff0c;主要是控制我们当前用户…

iOS App Tech Support(URL)

咪萌是一个语音类交友直播App&#xff0c;分成红艳知己&#xff0c;点唱大厅&#xff0c;歌手驻唱等不同房间分类&#xff0c;广场可以看到其他人发的一些动态&#xff0c;一个非常不错的App 如果您有任何疑问&#xff0c;您可以留言或者将问题发送至我们的邮箱。 我们会第一时…

Python知识点5---字符串的使用

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的字符串在使用上和其他语言的差别不大&#xff0c;常规操作都…

GPT-4o VS GPT-3.5 完胜

前言&#xff1a; 最近&#xff0c;GPT-4o已经限时免费开放了&#xff0c;试了一下&#xff0c;然后&#xff0c;说我的时间到了&#xff0c;然后&#xff0c;有给我转到3.5&#xff0c;正好遇到一个问题做一下对吧&#xff0c;感觉4O完胜啊。3.5还是很好胡诌&#xff0c;也就…

java web爬虫

目录 读取本地文件 从网站读取文件 java爬虫 总结 读取本地文件 import java.io.File; import java.io.PrintWriter; import java.util.Scanner;public class ReplaceText {public static void main() throws Exception{File file new File("basic\\test.txt"…

如何使用Dora SDK完成Fragment流式切换和非流式切换

我想大家对Fragment都不陌生&#xff0c;它作为界面碎片被使用在Activity中&#xff0c;如果只是更换Activity中的一小部分界面&#xff0c;是没有必要再重新打开一个新的Activity的。有时&#xff0c;即使要更换完整的UI布局&#xff0c;也可以使用Fragment来切换界面。 何…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器&#xff0c;以下是对其的详细介绍&#xff1a; 1. 定义与别称&#xff1a; 激光焊接机&#xff0c;又常称为激光焊机、镭射焊机&#xff0c;是材料加工激光焊接时用的机器。 2. 工作原理&#xff1a; 激光焊接是利用高能量…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

电商商城管理系统

前言&#x1f440;~ 将近一个月没更新了&#xff0c;最近忙着学校的大作业&#xff0c;一个是微信小程序的、一个是互联网编程的&#xff0c;也是忙完了这个大作业&#xff0c;这个大作业前端使用了vue、后端使用了java&#xff0c;接下来展示一些效果图&#xff0c;如果有需要…

HTTPS协议原理

HTTPS协议原理 一.前言-为何要有https协议二.加密与中间方劫持1.什么是加密2.为何要加密3.对称加密1.小例子2.好处和缺点 4.非对称加密5.数据指纹/数据摘要 三.站在设计者的角度提出方案1.只使用非对称加密 : 且只有server有密钥2.只使用非对称加密 : 且双方都有密钥3.非对称对…

网络安全-钓鱼篇-利用cs进行钓鱼

一、环境 自行搭建&#xff0c;kill&#xff0c;Windows10&#xff0c;cs 二、原理 如图所示 三、钓鱼演示 首先第一步&#xff1a;打开System Profiler-分析器功能 选择克隆www.baidu.com页面做钓鱼 之后我们通过包装域名&#xff0c;各种手段让攻击对象访问&#xff1a;h…

TH方程学习(3)

一、编程实现 根据论文给出的案例&#xff0c;使用TH方程进行数值仿真 1.初始化条件 %% 参考文献<New State Transition Matrix for Relative Motion on an Aribitrary Elliptical Orbit> %% 作者 Yamanaka Koji clc;clear global miu Re miu 3.986e5; Re 6378.137;…

阿里云语音合成TTS直播助手软件开发

阿里云的TTS比较便宜&#xff0c;效果比不了开源克隆的那种&#xff0c;比纯机器人效果好一点点 阿里云sambert https://help.aliyun.com/zh/dashscope/developer-reference/quick-start-13 Sambert系列模型 1万字1元 &#xff0c;每主账号每模型每月3万字免费 创建API-KEY htt…

域内用户枚举和密码喷洒

一. 域内用户枚举原理和流量 1. 原理 在AS-REQ阶段客户端向AS发送用户名&#xff0c;cname字典存放用户名&#xff0c;AS对用户名进行验证&#xff0c;用户存在和不存在返回的数据包不一样。 不同之处主要是在返回数据包中的状态码不同&#xff0c;根据不同的状态码来区分账…

271 基于matlab的可调Q因子小波变换故障诊断

基于matlab的可调Q因子小波变换故障诊断&#xff0c;可用在轴承、齿轮、活塞等故障诊断中&#xff0c;程序中包含了原始TQWT工具箱和轴承振动信号信号的谱包络的求取。通过仿真数据、实际轴承数据说明了方法的效果。程序已调通&#xff0c;可直接运行。 271 可调Q因子小波变换 …

基于java的CRM客户关系管理系统(二)

目录 第二章 相关技术介绍 2.1 后台介绍 2.1.1 B/S平台模式 2.1.2 MVC 2.1.3 Spring 2.1.4 Hibernate 2.1.5 Struts 2.2 前端介绍 2.2.1 JSP网页技术 2.3 开发工具 2.4 本章小结 前面内容请移步 基于java的CRM客户关系管理系统&#xff08;二&#xff09; 资源…

查看docker中各个容器所占的资源

要查看Docker中的每个容器占用的资源&#xff0c;可以使用docker stats命令。这个命令提供了容器的实时资源使用统计&#xff0c;包括内存使用情况。以下是如何使用docker stats命令的示例&#xff1a; docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsa…

Appium安装及配置(Windows环境)

在做app相关自动化测试&#xff0c;需要使用appium来做中转操作&#xff0c;下面来介绍一下appium的环境安装配置 appium官方文档&#xff1a;欢迎 - Appium Documentation 一、下载appium 下载地址&#xff1a;https://github.com/appium/appium-desktop/releases?page3 通…

进程——linux

目录 冯诺依曼体系结构&#xff08;计算机组成原理与体系结构&#xff09; 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…