FIR调用DSP48E_05

作者:桂。

时间:2018-02-06  17:52:38

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


前言

  到目前为止,本文没有对滤波器实现进行梳理,FIR仿真验证的平台(基于FPGA实现)包括HLS、Systemgenerator,至于*.v 与*.sv可通过程序(如python实现)完成转化,FIR的零散记录到本篇告一段落,本文重点记录DSP48E的使用

一、DSP48E

  A-基本结构

主要参考UG479.pdf,DSP48E1结构:

可以看出主要功能为:P = (A±D)×B±C。具体功能可参考IP核:

slice结构及位宽关系:

DSP48E在Xilinx内部的布局:

常用器件DSP48E资源:

  B-原语调用

原语类似C语言的汇编,直接关联器件的底层结构,因此通常时序可以做的更好。

DSP48E支持原语调用,记录两个例子:

Ex1:

`timescale 1ns / 1ps// m = b * (a + d)
// p = c+m or p+m
module dsp48_wrap_f(input 		  clock,input 		  ce1,input 		  ce2,input 		  cem,input 		  cep,input signed [24:0] 	  a,input signed [17:0] 	  b,input signed [47:0] 	  c,input signed [24:0] 	  d, // this has two fewer pipe stages// X+Y is usually the multiplier output (M)// Z is either P, PCIN or C// bit 1:0: 0: Z+X+Y 3:Z-(X+Y) 1: -Z + (X+Y) 2: -1*(Z+X+Y+1)// bits 3:2, 0: Z=0, 1: Z=PCIN, 2: Z=P, 3: Z = C// bit 4: sub in pre addinput [4:0] 		  mode,input signed [47:0] 	  pcin,output signed [47:0]   pcout,output signed [47-S:0] p);parameter S = 0;parameter USE_DPORT = "FALSE"; // enabling adds 1 reg to A pathparameter AREG = 1;parameter BREG = 1; // 0 - 2wire signed [47:0] 	   dsp_p;assign p = dsp_p[47:S];DSP48E1#(.A_INPUT("DIRECT"),   // "DIRECT" "CASCADE".B_INPUT("DIRECT"),   // "DIRECT" "CASCADE".USE_DPORT(USE_DPORT),.USE_MULT("MULTIPLY"),// "MULTIPLY" "DYNAMIC" "NONE".USE_SIMD("ONE48"),   // "ONE48" "TWO24" "FOUR12"// pattern detector - not used.AUTORESET_PATDET("NO_RESET"), .MASK(48'h3fffffffffff),.PATTERN(48'h000000000000), .SEL_MASK("MASK"),.SEL_PATTERN("PATTERN"), .USE_PATTERN_DETECT("NO_PATDET"),// register enables.ACASCREG(1),   // pipeline stages between A/ACIN and ACOUT (0, 1 or 2).ADREG(1),      // pipeline stages for pre-adder (0 or 1).ALUMODEREG(1), // pipeline stages for ALUMODE (0 or 1).AREG(AREG),       // pipeline stages for A (0, 1 or 2).BCASCREG(1),   // pipeline stages between B/BCIN and BCOUT (0, 1 or 2).BREG(BREG),    // pipeline stages for B (0, 1 or 2).CARRYINREG(1), // this and below are 0 or 1.CARRYINSELREG(1),.CREG(1),.DREG(1),.INMODEREG(1),.MREG(1),.OPMODEREG(1),.PREG(1))dsp48_i(// status.OVERFLOW(),.PATTERNDETECT(), .PATTERNBDETECT(),.UNDERFLOW(),// outs.CARRYOUT(),.P(dsp_p),// control.ALUMODE({2'd0, mode[1:0]}),.CARRYINSEL(3'd0),.CLK(clock),.INMODE({1'b0,mode[4],3'b100}),.OPMODE({1'b0,mode[3:2],4'b0101}),// signal inputs.A({5'd0,a}), // 30.B(b), // 18.C(c), // 48.CARRYIN(1'b0),.D(d), // 25// cascade ports.ACOUT(),.BCOUT(),.CARRYCASCOUT(),.MULTSIGNOUT(),.PCOUT(pcout),.ACIN(30'h0),.BCIN(18'h0),.CARRYCASCIN(1'b0),.MULTSIGNIN(1'b0),.PCIN(pcin),// clock enables.CEA1(ce1), .CEA2(ce2),.CEAD(1'b1),.CEALUMODE(1'b1),.CEB1(ce1), .CEB2(ce2),.CEC(1'b1),.CECARRYIN(1'b1),.CECTRL(1'b1), // opmode.CED(1'b1),.CEINMODE(1'b1),.CEM(cem), .CEP(cep),.RSTA(1'b0),.RSTALLCARRYIN(1'b0),.RSTALUMODE(1'b0),.RSTB(1'b0),.RSTC(1'b0),.RSTCTRL(1'b0),.RSTD(1'b0),.RSTINMODE(1'b0),.RSTM(1'b0),.RSTP(1'b0));endmodule // dsp48_wrap_f

Ex2

// p = c + b * a 3 cycles if r else p = p + b * a
module macc(input 		  clock,input [2:0] 		  ce, // bit 0 = a, 1 = b , 2 = cinput 		  r, // reset accumulator to c + a*binput signed [24:0] 	  a,input signed [17:0] 	  b,input signed [47:0] 	  c,output signed [47-S:0] p);parameter S = 0;parameter AREG = 1; // 0 - 2parameter BREG = 1; // 0 - 2wire signed [47:0] 	   dsp_p;assign p = dsp_p[47:S];// X+Y is usually the multiplier output (M)// Z is either P, PCIN or C// bit 1:0: 0: Z+X+Y 3:Z-(X+Y) 1: -Z + (X+Y) 2: -1*(Z+X+Y+1)// bits 3:2, 0: Z=0, 1: Z=PCIN, 2: Z=P, 3: Z = C// bit 4: sub in pre addwire [4:0]  mode = {1'b0, r ? 2'b11 : 2'b10, 2'b00};DSP48E1#(.A_INPUT("DIRECT"),   // "DIRECT" "CASCADE".B_INPUT("DIRECT"),   // "DIRECT" "CASCADE".USE_DPORT("FALSE"),.USE_MULT("MULTIPLY"),// "MULTIPLY" "DYNAMIC" "NONE".USE_SIMD("ONE48"),   // "ONE48" "TWO24" "FOUR12"// pattern detector - not used.AUTORESET_PATDET("NO_RESET"), .MASK(48'h3fffffffffff),.PATTERN(48'h000000000000), .SEL_MASK("MASK"),.SEL_PATTERN("PATTERN"), .USE_PATTERN_DETECT("NO_PATDET"),// register enables.ACASCREG(1),   // pipeline stages between A/ACIN and ACOUT (0, 1 or 2).ADREG(1),      // pipeline stages for pre-adder (0 or 1).ALUMODEREG(1), // pipeline stages for ALUMODE (0 or 1).AREG(AREG),       // pipeline stages for A (0, 1 or 2).BCASCREG(1),   // pipeline stages between B/BCIN and BCOUT (0, 1 or 2).BREG(BREG),    // pipeline stages for B (0, 1 or 2).CARRYINREG(1), // this and below are 0 or 1.CARRYINSELREG(1),.CREG(1),.DREG(1),.INMODEREG(1),.MREG(1),.OPMODEREG(1),.PREG(1))dsp48_i(// status.OVERFLOW(),.PATTERNDETECT(), .PATTERNBDETECT(),.UNDERFLOW(),// outs.CARRYOUT(),.P(dsp_p),// control.ALUMODE({2'd0, mode[1:0]}),.CARRYINSEL(3'd0),.CLK(clock),.INMODE({1'b0,mode[4],3'b100}),.OPMODE({1'b0,mode[3:2],4'b0101}),// signal inputs.A({5'd0,a}), // 30.B(b), // 18.C(c), // 48.CARRYIN(1'b0),.D(25'd0), // 25// cascade ports.ACOUT(),.BCOUT(),.CARRYCASCOUT(),.MULTSIGNOUT(),.PCOUT(),.ACIN(30'h0),.BCIN(18'h0),.CARRYCASCIN(1'b0),.MULTSIGNIN(1'b0),.PCIN(48'h0),// clock enables.CEA1(1'b1), .CEA2(ce[0]),.CEAD(1'b1),.CEALUMODE(1'b1),.CEB1(1'b1), .CEB2(ce[1]),.CEC(ce[2]),.CECARRYIN(1'b1),.CECTRL(1'b1), // opmode.CED(1'b1),.CEINMODE(1'b1),.CEM(1'b1), .CEP(1'b1),.RSTA(1'b0),.RSTALLCARRYIN(1'b0),.RSTALUMODE(1'b0),.RSTB(1'b0),.RSTC(1'b0),.RSTCTRL(1'b0),.RSTD(1'b0),.RSTINMODE(1'b0),.RSTM(1'b0),.RSTP(1'b0));endmodule

  

二、FIR实现思路

考虑到调用DSP48E,首先分析DSP48E乘法/乘加的时序特性:

可以看出输出相比输入,延迟4拍,仿真3*5,结果与理论一致:

以N-1(不失一般性,N=6)阶FIR为例,由于乘法可支持25*18,假设数据18(bit),滤波器系数25(bit)。滤波器系数个数为6:

因此可得FIR实现的基本流程:

  • Step1:对于t时刻,输入数据与滤波器系数相乘,得到y(t)[N-1:0]
  • Step2:更新数据流:data_chain(t) = y(t)[N-1:0] + [data_chain(t-1) [N-2:0],0]
  • Step3:输出滤波结果:output = data_chain(t) [N-1]

根据算法流程,设计FPGA数据流:

   1)参数位宽定义

  • 输入数据:parameter indatwidth = 18;
  • 滤波器系数:parameter coefwidth = 25;
  • DSP48核输出位宽:localparam multoutwidth = coefwidth + indatwidth;
  • 输出数据(自定义):parameter outdatwidth = 18;
  • 数据流(截断位宽自定义):这里 localparam chainwidth 用multoutwidth替代;

  2)数据运算拆解

结合上文Step2的特性,细节上:a)可针对coef0单独用乘法运算、其他coef利用乘加运算,b)也可以对datachain补零,这里采用后一种思路。

  • 输入输出  

  input [indatwidth-1:0] datin;

  input [5:0][coefwidth-1:0] coef;

  input clk,rst;

  output signed [outdatwidth-1:0] datout;

  • DSP48的乘加操作

  genvar ii;

  generate
    for(ii = 0; ii < N; ii++)
    begin
    multiplus mpu(
    .CLK(clk),
    .A(coef[ii]),
    .B(datin),
    .C(dti[ii]),
    .P(mres[ii])
    );
    end
  endgenerate

  • 关于截位

  对数据进行截位,例如对x截位,通常不是直接舍去其他位数,而是对x进行4舍5入,转化到FPGA就是:

  x1 <= x[起始位置 -:  有效位数] + 1;

  result <= (x1>>>1);

   这里仅论证实现思路,截位的细节操作不再添加。

  • 乘法器的延拍

genvar ii;
generate
for(ii = 1; ii < N; ii++)
begin
always @(posedge clk) begin
dtchain[ii][fixdelay-1:1] <= dtchain[ii][fixdelay-2:0];
dtchain[ii][0] <= mres[ii-1][multoutwidth-1:0];
end
end
endgenerate

三、仿真验证

 首先MATLAB仿真验证上述步骤的有效性:

%FIR功能验证
clc;clear all;close all;
coef = [-15,19,123,123,19,-15];
datin = [3,13,17,21,24,28,31];
%main
%不考虑延拍,datachain不必引入
N = 6;
mres = zeros(1,N);
dto = zeros(1,N);
result = [];
for i = 1:length(datin)dto(2:N) = mres(1:N-1);mres = datin(i)*coef + dto;result = [result,mres(N)];
end
%compare
conv_res = conv(datin,coef);
[result;conv_res(1:length(datin))]

  算法运算结果与理论一致:

编写测试模块及testbench:

winfilter.sv

`timescale 1ns / 1ps
module winfilter(coef, datin, clk, rst, datout);
//parameter
parameter indatwidth = 18;
parameter outdatwidth = 18;
parameter coefwidth = 25;
localparam multoutwidth = coefwidth + indatwidth;
localparam N = 6;
localparam fixdelay = 4;//smultplus delay
//port
input [indatwidth-1:0] datin;
input [N-1:0][coefwidth-1:0] coef;
input clk,rst;
output [outdatwidth-1:0] datout;
//define
reg signed [outdatwidth-1:0] datout;
reg  [N-1:0][fixdelay-1:0][multoutwidth-1:0] dtchain;
wire [N-1:0][multoutwidth:0] mres;
//initial
initial
begindtchain <= 0;datout <= 0;
end
//main
genvar ii;
generatefor(ii = 1; ii < N; ii++)beginalways @(posedge clk)  begindtchain[ii][fixdelay-1:1] <= dtchain[ii][fixdelay-2:0];dtchain[ii][0] <= mres[ii-1][multoutwidth-1:0];endend
endgenerate
generatefor(ii = 0; ii < N; ii++)beginmultiplus multp_inst(.CLK(clk),.A(coef[ii]),.B(datin),.C(dtchain[ii][fixdelay-1]),.P(mres[ii]));end
endgenerate
//output 	
always @(posedge clk)
beginif(rst)begindatout <= 0;endelsebegindatout <= mres[N-1][multoutwidth-19 -: outdatwidth];//datout <= mres[N-1][multoutwidth-2 -: outdatwidth];end
end
endmodule

  tb

`timescale 1ns / 1ps
module tb();
logic [17:0] datin;
logic clk,rst;
logic [5:0][24:0] coef;
logic [17:0] datout;//-------------------------------------//
parameter data_num = 32'd1024;
reg [17:0]  data_men[1:data_num];
initial begin$readmemb("D:/PRJ/vivado/simulation_ding/009_lpf6tap/matlab/sin_data.txt",data_men);
end
integer   i = 1;
always @(posedge clk) begindatin <= data_men[i];i <= i + 8'd1;
endinitial beginclk <= 0;rst <= 0;datin <= 0;coef <= 0;
#4
coef <= {-25'd15,25'd19,25'd123,25'd123,25'd19,-25'd15};
#6000
$stop;
endalways #2 clk = ~clk;winfilter wininst(
.coef(coef), 
.datin(datin), 
.clk(clk), 
.rst(rst), 
.datout(datout)
);
endmodule

  其中dsp48参数设置:

 

 仿真结果:

 

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

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

相关文章

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

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;有些前任竟然厚着脸皮回…

由传递函数求状态方程

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

借呗利息为什么比银行信用贷款高很多?

利息高低取决于3个方面&#xff0c;一个是风险&#xff0c;二个是资金成本&#xff0c;三是市场竞争对收益定价的影响。借呗利息之所以比银行高也离不开这三个因素。首先是风险&#xff0c;借呗面对的据大部分是普通老百姓&#xff0c;门槛比较低&#xff0c;所以相应的风险比较…

全款房抵押贷款利息和抵押率各是多少?

银行房产抵押贷款的利息及抵押率根据不同客户的资质及申请条件&#xff0c;最终结果是不一样的。&#xfffc;首先我们来说下利率&#xff0c;目前银行贷款利率一般都会在基础利率的基础上上浮&#xff0c;目前银行贷款基准利率一年之内是4.35%&#xff1b;1-5年是4.75%&#x…