quartus ii FFT核使用

时间:2022-08-31 23:09:34

quartus ii FFT核使用

导入自己程序自带的txt文件,写出控制模块

时序图

quartus ii FFT核使用

FFT核文件给出的时序图输入

quartus ii FFT核使用

仿真时序图

quartus ii FFT核使用

1024个采样点数,输入结束

quartus ii FFT核使用

fft数据输出

quartus ii FFT核使用

quartus ii FFT核使用

quartus ii FFT核使用

2、代码

`timescale 1ns/1ns
module fft_ctrl
#(
parameter [:] fftpts_n = 'd11,
parameter [:] real_imag_wei = 'd16
)
(
//inputs
clk ,
reset_n ,
sink_valid ,//拉高表示通知FFT即将有N个数据输入
sink_real ,//输入数据的实部
sink_imag ,//输入数据的虚部
inverse ,//0 - FFT 1 - IFFT
fftpts_array_N , //采样的点数 //output
source_sop , //输出数据起始标记
source_eop , //输出数据结束标记
source_valid , //置高,准备输出结果
//从时序看应该是sink_ready和sink_valid同步的
sink_ready ,//FFT模块准备就绪,可以接收数据 output
sink_sop ,//输入数据起始标记脉冲(维持一个时钟的高电平),与第一个数据同步
sink_eop ,//输入数据结束标记脉冲(维持一个时钟的高电平),与最后一个数据同步
source_real ,//变换后输出数据的实部
source_imag ,//变换后输出数据的虚部
source_exp , //结果数据缩放因子:这
end_input , //数据输入结束
end_test , //数据输入结束 置1
end_output //数据输出结束 ); //******************************* input and output *********************// //inputs
input clk ;
input reset_n ;
input sink_valid ;//拉高表示通知FFT即将有N个数据输入
input [real_imag_wei - :] sink_real ;//输入数据的实部
input [real_imag_wei - :] sink_imag ;//输入数据的虚部
input inverse ;//0 - FFT 1 - IFFT
input [fftpts_n - :] fftpts_array_N; //采样的点数 //output
output source_sop ; //输出数据起始标记
output source_eop ; //输出数据结束标记
output source_valid ; //置高,准备输出结果
//从时序看应该是sink_ready和sink_valid同步的
output sink_ready ;//FFT模块准备就绪,可以接收数据 output
output [real_imag_wei - : ] source_real ;//变换后输出数据的实部
output [real_imag_wei - : ] source_imag ;//变换后输出数据的虚部
output [:] source_exp ; //结果数据缩放因子:这
output end_input; //数据输入结束
output reg end_test; //输入的数据结束 置1
output end_output; //数据输出结束
output sink_sop;//输入数据起始标记脉冲(维持一个时钟的高电平),与第一个数据同步
output sink_eop;//输入数据结束标记脉冲(维持一个时钟的高电平),与最后一个数据同步 //***************************** parameter and interface *************************// wire source_ready;//表明downstream模块(理解为FFT的后续接收数据模块)可以接收数据 input
wire [:] sink_error;
wire [:] source_error; localparam NUM_FRAMES_c = ; //输入数据的次数
//parameter MAXVAL_c = 2**(16 -1);
//parameter OFFSET_c = 2**(16);
//parameter MAXVAL_EXP_c = 2**5;
//parameter OFFSET_EXP_c = 2**6; //reg start;
//number of input frames
reg [:] frames_in_index;
//number of output frames
reg [:] frames_out_index;
// signal the end of the input data stream and output data stream.
reg [fftpts_n - :] cnt; ///////////////////////////////////////////////////////////////////////////////////////////////
// Clock Generation
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// Set FFT Direction
// '0' => FFT
// '1' => IFFT
// assign inverse = 1'b0; //no input error
assign sink_error = 'b0; // for example purposes, the ready signal is always asserted.
assign source_ready = 'b1; ///////////////////////////////////////////////////////////////////////////////////////////////
// All FFT MegaCore input signals are registered on the rising edge of the input clock, clk and
// all FFT MegaCore output signals are output on the rising edge of the input clock, clk.
////////////////////////////////////////////////////////////////////////////////////////////// // start valid for first cycle to indicate that the file reading should start.
/*
always @ (posedge clk or negedge reset_n)
begin
if (reset_n == 1'b0)
start <= 1'b1;
else
begin
if (sink_valid == 1'b1 & sink_ready == 1'b1)
start <= 1'b0;
end
end
*/
//sop and eop asserted in first and last sample of data
always @ (posedge clk or negedge reset_n)
begin
if (reset_n == 'b0)
cnt <= 'd0;
else
begin
if (sink_valid == 'b1 & sink_ready == 1'b1)
begin
if (cnt == fftpts_array_N - )
cnt <= 'd0;
else
cnt <= cnt + 'b1;
end
end
end // count the input frames and increment the index
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 'b0)
frames_in_index <= 'd0;
else
begin
if (sink_eop == 'b1 & sink_valid == 1'b1 & sink_ready == 'b1 & frames_in_index < NUM_FRAMES_c -1)
frames_in_index <= frames_in_index + 'b1;
end
end // count the output frames and increment the index
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 'b0)
frames_out_index <= 'd0;
else
begin
if (source_eop == 'b1 & source_valid == 1'b1 & source_ready == 'b1 & frames_out_index < NUM_FRAMES_c -1)
frames_out_index <= frames_out_index + 'b1;
end
end // signal when all of the input data has been sent to the DUT
assign end_input = (sink_eop == 'b1 & sink_valid == 1'b1 & sink_ready == 'b1 & frames_in_index == NUM_FRAMES_c - 1) ? 1'b1 : 'b0; // signal when all of the output data has be received from the DUT
assign end_output = (source_eop == 'b1 & source_valid == 1'b1 & source_ready == 'b1 & frames_out_index == NUM_FRAMES_c - 1) ? 1'b1 : 'b0; // generate start and end of packet signals
assign sink_sop = (cnt == ) ? 'b1 : 1'b0 ;
assign sink_eop = ( cnt == fftpts_array_N - ) ? 'b1 : 1'b0; //halt the input when done
always @(posedge clk or negedge reset_n)
begin
if (reset_n == 'b0)
end_test <= 'b0;
else
begin
if (end_input == 'b1)
end_test <= 'b1;
end
end ip_fft dut(
.clk (clk), //
.reset_n (reset_n), //
.inverse (inverse), //0 - FFT 1 - IFFT
.sink_real (sink_real), //输入数据的实部
.sink_imag (sink_imag), //输入数据的虚部
.sink_sop (sink_sop), //输入数据起始标记脉冲(维持一个时钟的高电平),与第一个数据同步
.sink_eop (sink_eop), //输入数据结束标记脉冲(维持一个时钟的高电平),与最后一个数据同步
.sink_valid (sink_valid), //拉高表示通知FFT即将有N个数据输入
.sink_error (sink_error), //指示数据流的错误信息:00——没有错误;01——丢失SOP;10——丢失EOP;11——多余的EOP;
.source_error (source_error), //表明upstream模块或者FFT模块出了问题,错误信息提示与sink_error一样 output
.source_ready (source_ready), //表明downstream模块(理解为FFT的后续接收数据模块)可以接收数据 input
.sink_ready (sink_ready), //FFT模块准备就绪,可以接收数据 output
.source_real (source_real), //变换后输出数据的实部
.source_imag (source_imag), //变换后输出数据的虚部
.source_exp (source_exp), //结果数据缩放因子:这个指数位的意思打个比方说吧,
//比如它是3,就是说这时输出的虚部和实部的数值要除以2的3次方,如果是10,就要除以2的10次方,
//如果对结果精度要求不高的话,可以直接截去相应的长度,
//比如指数是3,实部输出1011_0111_0111,那么此刻实际的值应该为1_0110_1110.111;取整就是101101110
.source_valid (source_valid), //置高,准备输出结果
.source_sop (source_sop), //输出数据起始标记
.source_eop (source_eop) //输出数据结束标记
); endmodule
// ================================================================================
// Legal Notice: Copyright (C) 1991-2008 Altera Corporation
// Any megafunction design, and related net list (encrypted or decrypted),
// support information, device programming or simulation file, and any other
// associated documentation or information provided by Altera or a partner
// under Altera's Megafunction Partnership Program may be used only to
// program PLD devices (but not masked PLD devices) from Altera. Any other
// use of such megafunction design, net list, support information, device
// programming or simulation file, or any other related documentation or
// information is prohibited for any other purpose, including, but not
// limited to modification, reverse engineering, de-compiling, or use with
// any other silicon devices, unless such use is explicitly licensed under
// a separate agreement with Altera or a megafunction partner. Title to
// the intellectual property, including patents, copyrights, trademarks,
// trade secrets, or maskworks, embodied in any such megafunction design,
// net list, support information, device programming or simulation file, or
// any other related documentation or information provided by Altera or a
// megafunction partner, remains with Altera, the megafunction partner, or
// their respective licensors. No other licenses, including any licenses
// needed under any third party's intellectual property, are provided herein.
// ================================================================================
// `timescale 1ns / 1ps
module ip_fft_ctrl_tb; //inputs
reg clk;
reg reset_n;
reg sink_valid;
reg[ - :] sink_real;
reg[ - :] sink_imag;
reg [:] fftpts_array_N;
reg inverse;
wire sink_sop;
wire sink_eop;
wire sink_ready; wire source_sop;
wire source_eop;
wire source_valid;
wire [:] source_exp;
wire [ - : ] source_real;
wire [ - : ] source_imag;
parameter NUM_FRAMES_c = ;
parameter MAXVAL_c = **( -);
parameter OFFSET_c = **();
parameter MAXVAL_EXP_c = **;
parameter OFFSET_EXP_c = **; // signal the end of the input data stream and output data stream.
wire end_test;
wire end_input;
wire end_output; integer fft_rf, fft_if;
integer expf;
integer data_rf,data_if;
integer data_real_in_int,data_imag_in_int;
integer fft_real_out_int,fft_imag_out_int;
integer exponent_out_int; initial
begin data_rf = $fopen("ip_fft_real_input.txt","r");
data_if = $fopen("ip_fft_imag_input.txt","r");
fft_rf = $fopen("ip_fft_real_output_ver.txt");
fft_if =$fopen("ip_fft_imag_output_ver.txt");
expf = $fopen("ip_fft_exponent_output_ver.txt");
# clk = 'b0;
inverse = ;
fftpts_array_N = 'd1024;
sink_valid = ;
inverse = ;
# reset_n = 'b0;
# reset_n = 'b1; end ///////////////////////////////////////////////////////////////////////////////////////////////
// Clock Generation
///////////////////////////////////////////////////////////////////////////////////////////////
always
begin
if (end_test == 'b1 & end_output == 1'b1)
begin
clk = 'b0;
$finish;
end
else
begin
# clk = 'b1;
# clk = 'b0;
end
end ///////////////////////////////////////////////////////////////////////////////////////////////
//采样的点数
//assign fftpts_array_N = 11'd1024; ///////////////////////////////////////////////////////////////////////////////////////////////
// All FFT MegaCore input signals are registered on the rising edge of the input clock, clk and
// all FFT MegaCore output signals are output on the rising edge of the input clock, clk.
////////////////////////////////////////////////////////////////////////////////////////////// // start valid for first cycle to indicate that the file reading should start.
reg start;
reg sink_valid_r;
always @ (posedge clk)
begin
if (reset_n == 'b0)
start <= 'b1;
else
begin
if (sink_valid_r == 'b1 & sink_ready == 1'b1)
start <= 'b0;
end
end ///////////////////////////////////////////////////////////////////////////////////////////////
// Read input data from files. Data is generated on the negative edge of the clock, clk, in the
// testbench and registered by the core on the positive edge of the clock \n";
///////////////////////////////////////////////////////////////////////////////////////////////
integer rc_x;
integer ic_x;
always @ (posedge clk)
begin
if(reset_n=='b0)
begin
sink_real<='b0;
sink_imag<='b0;
sink_valid_r <= 'b0;
end
else
begin
// send in NUM_FRAMES_c of data or until the end of the file
if((end_test == 'b1) || (end_input == 1'b1))
begin
sink_real<='b0;
sink_imag<='b0;
sink_valid_r <= 'b0;
end
else
begin
if ((sink_valid_r == 'b1 & sink_ready == 1'b1 ) ||
(start == 'b1 & !(sink_valid_r == 1'b1 & sink_ready == 'b0)))
begin
rc_x = $fscanf(data_rf,"%d",data_real_in_int);
sink_real <= data_real_in_int;
ic_x = $fscanf(data_if,"%d",data_imag_in_int);
sink_imag <= data_imag_in_int;
sink_valid_r <= 'b1;
end
else
begin
sink_real<=sink_real;
sink_imag<=sink_imag;
sink_valid_r <= 'b0;
end
end
end
end //////////////////////////////////////////////////////////////////////////////////////////////
// Write Real and Imginary Data Components and Block Exponent to Disk
//////////////////////////////////////////////////////////////////////////////////////////////
always @ (posedge clk)
begin
if((reset_n=='b1) & (source_valid == 1'b1))
begin
fft_real_out_int = source_real;
fft_imag_out_int = source_imag;
$fdisplay(fft_rf, "%d", (fft_real_out_int < MAXVAL_c) ? fft_real_out_int : fft_real_out_int - OFFSET_c);
$fdisplay(fft_if, "%d", (fft_imag_out_int < MAXVAL_c) ? fft_imag_out_int : fft_imag_out_int - OFFSET_c);
exponent_out_int = source_exp;
$fdisplay(expf, "%d", (exponent_out_int < MAXVAL_EXP_c) ? exponent_out_int : exponent_out_int - OFFSET_EXP_c);
end
end ///////////////////////////////////////////////////////////////////////////////////////////////
// FFT Module Instantiation
/////////////////////////////////////////////////////////////////////////////////////////////
fft_ctrl
#(
.fftpts_n('d11),
.real_imag_wei('d16)
) fft_ctrl
(
//inputs
.clk (clk ),
.reset_n (reset_n ),
.sink_valid (sink_valid_r ),//拉高表示通知FFT即将有N个数据输入
.sink_real (sink_real ),//输入数据的实部
.sink_imag (sink_imag ),//输入数据的虚部
.inverse (inverse ),//0 - FFT 1 - IFFT 0
.fftpts_array_N (fftpts_array_N ), //采样的点数 1024 //output
.source_sop (source_sop ), //输出数据起始标记
.source_eop (source_eop ), //输出数据结束标记
.source_valid (source_valid), //置高,准备输出结果
//从时序看应该是sink_ready和sink_valid同步的
.sink_ready (sink_ready ),//FFT模块准备就绪,可以接收数据 output
.sink_sop (sink_sop),//输入数据起始标记脉冲(维持一个时钟的高电平),与第一个数据同步
.sink_eop (sink_eop),//输入数据结束标记脉冲(维持一个时钟的高电平),与最后一个数据同步
.source_real (source_real),//变换后输出数据的实部
.source_imag (source_imag),//变换后输出数据的虚部
.source_exp (source_exp ), //结果数据缩放因子:这
.end_input (end_input ), //数据输入结束
.end_test (end_test ), //数据输入结束 置1
.end_output (end_output )//数据输出结束
); endmodule

quartus ii FFT核使用的更多相关文章

  1. 关于网上quartus ii 生成fft核出现问题解决

    ------------恢复内容开始------------ 关于网上quartus ii 生成fft核出现问题解决 1:必须把软件破解啦 2:必须把IP核破解啦 破解步骤网上也有可以直接看,一定要全 ...

  2. Altera FFT核使用详解

    简介 快速傅里叶变换(Fast Fourier Transform)最为一种高效的算法,被广泛的用于信号处理与数据分析等领域.对于设计工程师来讲,自己动手采样可编程语言来实现一个FFT/IFFT模块, ...

  3. &lbrack;重要更新&rsqb;&lbrack;Quartus II&rsqb;&lbrack;14&period;1正式版&rsqb;

    [Quartus II][14.1正式版] ----14.1版本最大的变化就是增加了2大系列的器件库: MAX 10和Arria 10.这2大系列据Altera中国区代理 骏龙科技的人说,就是为了和X ...

  4. 【7集iCore3基础视频】7-6 Quartus II 13&period;1安装

    Quartus II 13.1安装:高清源视频:链接:http://pan.baidu.com/s/1csVRMA 密码:lkth 视频勘误:http://pan.baidu.com/s/1mhCIq ...

  5. Quartus II USB-Blaster驱动解决

    Quartus II USB-Blaster驱动解决 之前安装Quartus II 13.0,但FPGA开发板链接的USB-Blaster链接无法被Quartus识别,改装Quartus II 11. ...

  6. Quartus II 增量编译

    在开发阶段,经常需要改代码,而且往往只改局部代码,但是编译的时候,通常会全部重新编译,这会很浪费时间,使得开发效率大大降低.那么有没有一种方法能够降低不必要的编译时间呢?通过查询Quartus II ...

  7. Quartus II 与 Modelsim 联调【转】

    Quartus II 9.0版本的时候软件还有自带的仿真工具,现在安装的是11.0以上版本,才发现 Quartus II 11.0以上取消了软件自带的波形仿真工具,因此需要波形仿真就要调用专业的仿真工 ...

  8. Quartus ii 12&period;1软件破解之后编译原有的工程出现报警错误的解决办法

    在Quartus ii 12.1软件破解之后,想用来编译原来编译过的工程,但是编译到最后出现下面两个错误警告: 原来以为没有破解成功或者安装的时候有文件被杀毒软件吃了,导致安装错误,又重新安装了两次都 ...

  9. Quartus ii 12&period;0 和ModelSim 10&period;1 SE安装及连接

    quartus ii 10.0后就没有自带的仿真软件,每次写完一个VerilogHDL都想简单仿真一下,结果发现没有了自带仿真软件.这时候就需要第三方仿真软件ModelSim 10.1 SE. Qua ...

随机推荐

  1. Sqlserver查询结果,让某列结果合并一列并且逗号分隔。

            create function [dbo].[mergeName](@Id bigint) returns nvarchar(500)     as     begin     dec ...

  2. 关于Integer类中parseInt&lpar;&rpar;和valueOf&lpar;&rpar;方法的区别以及int和String类性的转换&period;以及String类valueOf&lpar;&rpar;方法

    Integer类中的. 关于parseInt()方法的API文档.  返回的是int类型的 关于valueOf()方法的API文档 返回的是Integer类型的. 关于intValue()方法的API ...

  3. Deme&lowbar;遥感控制物体移动(涉及遮罩,小摄像机跟随)

    using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class JoyControl ...

  4. 学DSP&lpar;二&rpar;&colon;目标芯片28335&comma;GO&excl;

    28335开发板有了,之前没有用过TI的片子,还是先看看这个东西是啥东西. 进入28335的中文网页: http://www.ti.com.cn/product/cn/tms320f28335    ...

  5. Kubernetes 1&period;4 部署

    k8s 1.4 新版本部署 测试环境: node-: 10.6.0.140 node-: 10.6.0.187 node-: 10.6.0.188 kubernetes 集群,包含 master 节点 ...

  6. &sol;etc&sol;postfix下 main&period;cf 配置文件详解

    postconf -n   #别名数据库(postalias/newaliases 命令生成) alias_database = hash:/etc/postfix/aliases   #别名表,列出 ...

  7. (转)JVM性能调优之生成堆的dump文件

    转自:http://blog.csdn.net/lifuxiangcaohui/article/details/37992725 最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一 ...

  8. JavaScript日历控件开发

    概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果 代码地址:https://github.com/aspwebchh/javascript-cont ...

  9. 【LeetCode算法-14】Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. If there is n ...

  10. CPU VS GPU&lpar;性能调优 12&period;1&rpar;

    CPU VS GPU 关于绘图和动画有两种处理的方式:CPU(*处理器)和GPU(图形处理器).在现代iOS设备中,都有可以运行不同软件的可编程芯片,但是由于历史原因,我们可以说CPU所做的工作都在 ...