0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MATLAB代码仿真介绍

FPGA之家 来源:数字积木 作者:数字积木 2022-07-06 10:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1,MATLAB代码仿真

首先介绍下信号混频的相关概念。混频就是把两个不同频率的信号混合,得到第三个频率。数字电路中最常见的混频方法就是将两个信号相乘。将两个频率为 f0,f1 的正弦波进行相乘,根据积化和差公式,得到两个频率分量为 f0+f1 ,f0-f1 的信号。数字混频在通信的调制,解调,DUC(数字上变频),DDC(数字下变频)等系统中应用广泛。通常把其中一个信号称为本振信号( local oscillator ),另一个我信号称为混频器的输入信号。

下面的matlab代码用于验证混频器的设计。

%%信号混频

%%将两个频率为 f0,f1 的正弦波进行相乘,根据积化和差公式,得到两个频率分量为 f0+f1 ,f0-f1 的信号

clear all;close all;clc;

fs = 100*10e6; %采样频率 100MHz

f1 = 2*10e6; %信号0的频率 2MHz

f0 = 1.5*10e6; %信号1的频率 1.5MHz

fpass =1.7*10e6; %低通滤波器通带频率

fstop =1.9*10e6; %低通滤波器截止频率

DIV = 16

N = 4096; %采样点数

t = 0 : 1/fs : (N-1)/fs; %设置采样时间

Sig0 = sin (2*pi*f0*t); %生成信号0

Sig1 = sin (2*pi*f1*t); %生成信号1

Sig = Sig0 .*Sig1; %两个信号进行相乘

% 进行快速傅里叶变化,得到频谱

XK0 = fft(Sig0);

XK1 = fft(Sig1);

XK = fft(Sig);

%设置频率

f = ( 0:N/DIV-1 )*fs/( N * 10e6 ); %单位设置为MHz

Amax = max (abs( XK(1:N/DIV)));

f0 = [0 fpass/(10e6 ) fstop/(10e6 ) ( N/DIV-1 )*fs/( N * 10e6 ) ];

A = [ Amax Amax 0 0 ];

%绘制时域波形图

figure(1);

subplot(3,1,1); plot(t,Sig0); title(“频率为1.5MHz的正弦信号”);xlabel(“时间(s)”);ylabel(“幅度”);

subplot(3,1,2); plot(t,Sig1); title(“频率为2.0MHz的正弦信号”);xlabel(“时间(s)”);ylabel(“幅度”);

subplot(3,1,3); plot(t,Sig); title(“1.5MHz和2.0MHz正弦波相乘得到的信号”);xlabel(“时间(s)”);ylabel(“幅度”);

%绘制频域图

figure(2);

subplot(3,1,1); plot(f, ( abs( XK0(1:N/DIV) ) ) );title(“1.5MHz正弦信号的频谱”);xlabel(“频率(MHz)”);ylabel(“幅度”);

subplot(3,1,2); plot(f, ( abs( XK1(1:N/DIV) ) ) );title(“2.0MHz正弦信号的频谱”);xlabel(“频率(MHz)”);ylabel(“幅度”);

subplot(3,1,3); plot(f, ( abs( XK(1:N/DIV) ) ) );title(“1.5MHz和2.0MHz正弦波相乘得到的信号的频谱”);xlabel(“频率(MHz)”);ylabel(“幅度”);

hold on;

%低通滤波器示意图

plot( f0 ,A );

在该仿真代码中,设置采样时钟为100MHz,两个信号的频率分别为1.5MHz 和2.0 MHz 。两个信号相乘后,产生一个频率分量为 0.5MHz ( 2.0MHz - 1.5MHz ) 和3.5MHz ( 2.0MHz + 1.5MHz ) 的信号。时域图显示如下:

f6f9c744-fcc2-11ec-ba43-dac502259ad0.png

频域图显示如下:

f71b0a3a-fcc2-11ec-ba43-dac502259ad0.png

如图上所示,混频后得到了两个频率频率分量为 0.5MHz 和 3.5 MHz的信号。将该信号通过一个截止频率为2.0MHz左右的滤波器中,即可过滤掉 3.5 MHz的高频信号,只留下 0.5MHz的信号。即如上图橙色曲线所示。

2.MATLAB设计滤波器系数。

利用matlab的 滤波器设计工具箱( Filter Designer )可以非常方便地设计出符合工程要求的滤波器,在该工具箱中可以直接导出用于FPGA 滤波器设计的系数文件。

f73fdf72-fcc2-11ec-ba43-dac502259ad0.png

打开该工具箱后,默认显示如下:

f75506d6-fcc2-11ec-ba43-dac502259ad0.png

进行简单的设置:

滤波器类型:低通滤波器

滤波器形式:fir

滤波器阶数:100

频率单位:MHz

采样频率:100MHz

通带频率:1MHz

截止频率:2MHz

滤波器参数设置好后,点击 Designer Filter 按钮,稍等片刻,即可出现设计好的滤波器的频幅相应曲线。【注】由于是初学乍练,以上的参数设计的不一定合理,其中某些概念还不是很懂,还望通信大神指点。

f763a042-fcc2-11ec-ba43-dac502259ad0.png

由于要在FPGA中使用,还要将浮点型的系数转化为定点数。如下图设置,设置输出格式为定点数,位宽为16bit.

f7758424-fcc2-11ec-ba43-dac502259ad0.png

接下来就可以生成用于FPGA设计的系数文件了。在菜单【 Targets 】下点击【 XILINX coefficient(.coe)file 】,保存即可。

f7899cde-fcc2-11ec-ba43-dac502259ad0.png

.coe文件中的内容大致如下,存储了滤波器的各个系数,用16进制表示。

f79a2e64-fcc2-11ec-ba43-dac502259ad0.png

至此,滤波器就设置完成了。

3.建立FPGA工程。

利用xilinx 的vivado工具来建立 fir 滤波器系统,对上述的matlab 程序进行硬件验证。两路正弦波信号可以用vivado 的DDS IP生成,乘法操作用乘法器IP实现,用vivado自带的fir 滤波器实现滤波。利用vivado 的 block design 工具,可以不写一行代码,实现FPGA系统的搭建。先预览下搭建好的一个简单的fir 系统工程。

f7aea8c6-fcc2-11ec-ba43-dac502259ad0.png

该工程中,利用两个DDS 输出 1.5MHz 和 2.0MHz 的正弦波,利用乘法器IP进行两路信号的相乘,实现混频操作。再讲混频的信号通过一个fir滤波器,实现滤波操作。先亮以下仿真结果,漂亮的波形图。

f7bc8b6c-fcc2-11ec-ba43-dac502259ad0.png

滤波器完美输出了0.5MHz的波形,滤掉了3.5MHz的高频波。不过这是在仿真中的结果,在实际工程中,输入的信号可能含有噪声,失真等缺陷,实际效果不可能如此完美,但这个仿真结果也可以说明问题,在理想的输入下,该滤波器可以完美地滤掉高频波。下面详细介绍 FPGA 工程的搭建。

1,建立 block design 工程。

在vivado 工具中点击 create block design ,输入 fir_system ( 该名称可以任意指定 )。

f7d8449c-fcc2-11ec-ba43-dac502259ad0.png

2,添加IP。

在新打开的 Diagram 视图中,添加IP 块。点击 “ + ”号,在弹出的对话框中输入DDS,双击DDS compiler ,即可将DDS IP 加入到块图中。

f7e9b4ca-fcc2-11ec-ba43-dac502259ad0.png

按照上面的方法依次添加两个 DDS( DDS compiler ) IP ,两个截位( slice )IP ,一个fir滤波器(fir compiler) IP,一个乘法器( mult )IP,如下图。

f803f48e-fcc2-11ec-ba43-dac502259ad0.png

3,设置IP。

IP添加后,还有经过配置参数才能使用。双击IP 块即可进行配置。

(1)DDS配置。

两个DDS模块,一块设置输出为2.0MHz,一个设置输出为1.5MHZ,其余设置保持相同即可。时钟频率一定要设置为100MHz,和前面matlab仿真保持一致。

f8121fbe-fcc2-11ec-ba43-dac502259ad0.png

f822490c-fcc2-11ec-ba43-dac502259ad0.png

另一个DDS设置为1.5MHz 。设置方法同上。需要注意的是,如上图显示,输出数据端口(MAXISDATA_TDATA)为16bit ,高8位为 正弦波(sin)数据,低8位为余弦波(cos)数据。

(2)slice IP设置。

该IP用于截位操作,设置如下,输入为16bit,输出为8bit,为16bit的bit7到bit0.位宽为8bit.该IP用于截取从DDS输出的正弦波数据。

f82da612-fcc2-11ec-ba43-dac502259ad0.png

(3)乘法器IP配置。

输入位宽设置为8bit 有符号数,流水线级数采用建议的延时,设置为3.表示从输入到乘法结果输出经过3个时钟周期延时。其余可保持默认。

f83f6ea6-fcc2-11ec-ba43-dac502259ad0.png

f8511c14-fcc2-11ec-ba43-dac502259ad0.png

(4)移位寄存器设置。

移位寄存器用以延时数据有效信号,使其与乘法器的输出保持同步。由于乘法器有3个时钟的延迟,故将移位寄存器深度也设置为3,使其输出比输入延迟3个时钟周期。其余可保持默认。

f8619ada-fcc2-11ec-ba43-dac502259ad0.png

(5)fir滤波器配置。

滤波器的系数设置为coe文件,加载前面在matlab生成的coe文件,稍等片刻即可在左边窗口看到该滤波器的幅频响应曲线。将输入采样频率和时钟频率都设置为100MHz。其余可默认。

f8809e9e-fcc2-11ec-ba43-dac502259ad0.png

f88d6c00-fcc2-11ec-ba43-dac502259ad0.png

4,引出端口。

鼠标选中端口,右键选择 make external,即可导出端口。

f89e651e-fcc2-11ec-ba43-dac502259ad0.png

5,IP连接。

IP最终连接如下图。

f8a974e0-fcc2-11ec-ba43-dac502259ad0.png

6,生成代码。

按照下图,选中块设计,右键先选择 “ generate output product.。.”,等待完成后在选择 “create HDL wrapper.。.”,即可自动生成顶层代码。

f8c6e4ee-fcc2-11ec-ba43-dac502259ad0.png

如果出现下面的界面,可选择下拉菜单中的最大值,这个选项表示运行时vivado软件可使用的最大核心数。

f8db9272-fcc2-11ec-ba43-dac502259ad0.png

最终自动生成的顶层代码如下,就是对建立的原理图工程做了模块调用,其本质还是Verilog代码。

f8e84dfa-fcc2-11ec-ba43-dac502259ad0.png

4,FPGA仿真验证。建立如下的测试文件:

module tb_fir( );

wire [7:0]adc0_sin;

wire [7:0]adc1_sin;

wire [15:0]fir_in;

wire [39:0]fir_out_tdata;

wire fir_out_tvalid;

reg sysclk;

fir_system_wrapper fir_system_wrapper

.adc0_sin ( adc0_sin ),

.adc1_sin ( adc1_sin ),

.fir_in ( fir_in ),

.fir_out_tdata ( fir_out_tdata ),

.fir_out_tvalid ( fir_out_tvalid ),

.sysclk ( sysclk )

);

initial

begin

sysclk = 0;

#50000 $stop(2);

end

always #5 sysclk = ~sysclk;

Endmodule

由于该工程的逻辑已在源代码中完成,故在测试文件只是对顶层模块做了例化和产生时钟信号。最后仿真结果如下图:

f7bc8b6c-fcc2-11ec-ba43-dac502259ad0.png

滤波器完美输出了0.5MHz的波形,滤掉了3.5MHz的高频波。

原文标题:matlab+vivado设计数字滤波器

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    189

    文章

    3018

    浏览量

    237637
  • 滤波器
    +关注

    关注

    162

    文章

    8361

    浏览量

    184790
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73160

原文标题:matlab+vivado设计数字滤波器

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【产品介绍】Modelsim:HDL语言仿真软件

    仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
    的头像 发表于 11-13 11:41 205次阅读
    【产品<b class='flag-5'>介绍</b>】Modelsim:HDL语言<b class='flag-5'>仿真</b>软件

    RISCV指令二进制编码利用matlab生成E203仿真可用文件

    鉴于nuclei studio IDE生成的.verilog难懂,为了方便对单条或者几条指令进行测试,我们队伍编写了matlab代码来实现E203仿真可以识别到的文件。 matlab
    发表于 10-22 07:06

    vivado仿真时GSR信号的影响

    利用vivado进行设计xilinx FPGA时,写完设计代码仿真代码后,点击run simulation(启动modelsim进行仿真)。
    的头像 发表于 08-30 14:22 1035次阅读
    vivado<b class='flag-5'>仿真</b>时GSR信号的影响

    OptiSystem应用:用MATLAB组件实现振幅调制

    本案例展示了在OptiSystem中调用MATLAB代码实现振幅调制。 一、建模目标 案例中,我们生成两束功率为0dBm,频率分别为192.7THz、191THz的载波,合束之后经过自定义脉冲的调制
    发表于 06-13 08:46

    利用MATLAB对交流电机调速系统进行建模和仿真

    技术是借助计算机及相关技术,对真实系统的运行过程和状态进行数字化模拟的技术。Simulink作为MATLAB的一个组件,能够实现对动态系统的建模、仿真和综合分析。本文在Simulink环境中建立面向电气
    发表于 06-06 14:31

    MATLAB电机仿真精华50例【干货】

    空载建立电压、突然短路、接整流负载时的电压畸变、六相交直流混合供电同步发电机仿真。5、电机仿真实验系统介绍仿真实验系统的界面设计思路和流程、回调函数编写。 本书主要面向从事电机电气自动
    发表于 04-01 16:23

    如何用FOC电机控制MATLAB仿真

    [导读]本文将介绍如何用FOC电机控制MATLAB仿真,首先从整体结构及功能介绍,用MATLAB2013以上版本打开文件,看到如图1所示界面
    发表于 03-28 14:51

    直流电机控制方法的Matlab仿真研究

    速度控制模型,以提高无刷直流电机速度控制系统的稳定性和抗干扰能力 。使用 Matlab/Simulink 工具箱建立无刷直流电机的仿真模型,研究结果表明,模糊自适应 PID 算法能够使无刷直流电机的速度
    发表于 03-27 12:15

    MATLAB仿真在直流电机双闭环调速系统中的应用

    在分析了直流调速系统原理的基础上,在MATLAB/SIMULINK 仿真环境下对转速、电流双闭环调速系统建模并进行了仿真分析。仿真结果表明,该控制系统模型具有转速、转矩响应好和
    发表于 03-20 13:03

    MATLAB中的simulink中仿真速度过慢,状态量数值很小可以忽略,怎么忽略较小数值,加快仿真进度呢?

    由于目前我使用MATLAB中的Simscape Multibody插件进行仿真测试,载入物理模型后,使用PID搭建了初步的控制器。进行计算时,只能使用变步长的模式去求解,而且其计算步长特别小(大概为
    发表于 02-23 23:08

    OptiSystem应用:用MATLAB组件实现振幅调制

    本案例展示了在OptiSystem中调用MATLAB代码实现振幅调制。 一、建模目标 案例中,我们生成两束功率为0dBm,频率分别为192.7THz、191THz的载波,合束之后经过自定义脉冲的调制
    发表于 02-14 09:39

    单片机学习—C51源代码和Proteus仿真文件

    单片机学习—C51源代码和Proteus仿真文件.zip, 有各种例子
    发表于 02-10 13:46 2次下载

    matlab里的simulink仿真一个推挽升压仿真电路,输出带载能力很差?

    新手用了matlab里的simulink搭了个推挽仿真,pwm输出为28khz,占空比0.45,变压器匝数比1:31,输入电压12v,输出电压310v,想做个功率1kw的,然后接了个96.1的负载,输出电压只有160多v了。*附件:newpushpull.zip空载带载变
    发表于 02-07 20:01

    SPICE混合电路仿真介绍

    电子发烧友网站提供《SPICE混合电路仿真介绍.pdf》资料免费下载
    发表于 01-22 17:14 2次下载
    SPICE混合电路<b class='flag-5'>仿真</b><b class='flag-5'>介绍</b>

    Simulink与 MATLAB 的结合使用 Simulink中的信号处理方法

    被快速搭建和仿真MATLAB 在信号处理中的作用 MATLAB 是一个强大的数学计算工具,它提供了大量的内置函数和工具箱,用于信号的生成、分析和处理。以下是 MATLAB 在信号处
    的头像 发表于 12-12 09:25 2213次阅读