FIR仿真module_04

作者:桂。

时间:2018-02-06  12:10:14

链接:http://www.cnblogs.com/xingshansi/p/8421001.html 


前言

本文主要记录基本的FIR实现,以及相关的知识点。

 一、基本型实现

首先从最基本的FIR入手:

 对应module:

`default_nettype	none
//
module	smplfir(i_clk, i_ce, i_val, o_val);parameter			IW=15;localparam			OW=IW+1;input	wire			i_clk, i_ce;input	wire	[(IW-1):0]	i_val;output	reg	[(OW-1):0]	o_val;reg	[(IW-1):0]	delayed;initial	delayed = 0;always @(posedge i_clk)if (i_ce)delayed <= i_val;always @(posedge i_clk)if (i_ce)o_val <= i_val + delayed;endmodule

  

二、通用版FIR

  前文里最多涉及阶数为5的FIR,这里给出适用任意阶、给定位宽的FIR。

  A-参数转化

vivado仿真用到浮点->定点,需要将给定数据转为定点补码、或通过补码读取数据。

1)浮点转定点补码

clc;clear all;close all;
%=============产生输入信号==============%
N=12;           %数据位宽
load fir128.mat;
y_n = fir128;
y_n=round(y_n*(2^(N-3)-1));      %N比特量化;如果有n个信号相加,则设置(N-n)
%=============设置系统参数==============%
L=length(y_n);         %数据长度
%=================画图==================%
stem(1:L,y_n);
%=============写入外部文件==============%
fid=fopen('win.txt','w');    %把数据写入sin_data.txt文件中,如果没有就创建该文件 
for k=1:length(y_n)B_s=dec2bin(y_n(k)+((y_n(k))<0)*2^N,N);for j=1:Nif B_s(j)=='1'tb=1;elsetb=0;endfprintf(fid,'%d',tb);endfprintf(fid,'\r\n');
endfprintf(fid,';');
fclose(fid);

  原型滤波器fir128为128阶的FIR滤波器。

生成的txt调用:$readmemb("*.txt",data);

2)给定补码,读取原数据:

clc;clear all;close all;
filename = 'win.txt';
fid = fopen(filename);
data_cell = textscan(fid,'%s','HeaderLines',0);
data = data_cell{1,1};Nbit = 12;%number of bits
len = length(data)-1;%length of filter
wins = zeros(1,len);
for i = 1:lenstr_win = data{i};if (str_win(1) == '0')wins(i) = bin2dec(str_win(2:end));endif (str_win(1) == '1')wins(i) = -bin2dec(num2str(ones(1,Nbit-1)))+bin2dec(str_win(2:end));end   
end
wvtool(wins)

  得到滤波器特性如下图所示,当然也可以hex2dec转为16进制,思路一致。

  B-仿真模型

 testbench:

`timescale 1ns / 1ps
module tb;// Inputsreg Clk;reg rst;// Outputsparameter datawidth = 12;wire signed [2*datawidth-1:0] Yout;//Generate a clock with 10 ns clock period.
initial  Clk <= 0;always #5 Clk = ~Clk;//Initialize and apply the inputs.
//-------------------------------------//
parameter data_num = 32'd1024;
integer   i = 0;
reg [datawidth-1:0]  Xin[1:data_num];
reg  [datawidth-1:0]  data_out;initial beginrst = 1;
#20rst = 0;$readmemb("D:/PRJ/vivado/simulation_ding/009_lpf6tap/matlab/sin_data.txt",Xin);
endalways @(posedge Clk) beginif(rst)begindata_out <= 0;endelse   begindata_out <= Xin[i];i <= i + 8'd1;end
end   fastfir firinst(
.i_clk(Clk), 
.i_reset(rst), 
.i_ce(1'b1), 
.i_sample(data_out), 
.o_result(Yout)
);
endmodule

  fast.v:

//
`default_nettype	none
//
module	fastfir(i_clk, i_reset, i_ce, i_sample, o_result);parameter		NTAPS=127, IW=12, TW=IW, OW=2*IW+7;input	wire			i_clk, i_reset;//input	wire			i_ce;input	wire	[(IW-1):0]	i_sample;output	wire signed	[(2*IW-1):0]	o_result;reg 	[(TW-1):0] tap		[0:NTAPS];wire	[(TW-1):0] tapout	[NTAPS:0];wire	[(IW-1):0] sample	[NTAPS:0];wire	[(OW-1):0] result	[NTAPS:0];wire		tap_wr;// The first sample in our sample chain is the sample we are givenassign	sample[0]	= i_sample;// Initialize the partial summing accumulator with zeroassign	result[0]	= 0;//observe filterreg [IW-1:0] fir_coef;integer i = 0;always @(posedge i_clk)beginif(i_reset) fir_coef <= 0;elsebeginfir_coef <= tap[i];i <= i+ 8'd1;end endgenvar	k;generatebegininitial $readmemb("D:/PRJ/vivado/simulation_ding/009_lpf6tap/matlab/win.txt", tap);assign	tap_wr = 1'b1;endfor(k=0; k<NTAPS; k=k+1)begin: FILTERfirtap #(.FIXED_TAPS(1'b1),.IW(IW), .OW(OW), .TW(TW),.INITIAL_VALUE(0))tapk(.i_clk(i_clk), .i_reset(i_reset), .i_tap_wr(tap_wr), .i_tap( tap[k]), .o_tap(tapout[k+1]),.i_ce(i_ce), .i_sample(sample[0]), .o_sample(sample[k+1]),.i_partial_acc(result[k]), .o_acc( result[k+1]));end endgenerateassign	o_result = result[NTAPS][2*IW-1:0];endmodule

  firtap.v:

//
`default_nettype	none
//
module	firtap(i_clk, i_reset, i_tap_wr, i_tap, o_tap,i_ce, i_sample, o_sample,i_partial_acc, o_acc);parameter		IW=12, TW=IW, OW=IW+TW+8;parameter [0:0]		FIXED_TAPS=1;parameter [(TW-1):0]	INITIAL_VALUE=0;//input	wire			i_clk, i_reset;//input	wire			i_tap_wr;input	wire	[(TW-1):0]	i_tap;output	wire signed [(TW-1):0]	o_tap;//input	wire			i_ce;input	wire signed [(IW-1):0]	i_sample;output	reg 	[(IW-1):0]	o_sample;//input	wire	[(OW-1):0]	i_partial_acc;output	reg 	[(OW-1):0]	o_acc;//reg		[(IW-1):0]	delayed_sample;reg	signed	[(TW+IW-1):0]	product;// Determine the tap we are usinggenerateif (FIXED_TAPS != 0)// If our taps are fixed, the tap is given by the i_tap// external input.  This allows the parent module to be// able to use readmemh to set all of the taps in a filterassign	o_tap = i_tap;else begin// If the taps are adjustable, then use the i_tap_wr signal// to know when to adjust the tap.  In this case, taps are// strung together through the filter structure--our output// tap becomes the input tap of the next tap module, and// i_tap_wr causes all of them to shift forward by one.reg	[(TW-1):0]	tap;initial	tap = INITIAL_VALUE;always @(posedge i_clk)if (i_tap_wr)tap <= i_tap;assign o_tap = tap;end endgenerate// Forward the sample on down the line, to be the input sample for the// next componentalways @(posedge i_clk)if (i_reset)begindelayed_sample <= 0;o_sample <= 0;end else if (i_ce)begin// Note the two sample delay in this forwarding// structure.  This aligns the inputs up so that the// accumulator structure (below) works.delayed_sample <= i_sample;o_sample <= delayed_sample;end// Multiply the filter tap by the incoming samplealways @(posedge i_clk)if (i_reset)product <= 0;else if (i_ce)product <= o_tap * i_sample;// Continue summing together the output components of the FIR filteralways @(posedge i_clk)if (i_reset)o_acc <= 0;else if (i_ce)o_acc <= i_partial_acc+ { {(OW-(TW+IW)){product[(TW+IW-1)]}},product };// Make verilator happy// verilate lint_on  UNUSEDwire	unused;assign	unused = i_tap_wr;// verilate lint_off UNUSED
endmodule

 仿真结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCIE下载的驱动安装

PCIE下载的驱动安装 windowr显示运行窗口&#xff0c;输入cmd

FIR调用DSP48E_05

作者&#xff1a;桂。 时间&#xff1a;2018-02-06 17:52:38 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/8423457.html 前言 到目前为止&#xff0c;本文没有对滤波器实现进行梳理&#xff0c;FIR仿真验证的平台&#xff08;基于FPGA实现&#xff09;包括HLS、Sys…

快播王欣明天就出狱了,他能借钱东山再起吗?

2018年2月8日&#xff0c;估计宅男们又得欢腾了&#xff0c;因为快播的王欣就要出狱了&#xff01;王欣是在2014年8月8日被捕的&#xff0c;在2016年9月13日宣判&#xff0c;判刑三年半。按照法律&#xff0c;刑期由拘押之日算起&#xff0c;不考虑减刑等因素&#xff0c;不出意…

基础002_V7-CLB

一、综述 参考ug474.pdf&#xff1a; 7系列中&#xff0c;一个CLB包含两个slice&#xff1a;每个CLB的资源&#xff1a;CLB可配置的主要功能&#xff1a;二、主要功能 LUT是基本单元&#xff0c;例如选择器assign muxout (sel) ? din_0: din_1;A-shift register每个Slice对应…

自定义IP在PCIE中使用

自定义IP在PCIE中使用

基础001_Xilinx V7资源

作者&#xff1a;桂。 时间&#xff1a;2018-02-08 09:37:35 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/8430247.html 前言 本文主要是Xilinx V7系列的零碎记录&#xff0c;以便查阅。 一、器件资料 主要参考《Xilinx新一代FPGA设计套件VIVADO应用指南》。FPGA基本…

角度和弧度的相互换算

角度和弧度的相互换算 既可以使用角度来测量角&#xff0c;也可以使用弧度来测量角。 弧长等于半径对应的角为1弧度。 平时有的单位为角度&#xff0c;没有单位表示的弧度。 弧度与角度的相互换算 利用相似原理。得出周角之比等于弧长之比。 角秒&#xff0c;又称弧秒&a…

银行爆雷不断,放在银行的钱安全吗?

近段银行可谓是多事之秋&#xff0c;在监管重磅之下银行爆雷不断&#xff0c;进入2018年以来&#xff0c;监管已经引爆了超过500个雷&#xff0c;各个银行貌似要过年了都在排队爆雷迎接新年一样&#xff0c;其中最大的两个雷被浦发银行和邮储银行领走。2018年罚单泪如雨下1月19…

基础003_V7-Memory Resources

一、综述 参考ug473.pdf。 常用Memory 资源&#xff1a; 在IP核中&#xff0c;Block memory&#xff08;distributed memory为CLB中的资源&#xff09;&#xff1a; 通常选用Native&#xff0c;而不用AXI接口&#xff1a; Block RAM可配置单端口RAM、伪双端口RAM、双端口RAM、单…

现代控制理论基础

现代控制理论基础 机理建模法列写状态空间表达式 状态方程是指刻画系统输入和状态关系的表达式。状态向量所满足的向量常微分方程称为控制系统的状态方程。状态方程是控制系统数学模型的重要组成部分。 状态方程的描述 其中A、B、C、D的位置是固定的。 第一步先找状态。状态的…

信用非常良好,为何银行不给你批信用卡?

大家都是知道申请信用卡对个人信用的要求很高&#xff0c;稍微有逾期都有可能被拒绝。但是很多网友反映&#xff0c;自己信用没有逾期&#xff0c;可是为什么申请信用卡还是被拒绝了呢&#xff1f;其实申请信用卡不只是单单看信用这么简单&#xff0c;银行在审批的时候是从申请…

云闪付单个红包最高2018,这是要打败支付宝的节奏吗?

最近过年&#xff0c;红包雨满天飞&#xff0c;各家各路都来参与&#xff0c;特别是移动支付领域的竞争更为激烈&#xff0c;其中支付宝、微信、云闪付的战火烧的最旺。云闪付巨额红包意在抢占移动支付市场云闪付最近一段时间又出来闹事&#xff0c; 为推广银联云闪付&#xff…

如何解决MathType中公式与文字错位的问题

如何解决MathType中公式与文字错位的问题 使用MathType数学公式编辑器编辑公式时&#xff0c;难免会出现公式与文字错位的问题&#xff0c;这不仅影响整个文档的美观&#xff0c;也会给排版带来不便。公式与文字对齐的方法主要有三种&#xff0c;分布是清除格式、使用MathType…

基础004_V7-DSP Slice

主要参考ug479.pdf。之前的文章&#xff1a;FIR调用DSP48E_05。本文主要记录基本用法。 一、DSP48核 A-参数说明 instrctions&#xff0c;多个功能&#xff0c;通过sel选用目前没发现C勾选与否&#xff0c;有何影响。 如上图所示&#xff0c;结果3拍后输出&#xff1a; 其他参数…

打字小妙招

打字小妙招 u字的拼音是字之间的组合 例如&#xff1a;奆 v数字可是大写 例如&#xff1a;壹万贰仟叁佰肆拾伍 v数字计算 例如&#xff1a;123

揭秘买车0首付的套路,羊毛出在羊身上

买车现在已经成为很多年轻人的一种追求&#xff0c;不管是城里的还是农村的&#xff0c;也不管有钱没钱&#xff0c;总之&#xff0c;很多年轻人觉得有车层次就是不一样&#xff0c;开出去把妹也很拉风。但是很多人在买车的时候根本就没有考虑自己的经济能力&#xff0c;甚至很…

地震中房子变废墟了,贷款还需要还吗?

2月12日18时31分在河北省廊坊市永清县(北纬39.37度&#xff0c;东经116.67度)发生4.3级地震&#xff0c;震源深度20千米。截止目前暂时没有人员伤亡报告。我国是一个自然灾害比较多的国家&#xff0c;比如地震&#xff0c;泥石流、台风、洪灾等等&#xff0c;这些自然灾害每年都…

远程控制他人电脑

远程控制他人电脑 首先wini打开window设置&#xff0c;选择系统 下划找到&#xff0c;关于&#xff0c;找到&#xff0c;远程 点击启用远程桌面&#xff0c;弹出的选项框中选择确定 然后&#xff0c;winr&#xff0c;打开运行框&#xff0c;输入mstsc点确定。 然后输入需要远…

过年遇到前任借钱, 如何傲娇的拒绝?

春节又到了&#xff0c;过节走亲访友&#xff0c;有一个话题不得不谈&#xff0c;那就是钱&#xff01;都说谈钱伤感情&#xff0c;这话一点都没有错&#xff0c;特别是遇到前任来找你借钱。明明被前任甩得伤痕累累&#xff0c;没想到过年了&#xff0c;有些前任竟然厚着脸皮回…

由传递函数求状态方程

由传递函数求状态方程 直接法 例子 并联法