首页 > 编程知识 正文

nvme用fpga实现,fpga除法器ip核使用

时间:2023-05-04 09:39:45 阅读:54648 作者:980

说明:通过对比Matlab的实践,利用Xilinx FFT IP核实现多个FFT。

代码下载:实现Xilinx FFT IP核心Verilog代码

工程下载: FFT工程

200页FPGA/IC秋季招聘面试试题

文章目录一、快速傅里叶变换IP核心介绍二、FFT IP核心使用1、1KHz采样率、1024分FFT2、2.5GHz采样率、8192分FFT

一.快速傅里叶变换IP核介绍

主要包括配置接口、时域数据输入接口、时钟复位接口、频域数据输出接口、状态接口。

IP核心关键端口介绍:

名称说明aclk输入模块的工作时钟、上升沿有效aclken输入时钟使能信号、高电平有效、低电平时内核停止工作,该信号降低内核工作的最大时钟频率aresetn,实现低电平同步复位信号s_axis_config_tvalid输入配置通道的tvalid,表示外部主机可以断言以提供数据s_axis_config_tready输出配置通道的就绪性内核断言s_axis_config_tdata输入配置信道上的tdata,指示它准备接收数据,并声明配置信息、NFFT、FWD/INV、CP_LEN、 和SCALE_SCH输入数据:由携带s_axis_data_tvata_的外部主机断言,以提供数据s_axis_data_tready输出输入数据信道tready 指示内核断言可以接收数据s_axis_data_tdata输入数据通道tdara,并由外部主机提供待处理的数据s_axis_data_tdata

只有生成了事件event_tlast_unexpected和event_tlast_missing时,内核才使用它输出数据。 m_axis_data_tvalid输出输出数据通道tvalid表示内核可以提供数据m_axis_data_tvalid的外部群集机可以提供数据m_axis_data_tvalid 内核提供FFT之后的数据m_axis_data_tuser输出数据通道tuser,内核提供XK_INDEX、OVFLO、blk_tuser

根据您的配置,例如1024点,每个点为32位,高16位为虚部,低16位为实部。

http://www.Sina.com/http://www.Sina.com /

根据您的配置,例如1024点,每个点为32位,高16位为虚部,低16位为实部。

IP核心配置

)频道数,1~12。

)转换点数,8~65536。

)工作时钟频率,1~1000。

:数据的比特率。

)根据时钟频率和比特率自动选择。

)允许流水线IO、连续数据处理。 只有在使用单通道时才能选择流水线IO。

)采用磁盘4、突发IO、迭代方法加载和处理数据。 资源消耗比流水线体系结构少,但转换时间长

有点不同。 蝴蝶4帧的转换点数为64 ~ 65536,其他帧数为8 ~ 65536。

)使用与磁盘2、突发IO、Radix-4相同的迭代方法,但蝶形运算单元更小。

与Radix-4体系结构相比,资源消耗更少,但转换时间更长。

)基于磁盘2 -Lite、突发IO和Radix-2体系结构。 该变体采用时分复用方式实现蝶形运算单元,

实现更少的资源消耗,但转换时间变长。

)运行中可以配置转换点数。

四种FFT体系结构的资源消耗和吞吐量之间的关系:

:数据格式、定点、浮点。

)缩放选项,

)数据省入模式。

:输入数据宽度。

)相位因子幅度。

:输出名次。

) :输出序列号。

)数据溢出标志。

:数据。

)相位因子。

)排序缓冲区。

)复数乘法器。

)蝶形运算单元。

二、FFT IP核的使用以1、1KHz采样率、1024点的FFT矩阵产生原信号s,将1024点的数据写入FPGA的ROM

采样率为1000Hz,信号为100Hz、200Hz、300Hz重叠,FFT点数为1024。

清除全部; row=3; column=1; N=1024; fs=1000; %采样间隔为1/1000t=(1:1024 )/fs; %时间轴f0=100

; %载频频率f1=200; %载频频率f2=300; %载频频率y1=100*exp(1i*2*pi*f0*t); y2=100*exp(1i*2*pi*f1*t);y3=100*exp(1i*2*pi*f2*t);y=y1+y2+y3; %信号产生real_y = int32(real(y)); %实部imag_y = int32(imag(y)); %虚部a=[real_y;imag_y];s = int32(bitshift(imag_y,16)+real_y);%将实部和虚部拼接为32bit(实部16bit+虚部16bit)s = s'; %此数据输出到FPGA%绘制原信号subplot(row,column,1);plot(t,y);title("时域");xlabel('t');ylabel('y');grid on;%FFTf=(0:N-1)*(fs/N);fft_y=fft(y,N); %FFTabs_fft_y=abs(fft(y,N)); %FFT取绝对值subplot(row,column,2); %FFT波形plot(f,fft_y);title("FFT");xlabel('t');ylabel('y');grid on;subplot(row,column,3); %FFT取绝对值波形plot(f,abs_fft_y);title("FFT取绝对值");xlabel('t');ylabel('y');grid on;

数据通过coe文件写入ROM:

FPGA端IP核的配置:



将时域数据写入ROM,通过FFT IP核后得到以下结果:

结果展现:
FPGA FFT波形,第三通道是时域数据,第五通道是FFT,第六通道是FFT取绝对值的波形。

采样率为1000Hz,1024个点。

观察下图中f变量(可以表示频率的横轴),三个峰值对应的频率为100Hz,200Hz,300Hz。

Verilog代码:
Xilinx FFT IP核 Verilog代码实现

2、2.5GHz采样率、8192点FFT

Matlab产生原实信号 s,将8192点的数据写入FPGA的ROM

采样率为2.5GHz,信号为100Hz、350Hz、500Hz叠加,FFT点数为1024。

clcclear all;close all;row=3;column=1;N=8192;fs=2.5e9; %采样间隔为1/1000t=(1:N)/fs; %时间轴f0=100e6; %载频频率f1=350e6; %载频频率f2=500e6; %载频频率y1=20*exp(1i*2*pi*f0*t); y2=20*exp(1i*2*pi*f1*t);y3=20*exp(1i*2*pi*f2*t);y=y1+y2+y3; %信号产生real_y = int32(real(y)); %实部imag_y = int32(imag(y)); %虚部a=[real_y;imag_y];s = int32(bitshift(imag_y,16)+real_y);%将实部和虚部拼接为32bit(实部16bit+虚部16bit)s = s'; %此数据输出到FPGA%绘制原信号subplot(row,column,1);plot(t,y);title("时域");xlabel('t');ylabel('y');grid on;%FFTf=(0:N-1)*(fs/N);fft_y=fft(y,N); %FFTabs_fft_y=abs(fft(y,N)); %FFT取绝对值subplot(row,column,2); %FFT波形plot(f,fft_y);title("FFT");xlabel('t');ylabel('y');grid on;subplot(row,column,3); %FFT取绝对值波形plot(f,abs_fft_y);title("FFT取绝对值");xlabel('t');ylabel('y');grid on;


将时域数据写入ROM,通过FFT IP核后得到以下结果:

结果展示:第四通道是时域数据,第六通道是FFT取绝对值的波形。

观察图中f变量(可以表示频率的横轴),三个峰值对应的频率为100Hz,350Hz,500Hz。

Verilog代码:
Xilinx FFT IP核 Verilog代码实现

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。