matlab 与 modelsim 联调 cic抽取滤波器

注:本设计的参数为:D=2,R=5,N=3;时钟频率为50mhz,输入信号为有符号8位,根据公式bmax=bin+N*log(2,R*D);可以得到bmax=18;

1,cic抽取滤波器原理

网上资料一大堆,不说了。重点在于传递函数,以及各个部分的结构。

2,simulink仿真

模型图

频谱仪显示结果

3,cic滤波器verilog 代码

module cic_dec(clk,rst_n,datain,dataout);
input clk,rst_n;
input [7:0] datain;
output [7:0] dataout;
reg [17:0] data_buff;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
data_buff<=0;
else
data_buff<={{10{datain[7]}},datain};
end

reg [17:0] integ1_result;

[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
integ1_result<=0;
else
integ1_result<=data_buff+integ1_result;
end

reg [17:0] integ2_result;

[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
integ2_result<=0;
else
integ2_result<=integ1_result+integ2_result;
end

reg [17:0] integ3_result;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
integ3_result<=0;
else
integ3_result<=integ2_result+integ3_result;
end
//integrator end
//decimation start
reg dec_flag;
reg [17:0] dec_result;
reg [2:0] cnt1;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt1<=0;
else if(cnt1==3‘d4)
cnt1<=0;
else
cnt1<=cnt1+1‘b1;
end
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
dec_result<=0;
else if(cnt1==3‘d4)
dec_result<=integ3_result;
end
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
dec_flag<=1‘b0;
else if(cnt1==3‘d4)
dec_flag<=1‘b1;
else
dec_flag<=1‘b0;
end
//decimation end
// comb filter begin
reg [2:0] cnt2;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt2<=0;
else if(dec_flag)
cnt2<=0;
else
cnt2<=cnt2+1‘b1;
end
reg [17:0] comb1_delay1;
reg [17:0] comb1_delay2;
reg [17:0] comb1_result;
[email protected](posedge clk or negedge rst_n)//first comb
begin
if(!rst_n)
begin
comb1_delay1<=0;
comb1_delay2<=0;
end
else if(cnt2==3‘d3)
begin
comb1_delay1<=dec_result;
comb1_delay2<=comb1_delay1;
end
end
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
comb1_result<=0;
else if(dec_flag)
comb1_result<=dec_result-comb1_delay2;
end

reg [17:0] comb2_delay1;
reg [17:0] comb2_delay2;
reg [17:0] comb2_result;
[email protected](posedge clk or negedge rst_n)//second comb
begin
if(!rst_n)
begin
comb2_delay1<=0;
comb2_delay2<=0;
end
else if(cnt2==3‘d3)
begin
comb2_delay1<=comb1_result;
comb2_delay2<=comb2_delay1;
end
end
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
comb2_result<=0;
else if(dec_flag)
comb2_result<=comb1_result-comb2_delay2;
end

reg [17:0] comb3_delay1;
reg [17:0] comb3_delay2;
reg [17:0] comb3_result;
[email protected](posedge clk or negedge rst_n)//third comb
begin
if(!rst_n)
begin
comb3_delay1<=0;
comb3_delay2<=0;
end
else if(cnt2==3‘d3)
begin
comb3_delay1<=comb2_result;
comb3_delay2<=comb3_delay1;
end
end
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
comb3_result<=0;
else if(dec_flag)
comb3_result<=comb2_result-comb3_delay2;
end
reg [7:0] dataout_buff;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
dataout_buff<=0;
else
dataout_buff<=(comb3_result[17:0]+{!comb3_result[17],{9{comb3_result[17]}}})>>10;
end
assign dataout=dataout_buff;
endmodule

4,matlab产生正弦波形文件采样频率50m,正弦频率1m

0=1e6;
fs=50e6;
N=fs/f0;
n=0:N-1;
t=n/fs;
width=8;

sinwave=sin(2*pi*f0*t);
sindata = round(sinwave .* (2^(width-1) - 1));
for i=1:N
if(sindata(i)<0)
sindata(i)=2^width+sindata(i);
else
sindata(i)=sindata(i);
end
end

fid=fopen(‘sindata.txt‘,‘a‘);
for i=1:N
fprintf(fid,‘%x \n‘,sindata(i));
i=i+1;
end
fclose(fid);

5,verilog读取波形文件产生正弦波

module sin_gen(clk,rst_n,sin_out);
input clk,rst_n;
output [7:0] sin_out;
parameter N = 50;
reg [7:0] mem[0:N-1];
initial
begin
$readmemh("sindata.txt",mem);
end
reg [7:0] sin_out_buff;
reg [5:0] i;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
sin_out_buff<=0;
i<=6‘d0;
end
else
begin
sin_out_buff<=mem[i];
if(i==6‘d49)
i<=6‘d0;
else
i<=i+1‘b1;
end
end
assign sin_out=sin_out_buff;
endmodule

6, testbench

`timescale 1ns/1ps
module testbench();
reg clk,rst_n;
initial
begin
clk=0;
forever #10 clk=~clk;
end
initial
begin
rst_n=0;
#50 rst_n=1‘b1;
end
wire [7:0] sin_out;
sin_gen u0_sin_gen(.clk(clk),.rst_n(rst_n),.sin_out(sin_out));
wire [7:0] data_out;
cic_dec u0_cic_dec(.clk(clk),.rst_n(rst_n),.datain(sin_out),.dataout(data_out));
reg [10:0] cnt;
[email protected](posedge clk or negedge rst_n )
begin
if(!rst_n)
cnt<=0;
else if(cnt==11‘d1024)
cnt<=cnt;
else
cnt<=cnt+1‘b1;
end
integer fid;
initial
begin
fid=$fopen("dataout.txt","a");
end
[email protected](posedge clk )
begin
$fwrite(fid,"%x \n",data_out);
end
[email protected](posedge clk)
begin
if(cnt==11‘d1024)
begin

$fclose(fid);

$stop;
end

end

endmodule

7,modelsim 仿真波形

时间: 2024-11-07 15:53:37

matlab 与 modelsim 联调 cic抽取滤波器的相关文章

FPGA的FIR抽取滤波器设计

摘 要:本文介绍了FIR抽取滤波器的工作原理,重点阐述了用XC2V1000实现FIR抽取滤波器的方法,并给出了仿真波形和设计特点. 关键词:FIR抽取滤波器:流水线操作:FPGA 用FPGA实现抽取滤波器比较复杂,主要是因为在FPGA中缺乏实现乘法运算的有效结构,现在,FPGA中集成了硬件乘法器,使FPGA在数字信号处理方面有了长足的进步.本文介绍了一种采用Xilinx公司的XC2V1000实现FIR抽取滤波器的设计方法. 具体实现 结构设计 基于抽取滤波器的工作原理,本文采用XC2V1000实

Matlab对Modelsim仿真生成的数据进行分析

Matlab对Modelsim仿真生成数据的处理也是通过文件读写实现的.即通过Verilog语句,将仿真过程中的某个信号写入文件,然后在Matlab中在把这个文件的数据读出来,就可以在Matlab中进行分析了. 下图也通过一个简单的例子,说明一下整个过程. 以下的Verilog语句实现将信号data_out的数据写入data_out.txt文件 integer w_file; initial w_file = $fopen("data_out.txt"); always @(i) be

通过文件读写方式实现Matlab和Modelsim的联合仿真

虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是Matlab的强项,不但有大量的关于数字信号处理的函数,而且图形显示功能也很强大,所以在做数字信号处理算法的FPGA验证的时候借助Matlab会大大加快算法验证的速度. 关于Matlab和Modelsim联合仿真,我从网上看到两种方法,一种是通过Link for Modelsim建立Matlab和Modelsim的联合仿真接口:另一种就是通过文

matlab数据序列的几种滤波器

一维数据序列滤波的matlab代码, 其实和之前做的图像滤波大同小异, 只是图像的噪声情况复杂得多, 而且是二维的. 做这个主要是手上有个心电的的mens传感器, 蓝牙把数据传过来做一个数据的100Hz左右的带通滤波, 用butterworht做个带通滤波, 再用c语言重构一下. 1 %**************************************************************************************** 2 % 3 % 创建两个信号Mix

utilities(matlab)—— visualizes filters(可视化滤波器)

function [h, array] = display_network(A, opt_normalize, opt_graycolor, cols, opt_colmajor) % This function visualizes filters in matrix A. Each column of A is a % filter. We will reshape each column into a square image and visualizes % on each cell o

基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)

1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤波效果后,将叠加噪声信号的音频信号输出到txt文件里.然后使用Matlab语言编写滤波器模块和测试模块,通过Modelsim软件读取txt文件的数据,将数据送入滤波模块,最后将滤波的结果输出到txt文件里,最后用Matlab将处理的结果从txt文件读出.显示.FFT分析用Verilog设计的FIR滤

转载论文关于fir滤波器的fpga实现

摘 要 本文讨论的FIR滤波器因其具有严格的线性相位特性而得到广泛的应用.在工程实践中,往往要求信号处理具有实时性和灵活性,本论文研究FIR的FPGA解决方案正体现了电子系统的微型化和单片化. 本论文主要讨论了以下的问题: 首先,以FIR滤波器的基本理论为依据,研究适应工程实际的数字滤波器的设计方法,确定了直接型网络结构.窗函数设计法的设计方案: 然后,讨论了FPGA的原理与结构特点,总结FPGA的设计流程与设计原则,并用Verilog HDL语言根据设计方案编写出FIR滤波器程序: 接着,采用

设计抗混叠滤波器的三大指导原则(转载)

原文地址:http://www.ednchina.com/ART_8800523945_28_19999_TA_f443c125.HTM?click_from=8800032061,9950148743,2015-12-19,EDNCOL,NEWSLETTER 抗混叠滤波器的设计包括一个过采样架构和一个补充数字抽取滤波器.这个过采样架构将那奎斯特频率放置在远离信号带宽的位置上,而数字抽取滤波器衰减大多数有害的带外信号.当把二者组合在一起时,它们可以实现更加自由的抗混叠滤波器响应,只需几个分立式组

Modelsim与Simulink协同仿真

当使用硬件描述语言(HDL)完成电路设计时,往往需要编写Testbench对所设计的电路进行仿真验证,测试设计电路的功能是否与预期的目标相符.而编写Testbench难度之大,这时可以借助交互式图形化环境Simulink来产生模拟激励,并且可以观察测试模块的输出响应.     首先,用Verilog描述一个反相器,代码如下: module inverter( clk, sin, sout); input clk ; input [7:0] sin ; output [7:0] sout ; re