这里写自定义目录标题

  • 环境
  • 层次结构
  • 仿真
  • 实现
    • HDL
      • 顶层文件
      • 仿真文件
      • dds文件
    • IP配置
    • FFT
    • ROM
    • COE文件生成
  • reference

环境

Vivado
Modelsim 仿真

层次结构

ROM matlab产生波形,保存到coe文件中,加载到rom中
dds 控制输入信号的频率
dds的输出信号给到fft IP核

仿真


左边为input,右边为output
输入信号的范围为0-255,包含直流分量,频率为单频

实现

HDL

顶层文件

module ip_fft(input clk,input rst);wire [7:0]      Out;wire [10:0]     addr;//=============================wire [31:0]     fft_s_axis_data_tdata;reg fft_s_axis_data_tvalid;wire fft_s_axis_data_tready;reg fft_s_axis_data_tlast;wire [63:0]     m_axis_data_tdata;wire [7:0]      m_axis_data_tuser;wire m_axis_data_tvalid;wire m_axis_data_tlast;wire m_axis_data_tready;reg [7:0]   counter;reg fft_flag;//assign fft_s_axis_data_tdata = {24'b0, Out};// assign fft_s_axis_data_tvalid = 1'b1;// assign fft_s_axis_data_tlast = (addr==11'b1)?1'b1:1'b0;assign m_axis_data_tready = 1'b1;always @(posedge clk ) beginif (!rst) begincounter <= 8'b0;endelse if(fft_s_axis_data_tready)  begincounter <= counter +1'b1;endendalways @(posedge clk ) beginfft_s_axis_data_tvalid  <= fft_s_axis_data_tvalid;fft_s_axis_data_tlast   <= 1'b0 ;fft_flag                <= fft_flag;if (!rst) beginfft_flag <= 1'b0;fft_s_axis_data_tlast <= 1'b0;fft_s_axis_data_tvalid <= 1'b0;endelse if(fft_flag == 1'b0)  beginif (counter == 8'hff) beginfft_flag <= 1'b1;fft_s_axis_data_tvalid <= 1'b1;endendelse if(fft_flag == 1'b1) beginif (counter == 8'hff) beginfft_s_axis_data_tvalid <= 1'b0;fft_s_axis_data_tlast <= 1'b1;endendelse beginfft_s_axis_data_tvalid  <= fft_s_axis_data_tvalid;fft_s_axis_data_tlast   <= fft_s_axis_data_tlast ;endend// outputwire [24:0]     realp;wire [24:0]     imagp;wire [50:0]     fft_abs;assign realp = m_axis_data_tdata[56:32];assign imagp = m_axis_data_tdata[24:0];assign fft_abs = $signed(realp)* $signed(realp)+ $signed(imagp)* $signed(imagp);xfft_0 u_xfft_0 (.aclk       (clk),                                                // input wire aclk.aresetn    (rst),                                          // input wire aresetn.s_axis_config_tdata    (8'b1),                                      // input wire [7 : 0] s_axis_config_tdata.s_axis_config_tvalid   (1'b1),                                    // input wire s_axis_config_tvalid.s_axis_config_tready   (),                                    // output wire s_axis_config_tready.s_axis_data_tdata  (fft_s_axis_data_tdata),                      // input wire [xx : 0] s_axis_data_tdata.s_axis_data_tvalid (fft_s_axis_data_tvalid),                    // input wire s_axis_data_tvalid.s_axis_data_tready (fft_s_axis_data_tready),                    // output wire s_axis_data_tready.s_axis_data_tlast  (fft_s_axis_data_tlast),                      // input wire s_axis_data_tlast.m_axis_data_tdata  (m_axis_data_tdata),                      // output wire [xx : 0] m_axis_data_tdata.m_axis_data_tuser  (m_axis_data_tuser),                      // output wire [7 : 0] m_axis_data_tuser.m_axis_data_tvalid (m_axis_data_tvalid),                    // output wire m_axis_data_tvalid.m_axis_data_tready (m_axis_data_tready),                    // input wire m_axis_data_tready.m_axis_data_tlast  (m_axis_data_tlast),                      // output wire m_axis_data_tlast.event_frame_started        ( ),                  // output wire event_frame_started.event_tlast_unexpected     ( ),            // output wire event_tlast_unexpected.event_tlast_missing        ( ),                  // output wire event_tlast_missing.event_status_channel_halt  ( ),                     // output wire event_status_channel_halt.event_data_in_channel_halt ( ),                   // output wire event_data_in_channel_halt.event_data_out_channel_halt( )                 // output wire event_data_out_channel_halt);dds  u_dds (.clk                     ( clk      ),    .rst                     ( rst      ),.Fword                   ( 32'h800_0000   ),.Pword                   ( 11'b0    ),.Out                     ( Out      ),.addr                    ( addr     ));
endmodule

仿真文件

module tb_ip_fft;// ip_fft Parametersparameter PERIOD  = 10;// ip_fft Inputsreg   clk                                  = 0 ;reg   rst                                  = 0 ;initialbeginforever #(PERIOD/2)  clk=~clk;endinitialbegin#(PERIOD*4) rst  =  1;endip_fft  u_ip_fft (.clk                     ( clk   ),.rst                     ( rst   ));endmodule

dds文件

module dds(input clk,input rst,input [31:0]Fword,input [10:0]Pword,output [7:0]Out,output [10:0] addr);reg [31:0] r_Fword;reg [10:0] r_Pword;reg [31:0] cnt;// wire [10:0] addr;always @(posedge clk ) beginr_Fword = Fword;r_Pword = Pword;endalways @(posedge clk or negedge rst) beginif(!rst)cnt <= 0;elsecnt <= cnt+r_Fword;endassign addr = cnt[31:21]+r_Pword;blk_mem_gen_0 u_blk_mem_gen_0 (.clka     (clk),          // input wire clka.ena      (1'b1),         // input wire ena.addra    (addr),         // input wire [10 : 0] addra.douta    (Out)           // output wire [7 : 0] douta);endmodule

IP配置

FFT



ROM




COE文件生成

matlab 代码,产生coe文件

%%
clc;
t=0:2*pi/(2^11-1):2*pi;
y=0.5*sin(t)+0.5;
figure; subplot(1,3,1); plot(y);
r=ceil(y*(2^8-1)); %将小数转换为整数,ceil是向上取整。
fid = fopen('sin.coe','w+'); %写到sin.coe文件,用来初始化sin_rom
fprintf(fid,'memory_initialization_radix=10;\n');
fprintf(fid,'memory_initialization_vector= \n');
for i = 1:1:2^11fprintf(fid,'%d',r(i));if i==2^11fprintf(fid,'; ');elsefprintf(fid,', ');end
%     if i%15==0
%         fprintf(fid,'\n');
%     end
end
fclose(fid);

reference

vivado 基于FPGA的dds学习记录
Vivado中FFT IP核的使用


都看到这儿了,点个赞吧!

Vivado环境下基于FPGA的IP实现FFT变换相关推荐

  1. Linux环境下基于策略的路由

    Linux环境下基于策略的路由 原文作者:Matthew G. Marsh 原文出处:[url]http://www.sysadminmag.com/linux/articles/v09/i01/a3 ...

  2. 【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机

    外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机(详细) 之前文章向大家介绍了 外网环境下基于FRP.VNC技术远程访问计算机,实现内网穿透 以及利用 WOL远程唤醒功能 基于FRP.VNC技 ...

  3. 可持续5G环境下基于机器学习的网络分片框架

    Machine Learning-Based Network Sub-Slicing Framework in a Sustainable 5G Environment 5G环境下的物联网框架 5G切 ...

  4. Freebsd 4.7环境下基于qmail系统的反病毒反垃圾邮件系统构建--fw

    Freebsd 4.7环境下基于 qmail系统的反病毒反垃圾邮件系统构建 第一部分:前 言 一.        版权信息 本文档的版权属于作者姜培军[peijun.jiang]所有.转摘时请附带本信 ...

  5. 科学计算机撤销,云计算环境下基于属性的撤销方案-计算机科学.PDF

    云计算环境下基于属性的撤销方案-计算机科学.PDF 第 卷 第 期 计 算 机 科 学 45 8 Vol.45No.8 年 月 2018 8 COMPUTER SCIENCE Au.2018 g 云计 ...

  6. C++:Windows环境下基于Eclipse配置C/C++开发环境

    C++:Windows环境下基于Eclipse配置C/C++开发环境 目录 Windows下的MinGW下载.安装和配置 1.MinGW下载 2.MinGW安装与配置 3.基于Eclipse配置 Wi ...

  7. vivado环境下实现比较器

    ** vivado环境下实现比较器 ** 比较逻辑功能 比较器要实现的功能比较简单,即:当A>B时,输出AGTB值为1:否则为0.在AGTB=0的情况下,为了更精准地看到究竟是A=B还是A< ...

  8. vivado环境下用Verilog语言实现编码器

    ** vivado环境下用Verilog语言实现编码器 ** 编码器的分类 编码器通常分为两大类: 普通编码器和优先编码器. 其中,普通编码器对某一个给定时刻只能对一个输入信号进行编码的编码器, 它的 ...

  9. PaddleOCR——Docker环境下基于HubServing模式部署Restful API服务(CPU版本)

    Docker环境下基于HubServing模式部署Restful API服务(CPU版本) 在日常项目应用中,相信大家一般都会希望能通过Docker技术,把PaddleOCR服务打包成一个镜像,以便在 ...

最新文章

  1. listen函数的第二个参数_【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(一)...
  2. Oracle之物化视图
  3. 搜索文件夹下包含的文件
  4. 成功解决getaddrinfo:请求的名称有效,但是找不到请求的类型的数据。(11004
  5. 数据链路层、交换机内容整合
  6. 记录 FreeBSD
  7. outlook反应慢的原因_环氧漆不固化是什么原因?固化剂的使用有关系!
  8. mysql lepus_MySQL 监控软件lepus天兔
  9. 哈希表存在的问题及解决方案
  10. ant编辑java忽略注释_java – 注释不起作用
  11. 问答| 为什么car-like robot运动中存在最小转弯半径?
  12. 关于企业软件资质申请流程以及时间规划(二)——软件登记测试
  13. unity相机渲染不同层的东西和相机的深度
  14. ecall 方法必须打包到系统模块中_基于SpringBoot+Vue+Mysql开发的进销存管理系统
  15. delphi与python_Delphi与Python结合之二
  16. 微信小程序人脸识别认证-微信开放接口
  17. 【供应链金融】五阿哥:如何打造钢铁电商独特供应链金融风控体系?
  18. STM32-GPRS模块连接系统主站
  19. 蠕虫勒索软件WannaCrypt0r的行为分析
  20. numpy常用公式收集

热门文章

  1. 2021-05-17 C#.NET面试题 什么是MVC模式
  2. VR广告飞入寻常百姓家?No,它现在还是海市蜃楼
  3. 置换矩阵(P)的逆是其转置(T)
  4. centOs服务器连接并简单使用
  5. 第5章 - 二阶多智能体系统的协同控制 --> 离散时间系统一致性
  6. py爬虫数据到本地Excel表格
  7. 最新标准法规-涉及欧盟、沙特、巴西、南非市场
  8. ClickHouse压测
  9. Jmeter性能压测
  10. 《灌水之道》--CSDN搞笑版