实时信号处理新方法大作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实时信号处理系统设计及实现
大作业
学院:
班级:
成员(姓名学号分工):
软件版本:Quartus II 9.0sp2 Web Edition
第一题:无符号DA卷积
解:
原理:
内积公式为
假设系数c[n]为已知常数,x[n]为变量。

无符号DA系统假设变量x[n]可以表示为:
其中xb[n]表示x[n]的第b位,x[n]是x的第n次采样,则内积y可以表示为:
重新分布求和次序有:
内积运算的实现:
●用1个LUT实现映射f (c[n], xb[n])。

预先对1个2N字的LUT进行设定,输入为N位向
量xb = [xb[0], xb[1], …, xb[n-1]],输出为f (c[n], xb[n])。

●对每个LUT输出值f (c[n], xb[n]) 乘以权重2b。

●用移位-加法器实现累加运算。

定义3阶内积:
设系数位宽为4,值为c[0]=2,c[1]=3,c[2]=1,c[3]=2实现f (c[n], xb[n])的LUT为:X b[3] X b[2] X b[1] X b[0] f(c[n], X b[n])
0 0 0 0 2 x 0+1x0 + 3x0 + 2x0=010=00002
0 0 0 1 2 x 0+1x0 + 3x0 + 2x1=210=00102
0 0 1 0 2 x 0+1x0 + 3x1 + 2x0=310=00112
0 0 1 1 2 x 0+1x0 + 3x1 + 2x1=510=01012
0 1 0 0 2 x 0+1x1 + 3x0 + 2x0=110=00012
0 1 0 1 2 x 0+1x1 + 3x0 + 2x1=310=00112
0 1 1 0 2 x 0+1x1 + 3x1 + 2x0=410=01002
0 1 1 1 2 x 0+1x1 + 3x1 + 2x1=610=01102
1 0 0 0
2 x 0+1x0 + 3x0 + 2x0=210=00102
1 0 0 1
2 x 0+1x0 + 3x0 + 2x1=410=01002
1 0 1 0
2 x 0+1x0 + 3x1 + 2x0=510=01012
1 0 1 1
2 x 0+1x0 + 3x1 + 2x1=710=01112
1 1 0 0
2 x 0+1x1 + 3x0 + 2x0=310=00112
1 1 0 1
2 x 0+1x1 + 3x0 + 2x1=510=01012
1 1 1 0
2 x 0+1x1 + 3x1 + 2x0=610=01012
1 1 1 1
2 x 0+1x1 + 3x1 + 2x1=810=10002
有关x[n]={ x[0]=1010=10102, x[1]=910=10012, x[2]=1210=11002, x[3]=80=10002}的内积如下:步骤t X t[3] X t[2] X t[1] X t[0] f[t]+ACC[t-1]=ACC[t]
0 0 0 1 0 3x2 + 0 =3
1 0 0 0 1 2x21 + 3=7
2 0 1 0 0 1x22 + 7=11
3 1 1 1 1 8x23 + 11=75
进行数值校验可以看到:
y=<c,x>=c[0]x[0]+ c[1]x[1]+ c[2]x[2] + c[3]x[3]=2x10+3x9+1x12+2 x 8=75
DA体系结构图
程序代码:
●顶层文件:
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_arith.ALL;
------------------------------------------------------------------------------------------------------------------- entity DAjj is
port ( clk : in std_logic; --时钟
reset,en: in std_logic; --复位,使能
x_in0, x_in1, x_in2 ,x_in3: in std_logic_vector (3 downto 0); --四阶输入
y : out integer range 0 to 200); --结果输出
end DAjj;
------------------------------------------------------------------------------------------------------------------- architecture con of DAjj is
---------------------------------对lut表进行元件例化--------------------------------------------------- component lutb
port ( table_in : in std_logic_vector (3 downto 0); --lut表输入
table_out : out integer range 0 to 8); --lut表输出end component;
------------------------------------------------------------------------------------------------------------------- type sta_type is (s0, s1);
signal state : sta_type; --定义两个状态,用于状态机中
signal x0, x1, x2,x3,table_in: std_logic_vector (3 downto 0):="0000";
signal table_out : integer range 0 to 6; --定义信号与lut表输出相接
begin
table_in(0) <= x0(0);
table_in(1) <= x1(0);
table_in(2) <= x2(0);
table_in(3) <= x3(0); --输入初始值
process(clk,reset,en)
variable m : integer range 0 to 200; --输出暂存变量
variable njs : integer range 0 to 4; --计数变量
begin
if(reset='0') then
state<=s0; --复位信号’0’有效
elsif(en='1') then --使能信号’1’有效
if(clk='1' and clk'event) then --时钟上升沿时有效
case state is
when s0 =>
state <= s1;
njs := 0;
m := 0;
x0 <= x_in0;
x1 <= x_in1;
x2 <= x_in2;
x3 <= x_in3; --初始状态,进行初始化
when s1 =>
if njs = 4 then
y <= m;
state <= s0; --状态S1时,计数满3次时,返回初始状态(3阶)else
m := m / 2 + table_out *8; --进行移位累加运算
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); --将下一个数送入lut表中
njs := njs + 1; --计数加1,以便以后用于判断
state <= s1; --进入下一个状态
end if;
end case;
end if;
end if;
end process;
L0: lutb port map(table_in , table_out); --进行元件例化的端口映射
end con;
LUT表程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
------------------------------------------------------------------------------------------------------------------- entity lutb is
port ( table_in : in std_logic_vector(3 downto 0);
table_out : out integer range 0 to 8 );
end lutb;
-------------------------------------------------------------------------------------------------------------------
architecture lutjs of lutb is
begin
process (table_in)
begin
------------------------------------------c(0)=2,c(1)=3,c(2)=1,c(3)=2-------------------------------------------- case table_in is
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 <= 2;
when "1001" => table_out <= 4;
when "1010" => table_out <= 5;
when "1011" => table_out <= 7;
when "1100" => table_out <= 3;
when "1101" => table_out <= 5;
when "1110" => table_out <= 6;
when "1111" => table_out <= 8;
when others => table_out <= 0;
------------table_out=c(0)*table_in(0)+c(1)*table_in(1)+c(2)*table_in(2)+c(3)*table_in(3)------- end case;
end process;
end lutjs;
Quartus仿真结果
由仿真图可分析的:
(1)当x[n]={ x[0]=1010=10102, x[1]=910=10012, x[2]=1210=11002, x[3]=80=10002}
y=<c,x>=c[0]x[0]+ c[1]x[1]+ c[2]x[2]+ c[3]x[3]=2x10+3x9+1x12+2 x8=75 与仿真结果一致;
(2)当x[n]={ x[0]=510=01012, x[1]=1210=11002, x[2]=410=01002, x[3]=10=00012}
y=<c,x>=c[0]x[0]+ c[1]x[1]+ c[2]x[2]+ c[3]x[3]=2x5+3x12+1x4+2 x 1=52
与仿真结果一致
所以仿真结果正确
所用资源:使用逻辑单元为50个,组合功能14个,专用逻辑寄存器36个。

RTL 图:
第二题:Hartley 已经引入了一种通过采用公共子表达式交叉系数实现常系数滤波器的概念,
例如:滤波器 y[n]=∑-=1
0k k]-a[k]x[n L (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)
计算滤波器的输出。

(1).代入h[n]=2x[n]-x[n-1]验证(3.20)。

(2).得到(3.19)的直接CSD 实现和子表达式共享的实现分别需要多少个加法器?
(3).用QuartusII 实现8位输入的子表达式共享滤波器。

(4).仿真滤波器的脉冲响应。

(4).确定LC 的使用量和Registered Performance 。

解:
第一问:
(1)由于a[k]={480,-302,31},y[n]=∑-=1
0k k]-a[k]x[n L ,则计算即可得
y[n] = 480x[n]-302 x[n-1]+31 x[n-2]
(2)由于h[n]=2x[n]-x[n-1],y[n]=∑-=10
k k]-a[k]x[n L ,则将h[n]代入即可得到:
y[n] =256(2x[n]-x[n-1])-16(2x[n]-x[n-1])-32(2x[n-1]-x[n-2])+( 2x[n-1]-x[n-2])
=256h[n]-16h[n]-32h[n-1]+h[n-1]
= 480x[n]-302 x[n-1]+31 x[n-2]
由此(3.20)得以验证。

第二问:
(1) 直接CSD 实现
● 原始滤波器结构图:
● CSD 编码滤波器结构图:
由图可看出CSD 实现需要7个加法器。

利用CSD 编码将系数变为2的倍数,即可乘法器换成移位寄存器,从而大大减少程序的运算时间。

● 子表达式共享滤波器的结构图:
由图可看出CSD实现需要4个加法器,进一步减少了加法器的个数。

第三问:
输入为8位,则输入范围为-128~+127。

根据系数可以计算输出
最大为408*127+302*128+31*127=94409
最小为408*-128-302*127-31*128=-94546
则输出为18位即可表示。

程序代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity firzbd is
port ( clk, reset,en : in std_logic; --时钟,复位,使能
input: in integer range -128 to 127;
output : out integer range -131072 to 131071);
end firzbd;
architecture js of firzbd is
signal temp_in : integer range -128 to 217:=0;
signal temp_out,temp_zbds,temp_ys: integer range -131072 to 131071:=0;
begin
process(clk , reset , en)
begin
if reset='0' then
temp_out<=0; --复位0有效,此时输出为0
elsif(en='1')then --使能1有效
if(clk='1' and clk'event) then --时钟上升沿有效
temp_zbds<=2*input-temp_in; --子表达式
temp_out<=256*temp_zbds-16*temp_zbds-32*temp_ys+temp_ys;
--输出表达式
temp_in <= input;
temp_ys <= temp_zbds; --进行延时,实现Z-1
end if;
end if;
end process;
output<=temp_out; --输出结果
end js;
第四问:
Quartus仿真结果:
当x(0)=36,x(1)=63,x(2)=64时,y=36*480-63*302+64*31=238;与仿真结果相同;
当x(0)=1,x(1)=1x(2)=1时,y=480-302+31=209;与仿真结果相同;
所以仿真正确。

第五问:
所用资源:使用逻辑单元为98个,组合功能52个,专用逻辑寄存器46个。

RTL图:。

相关文档
最新文档