FPGA数字频率合成器及fir滤波器设计(利用vivado dds、fir ip核)

2024-02-23 06:50

本文主要是介绍FPGA数字频率合成器及fir滤波器设计(利用vivado dds、fir ip核),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工作任务

1.逻辑使用200MHz时钟做参考,做一个DDS数字频率合成器产生1MHz、10MHz和50MHz的正弦波,然后相加得到一个三音正弦波形。\
2.然后用MATLAB设计一个带通FIR滤波器,16bit量化,导出抽头文件,在FPGA上实现,对前面的三音信号进行带通滤波,滤掉1MHz和50MHz频率,得到一个10MHz的正弦波。\
3.编写TestBench对工程进行仿真,并在米联客7035开发板上综合运行,使用内置逻辑分析仪观察信号波形。

设计方案

1.倍频–clking winzard ip核(100Mhz–>200Mhz)\
2.dds adder3模块(调用dds ip核产生1MHz、10MHz和50MHz的正弦波,并合成)\
3.fir ip模块(带通FIR滤波)\
4.tb仿真\
5.ILA板级验证

实验流程

MATLAB——滤波器设计

在这里插入图片描述
Simulation–testbench 仿真结果
在这里插入图片描述
在这里插入图片描述
Simulation–ILA 板级仿真
在这里插入图片描述

具体过程

1.米联客7035开发板的晶振为100Mhz,而实验要求为200Mhz,所以需要调用时钟ip核进行倍频

clk_wiz_double u_clk_wiz_double(// Clock out ports.clk_out1(clk),     // output clk_out1// Clock in ports.clk_in1(sys_clk));      // input clk_in1

在这里插入图片描述
2.调用dds ip核进行频率合成,分别产生1MHz、10MHz和50MHz的正弦波

dds_1mhz u_dds_1mhz (.aclk(clk),                              // input wire aclk//.m_axis_data_tvalid(data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sin_1mhz)    // output wire [7 : 0] m_axis_data_tdata
);dds_10mhz u_dds_10mhz (.aclk(clk),                              // input wire aclk//.m_axis_data_tvalid(data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sin_10mhz)    // output wire [7 : 0] m_axis_data_tdata
);dds_50mhz u_dds_50mhz (.aclk(clk),                              // input wire aclk//.m_axis_data_tvalid(data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sin_50mhz)    // output wire [7 : 0] m_axis_data_tdata
);

在这里插入图片描述
3.构建加法器进行三音合成,有符号数相加为防止溢出需进行符号位扩展

always@(posedge clk )beginsin_add = {{2{sin_1mhz[7]}},sin_1mhz} + {{2{sin_10mhz[7]}},sin_10mhz} + {{2{sin_50mhz[7]}},sin_50mhz};end

4.利用matlab进行fir滤波器参数设计,导出coe文件。利用vivado fir ip核进行滤波器设计,fir滤波器输入为16位,所以需要对三音合成后的10位输出进行符号位扩展。

always @(posedge clk) beginfir_in = {{6{fir_in_10[9]}},fir_in_10};
endassign 	s_axis_data_tvalid = 1'b1;fir_dds_adder3 u_fir_dds_adder3 (.aclk(clk),                              // input wire aclk.s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid//.s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready.s_axis_data_tdata(fir_in),    // input wire [15 : 0] s_axis_data_tdata//.m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(fir_out)    // output wire [31 : 0] m_axis_data_tdata
);

在这里插入图片描述
在这里插入图片描述
5.后续进行testbench仿真,调用ila ip核进行板级验证。

ila_0 u_ila_0 (.clk(clk), // input wire clk.probe0(sys_clk), // input wire [0:0]  probe0  .probe1(sin_1mhz), // input wire [7:0]  probe1 .probe2(sin_10mhz), // input wire [7:0]  probe2 .probe3(sin_50mhz), // input wire [7:0]  probe3 .probe4(sin_add), // input wire [9:0]  probe4 .probe5(fir_out) // input wire [31:0]  probe5
);

程序代码

代码详情分为三个模块:
1.top模块

`timescale 1ns / 1psmodule top_dds_fir(
input	sys_clk
//output wire	clk,
//output wire	[7:0]	sin_1mhz,sin_10mhz,sin_50mhz,
//output wire	[9:0]	sin_add,
//output wire	[31:0]	fir_out,
//output wire	[9:0]	fir_in_10);wire	clk;
wire	[7:0]	sin_1mhz,sin_10mhz,sin_50mhz;
wire	[9:0]	sin_add;
wire	[31:0]	fir_out;
//wire	[9:0]	fir_in_10;dds_adder3  u_dds_adder3(
.clk		(clk)       ,
.sin_1mhz   (sin_1mhz)	,
.sin_10mhz  (sin_10mhz)	,
.sin_50mhz  (sin_50mhz)	,
.sin_add    (sin_add)	);fir_ip u_fir_ip(
.clk			(clk		),
.fir_in_10		(sin_add	),
.fir_out		(fir_out	));//assign fir_in_10 = sin_add;clk_wiz_double u_clk_wiz_double(// Clock out ports.clk_out1(clk),     // output clk_out1// Clock in ports.clk_in1(sys_clk));      // input clk_in1ila_0 u_ila_0 (.clk(clk), // input wire clk.probe0(sys_clk), // input wire [0:0]  probe0  .probe1(sin_1mhz), // input wire [7:0]  probe1 .probe2(sin_10mhz), // input wire [7:0]  probe2 .probe3(sin_50mhz), // input wire [7:0]  probe3 .probe4(sin_add), // input wire [9:0]  probe4 .probe5(fir_out) // input wire [31:0]  probe5
);endmodule

2.dds模块

`timescale 1ns / 1psmodule dds_adder3(
input	clk,
output  [7:0] sin_1mhz,
output  [7:0] sin_10mhz,
output  [7:0] sin_50mhz,
output	reg[9:0]	sin_add);//wire	data_tvalid;
//wire[7:0] sin_1mhz;
//wire[7:0] sin_10mhz;
//wire[7:0] sin_50mhz;dds_1mhz u_dds_1mhz (.aclk(clk),                              // input wire aclk//.m_axis_data_tvalid(data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sin_1mhz)    // output wire [7 : 0] m_axis_data_tdata
);dds_10mhz u_dds_10mhz (.aclk(clk),                              // input wire aclk//.m_axis_data_tvalid(data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sin_10mhz)    // output wire [7 : 0] m_axis_data_tdata
);dds_50mhz u_dds_50mhz (.aclk(clk),                              // input wire aclk//.m_axis_data_tvalid(data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sin_50mhz)    // output wire [7 : 0] m_axis_data_tdata
);always@(posedge clk )beginsin_add = {{2{sin_1mhz[7]}},sin_1mhz} + {{2{sin_10mhz[7]}},sin_10mhz} + {{2{sin_50mhz[7]}},sin_50mhz};endendmodule

3.fir模块

`timescale 1ns / 1psmodule fir_ip(
input	clk,
input	[9:0]	fir_in_10,
output	[31:0]	fir_out);reg	[15:0]	fir_in;wire	s_axis_data_tvalid;always @(posedge clk) beginfir_in = {{6{fir_in_10[9]}},fir_in_10};
endassign 	s_axis_data_tvalid = 1'b1;fir_dds_adder3 u_fir_dds_adder3 (.aclk(clk),                              // input wire aclk.s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid//.s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready.s_axis_data_tdata(fir_in),    // input wire [15 : 0] s_axis_data_tdata//.m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(fir_out)    // output wire [31 : 0] m_axis_data_tdata
);endmodule

代码链接:
工程下载

这篇关于FPGA数字频率合成器及fir滤波器设计(利用vivado dds、fir ip核)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737840

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不