实时信号作业.docx
- 文档编号:5212815
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:17
- 大小:203.36KB
实时信号作业.docx
《实时信号作业.docx》由会员分享,可在线阅读,更多相关《实时信号作业.docx(17页珍藏版)》请在冰豆网上搜索。
实时信号作业
《实时信号处理系统设计与实现》
作业报告
(1)用VHDL或Verilog完成教材(第三版)例子2.24无符号DA卷积的设计。
要求:
写出完整的设计代码,包括测试testbench代码,给出仿真结果图标。
设计工具用ise或quartusII都行。
1、数字滤波器概述
数字滤波器由数字乘法器、加法器和延时单元组成的一种算法或装置。
数字滤波器的功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。
数字滤波器通常是应用于修正或改变时域或频域中信号的属性。
最普通的数字滤波器就是线性时间不变量(linertime_invariant,LTI)滤波器。
LTI与其输入信号之间相互作用,经过一个程为线性卷积的过程。
线性卷积过程如下:
2、FIR的原理
带有常系数的FIR滤波器是一种LTI数字滤波器。
L阶或者长度大于L的FIR输出对应与输如时间序列x[n]的关系由一种有限卷积的数量形式给出,具体形式如下:
其中从f[0]≠0一直到f[L-1]≠0均是滤波器的L阶的系数,同时也可对应于FIR的脉表达成z域内的形式:
冲响应。
对于LTI系统可以更为方便的将上式
其中F(z)是FIR的传递函数,其z域内的形式如下:
3、DA算法原理
分布式算法是一项重要的FPGA技术广泛地应用在计算乘积和之中。
除了卷积之外,相关、DFT计算和RNS反演映射也可以阐述成“乘积和”。
当使用传统的算法单元完成一个滤波周期时,大约需要用N个MAC循环。
使用流水线可以缩短这一数量,但是也非常有限,仍旧非常长。
当使用通用乘法器时,就变得简单很多了。
“乘积和”
进一步假设系数c[n]是已知常数,x[n]是变量。
无符号DA系统假设变量x[n]的表达式如下:
其中
表示x[n]的第b位,而x[n]也就是x的第n次采样,而内积y可以表示为:
重新分别求和其结果如下:
函数
的实现需要特别的注意。
所指的实现方法就是利用一个LUT实现映射
。
也就是说
字宽、预先设定程序的LUT接收一个N位输入向量
,输出为
。
各个映射
都由相应的二次幂加权并累加。
4、MATLAB设计FIR系数
使用MATLAB内嵌FIR2函数设计滤波器
FIR2FIR任意形状的过滤器的设计使用的频率抽样方法。
B=FIR2(N,F,A)的设计与第n阶FIR数字滤波器频率响应指定的向量F和A,并返回在长度为N的向量b向量F和一个指定的滤波器系数过滤器,这样的频率和幅度的断点。
PLOT(F,A)将显示所需的频率响应曲线。
在F频率必须介于0.0
他们必须以增秩排列,并以0.0开始以1.0的结束。
该过滤器B是实部的,具有线性相位,即对称服从B(K)=B(2-K),K=1,2,...,N-1的系数。
默认情况下FIR2窗与汉明窗的脉冲响应。
其他可用的Windows,包括棚车,翰,巴特利特,布莱克曼,Kaiser和Chebwin可以指定一个可选尾部参数。
例如,
B=FIR2(N,F,A,bartlett(N+1))usesaBartlettwindow.
B=FIR2(N,F,A,chebwin(N+1,R))usesaChebyshevwindow.
在fs/2的,例如,高通滤波器与增益大于零和带阻滤波器,N必须是偶数。
否则,N将加1。
在这种情况下,窗口长度应指定为N2。
本例中使用fir2函数设计一个4阶低通滤波器:
代码如下:
f=[00.60.61];m=[1100];
b=fir2(4,f,m);
[h,w]=freqz(b,1,128);
plot(f,m,w/pi,abs(h))
legend('Ideal','fir2Designed')
title('ComparisonofFrequencyResponseMagnitudes')
仿真图如下:
滤波器系数如下:
b=0.00000.0017-0.0016-0.00230.0059-0.0001-0.01270.01120.0151-0.03370.00030.0634-0.0569-0.08930.29960.59960.2996-0.0893-0.05690.06340.0003-0.03370.01510.0112-0.0127-0.00010.0059-0.0023-0.00160.00170.0000
由于本例中使用的滤波系数很难用直接型fir来实现,下面的系数b=[2314]来实现直接型的fir并与DA算法的fir进行比较。
5、使用quartus2完成设计编译与仿真
1.用quartus2来完成直接型fir来设计:
/*===================直接型FIR设计===============*/
PACKAGEeight_bit_intIS--Userdefinedtypes
SUBTYPEBYTEISINTEGERRANGE-128TO127;
YPEARRAY_BYTEISARRAY(0TO3)OFBYTE;
ENDeight_bit_int;
LIBRARYwork;
USEwork.eight_bit_int.ALL;
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_arith.ALL;
ENTITYfir_srgIS------>Interface
PORT(clk:
INSTD_LOGIC;
x:
INBYTE;
y:
OUTBYTE);
ENDfir_srg;
ARCHITECTUREflexOFfir_srgIS
SIGNALtap:
ARRAY_BYTE;--Tappeddelaylineofbytes
BEGIN
p1:
PROCESS------>BehavioralStyle
BEGIN
WAITUNTILclk='1';
--Computeoutputywiththefiltercoefficientsweight.
--Thecoefficientsare[2314].
--DivisionforAlteraVHDLisonlyallowedfor
--powers-of-twovalues!
y<=2*tap(0)+3*tap
(1)+tap
(2)+tap(4);
FORIIN3DOWNTO1LOOP
tap(I)<=tap(I-1);--Tappeddelayline:
shiftone
ENDLOOP;
tap(0)<=x;--Inputinregister0
ENDPROCESS;
ENDflex;
2.基于DA算法的fir:
DA表系数表为设C[0]=2,C[1]=3,C[2]=1,C[3]=4则
DA查找表
0
0
0
0
4×0+1×0+3×0+2×0=0
0000
0
0
0
1
4×0+1×0+3×0+2×1=2
0010
0
0
1
0
4×0+1×0+3×1+2×0=3
0011
0
0
1
1
4×0+1×0+3×1+2×1=5
0101
0
1
0
0
4×0+1×1+3×0+2×0=1
0001
0
1
0
1
4×0+1×1+3×0+2×1=3
0011
0
1
1
0
4×0+1×1+3×1+2×0=4
0100
0
1
1
1
4×0+1×1+3×1+2×1=6
0110
1
0
0
0
4×1+1×0+3×0+2×0=4
0100
1
0
0
1
4×1+1×0+3×0+2×1=6
0110
1
0
1
0
4×1+1×0+3×1+2×0=7
0111
1
0
1
1
4×1+1×0+3×1+2×1=9
1001
1
1
0
0
4×1+1×1+3×0+2×0=5
0101
1
1
0
1
4×1+1×1+3×0+2×1=7
0111
1
1
1
0
4×1+1×1+3×1+2×0=8
1000
1
1
1
1
4×1+1×1+3×1+2×1=10
1010
所得x[n]={x[0]=0001,x[1]=0011,x[2]=0111,x[3]=}
/*===================四输入查找表================*/
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_arith.ALL;
ENTITYcase4IS
PORT(table_in:
INSTD_LOGIC_VECTOR(3DOWNTO0);
table_out:
OUTINTEGERRANGE0TO15);
ENDcase4;
ARCHITECTURELCsOFcase4IS
BEGIN
PROCESS(table_in)
BEGIN
CASEtable_inIS
when"0000"=>table_out<=0;
when"0001"=>table_out<=2;
when"0010"=>table_out<=3;
when"0011"=>table_out<=5;
when"0100"=>table_out<=1;
when"0101"=>table_out<=3;
when"0110"=>table_out<=4;
when"0111"=>table_out<=6;
when"1000"=>table_out<=4;
when"1001"=>table_out<=6;
when"1010"=>table_out<=7;
when"1011"=>table_out<=9;
when"1100"=>table_out<=5;
when"1101"=>table_out<=7;
when"1110"=>table_out<=8;
when"1111"=>table_out<=10;
WHENOTHERS=>table_out<=0;
ENDCASE;
ENDPROCESS;
ENDLCs;
3.DA_FIR设计程序
/*======================DA_FIR设计====================*/
LIBRARYieee;--Usingpredefinedpackages
USEieee.std_logic_1164.ALL;
USEieee.std_logic_arith.ALL;
PACKAGEda_packageIS--Userdefinedcomponent
COMPONENTcase4
PORT(table_in:
INSTD_LOGIC_VECTOR(3DOWNTO0);
table_out:
OUTINTEGERRANGE0TO15);
ENDCOMPONENT;
ENDda_package;
LIBRARYwork;
USEwork.da_package.ALL;
LIBRARYieee;--Usingpredefinedpackages
USEieee.std_logic_1164.ALL;
USEieee.std_logic_arith.ALL;
ENTITYdafsmIS------>Interface
PORT(clk:
INSTD_LOGIC;
x_in0,x_in1,x_in2,x_in3:
INSTD_LOGIC_VECTOR(3DOWNTO0);
y:
OUTINTEGERRANGE0TO63);
ENDdafsm;
ARCHITECTUREflexOFdafsmIS
TYPESTATE_TYPEIS(s0,s1);
SIGNALstate:
STATE_TYPE;
SIGNALx0,x1,x2,x3,table_in:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALtable_out:
INTEGERRANGE0TO15;
BEGIN
table_in(0)<=x0(0);
table_in
(1)<=x1(0);
table_in
(2)<=x2(0);
table_in(3)<=x3(0);
PROCESS------>DAinbehavioralstyle
VARIABLEp:
INTEGERRANGE0TO63;--temp.register
VARIABLEcount:
INTEGERRANGE0TO3;--countsshifts
BEGIN
WAITUNTILclk='1';
CASEstateIS
WHENs0=>--Initializationstep
state<=s1;
count:
=0;
p:
=0;
x0<=x_in0;
x1<=x_in1;
x2<=x_in2;
x3<=x_in3;
WHENs1=>--Processingstep
IFcount=3THEN--Issumofproductdone?
y<=p;--Outputofresulttoyand
state<=s0;--startnextsumofproduct
ELSE
p:
=p/2+table_out*4;
x0(0)<=x0
(1);
x0
(1)<=x0
(2);
x0
(2)<=x0(3);
x1(0)<=x1
(1);
x1
(1)<=x1
(2);
x1
(2)<=x1(3);
x2(0)<=x2
(1);
x2
(1)<=x2
(2);
x2
(2)<=x2(3);
x3(0)<=x3
(1);
x3
(1)<=x3
(2);
x3
(2)<=x3(3);
count:
=count+1;
state<=s1;
ENDIF;
ENDCASE;
ENDPROCESS;
LC_Table0:
case4
PORTMAP(table_in=>table_in,table_out=>table_out);
ENDflex;
4.Testbench代码
/*====================Testbench代码=================*/
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_signed.all;
usestd.textio.all;
usework.fir_pack.all;
entitytb_firis
endtb_fir;
architecturebehavioraloftb_firis
--FIR-filtertop
componentfir_top
port(
clk,rst:
instd_logic;
fir_in:
instd_logic_vector(INPUT_WIDTH-1downto0);
fir_out:
outstd_logic_vector(INPUT_WIDTH+COEFF_WIDTH+M-1downto0)
);
endcomponent;
signalclk,rst:
std_logic:
='0';
signalx:
std_logic_vector(INPUT_WIDTH-1downto0);
signaly:
std_logic_vector(OUTPUT_WIDTH-1downto0);
begin--structural
clk<=not(clk)afterPULSEWIDTH;
rst<='1'afterRESET_TIME;
--Deviceundertest(DUT)
DUT:
fir_top
portmap(
clk=>clk,
rst=>rst,
fir_in=>x,
fir_out=>y);
--Processthatreadandwritesvaluesfromandtofiles.
process
filefin:
textisinSTIMULI_FILE;
filefout:
textisoutTRACE_FILE;
variablelin:
line;
variabledata:
integer;
begin
x<=(others=>'0');
loop
waituntilclk='1'andrst='1';
ifnot(endfile(fin))then
readline(fin,lin);
read(lin,data);
x<=conv_std_logic_vector(data,INPUT_WIDTH)afterDELAY;
else
x<=(others=>'0');
endif;
data:
=conv_integer(y);
write(lin,data);
writeline(fout,lin);
endloop;
endpro
6、功能仿真图:
采用一位移位/累加器,每一步只向右移动一个位置,而不是向做移动k个位置。
上图给出了输入序列{3418}的仿真结果y=19.共使用了36个LE,没有使用EAB。
RTL图:
(二)Hartley已经引入了一种通过采用公共子表达式交叉系数实现常系数滤波器的概念,例如:
滤波器
y[n]=
(3.19)
其中,3个系数a[k]={480,-302,31}。
3个系数的CSD码如下:
从表中可以注意到,
结构出现了4次。
如果构造一个临时变量h[n]=2x[n]-x[n-1]就可以用
y[n]=256h[n]-16h[n]-32h[n-1]+h[n-1](3.20)
计算滤波器的输出。
(a).代入h[n]=2x[n]-x[n-1]验证(3.20)。
(b).得到(3.19)的直接CSD实现和子表达式共享的实现分别需要多少个加法器?
(c1).用QuartusII实现8位输入的子表达式共享滤波器。
(c2).仿真滤波器的脉冲响应。
(c3).确定LC的使用量和RegisteredPerformance。
1、问题重述
Hartley已经引入了一种通过采用公共子表达式交叉系数实现常系数滤波器的概念,例如:
滤波器
y[n]=
(3.19)
其中,3个系数a[k]={480,-302,31}。
3个系数的CSD码如下:
从表中可以注意到,
结构出现了4次。
如果构造一个临时变量h[n]=2x[n]-x[n-1]就可以用y[n]=256h[n]-16h[n]-32h[n-1]+h[n-1](3.20)
计算滤波器的输出。
2、建模和求解
1)代入h[n]=2x[n]-x[n-1验证(3.20)。
答:
y[n]=a[0]x[n]+a[1]x[n-1]+a[2]x[n-2]
=(512-32)x[n]+(-256-64+16+2)x[n-1]+(32-1)x[n-2]
Or=256(2x[n]-x[n-1])+(-1)32(2x[n-1]-x[n-2])+(-1)16(2x[n]-x[n-1])+(2x[n-1]-x[n-2])
=256h[n]-16h[n]-32h[n-1]+h[n-1](3.20)
故验证(3.20)成立
2)得到的(3.19)的直接CSD实现和字表达式共享的实现分别需要多少个加法器?
答:
对比1问中的实现数学表达式可以知道:
直接CSD7个加法器;
使用子表达式共享只需要1+3=4个加法器
3)用QuartusII实现8位输入的子表达式共享滤波器。
答:
通过前两问的分析可以知道,只需要将普通的CSD码的滤波器进行h[n]=2x[n]-x[n-1]这样的子模块变换,就可以简化系统结构。
a[k]={480,-302,31}
①.普通的CSD搭建的滤波器
moduleHartley(
clk,
x_in,
out
);
inputclk;
input[7:
0]x_in;
outputreg[17:
0]out;
//reg[17:
0]temp2,temp1,temp0;//[2:
0];//暂存
reg[17:
0]temp[2:
0];//暂存
//always@(x_in)
//begin
//temp[0]=x_in;
//end
always@(posedgeclk)//需不需要把x_in作为敏感变量?
begin
/*
temp2=temp1;
temp1=temp0;
temp0=x_in;
y[n]=a[0]x[n]+a[1]x[n-1]+a[2]x[n-2]
=(512-32)x[n]+(-256-64)x[n-1]+(32-1)x[n-2]
//out<=temp[2]<<9-temp[2]<<5-temp[1]<<8-temp[1]<<6+temp[0]<<5-temp[0];
out=temp[2]*512-temp[2]*32-temp[1]*256-temp[1]*64+temp[0]*32-temp[0];
*/
temp[2]<=temp[1];
temp[1]<=temp[0];
temp[0]<=x_in;
out=temp[2]*512-temp[2]*32-temp[1]*256-temp[1]*64+temp[0]*32-temp[0];
//out<=temp[2]<<9-temp[2]<<5-temp[1]<<8-temp[1]<<6+temp[0]<<5-temp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实时 信号 作业