近似加法器.docx
《近似加法器.docx》由会员分享,可在线阅读,更多相关《近似加法器.docx(15页珍藏版)》请在冰豆网上搜索。
近似加法器
电子科技大学
UNIVERSITYOFELECTRONICSCIENCEANDTECHNOLOGYOFCHINA
数字电路
课程设计报告
课程设计题目近似加法器
学号*************
作者姓名宁博宇
指导教师陈学英胡剑浩
摘要
算术运算是数字系统的基本功能,更是计算机中不可缺少的组成单元。
本次报告介绍加法运算的逻辑电路。
半加器,全加器,近似加法器,已经他们的组合构成的串行进位加法器.
关键词:
8bit加法器行波进位加法器近似加法器
第一章绪论
一.1课程设计背景
两个多位数相加时每一位都是带进位相加的,因而必须使用全加器。
只要依次将低位的全加器的进位输出端接到高位全加器的进位输入端,就可以构成多位加法器了。
串行进位加法器。
每一位的相加结果都必须等到低一位的进位产生以后才能建立起来,因此将这种结构的电路称为串行进位加法器(或称为行波进位加法器)。
其最大的特点是运算速度慢。
一、实验内容
1、对近似加法器进行逻辑设计
2、对设计进行matlab仿真和信噪比分析
3、对设计进行VHDL仿真
二、实验结果
Matlab综合设计图
1、总体设计
总体设计的设计图如下:
如图所示,如图所示,1、2产生二个高斯随机数,4、5、6、7将高斯随机数的输出转换为bits的格式,其中7和8是两个不同的加法器。
两个加法器都采用3个近似加法器和5个全加器进行8bit近似加法器的设计。
其中7是不带纠错电路的加法器,而8是带有纠错电路的加法器,它们对相同信号进行处理得到不同的结果。
9和10是将二进制的输出转换成为十进制。
11和12得到输出。
加法器7的设计图如下
左边3个是近似加法器,右边5个是全加器。
加法器8的设计图如下
上面多了四个纠错电路,是对三个近似加法器的结果进行修正。
其中采用的近似加法器为:
其中全加器的实现如下:
纠错电路:
Matlab仿真结果求信噪比程序:
sum0=0;
fori=1:
10000
sum0=sum0+(simout0(i)-128)^2;
end
sum=0;
fori=1:
10000
sum=sum+(simout(i)-128)^2;
end
d0=sum0/10000;
x0=20*log(128/9)/log(10)-20*log(128/d0)/log(10);
d=sum/10000;
x=20*log(128/9)/log(10)-20*log(128/d)/log(10);
其中x0得到的是通过不含纠错电路的加法器7计算得到的信噪比,x是得到的是通过含纠错电路的加法器8计算得到的信噪比。
输出结果:
由于近似加法器是为了提升速度对二进制信号做加法时的进位进行近似处理为求得速度的提升,所以其会有计算的偏差,这就是信噪比相对较大的原因。
纠错后效果变差,信噪比变高,分析原因可能是论文中的纠错电路是针对均匀分布的信号,而实验中是高斯分布的信号。
2、VHDL仿真
总时延是11ns(含纠错电路),效果达到要求。
Summary如下:
Vhdl程序:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--useIEEE.NUMERIC_STD.ALL;
--Uncommentthefollowinglibrarydeclarationifinstantiating
--anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entityapp_addersis
port(
A,B:
instd_logic_vector(7downto0);
S:
outstd_logic_vector(7downto0));
endapp_adders;
architectureBehavioralofapp_addersis
signalcout:
STD_LOGIC_VECTOR(0to7);
COMPONENTapp
PORT(
a:
INstd_logic;
b:
INstd_logic;
cin:
INstd_logic;
cout:
OUTstd_logic;
s:
OUTstd_logic
);
ENDCOMPONENT;
COMPONENTfull
PORT(
a:
INstd_logic;
b:
INstd_logic;
cin:
INstd_logic;
s:
OUTstd_logic;
cout:
OUTstd_logic
);
ENDCOMPONENT;
begin
FA1:
appPORTMAP(
a=>A(0),
b=>B(0),
cin=>'0',
cout=>cout(0),
s=>S(0)
);
FA2:
appPORTMAP(
a=>A
(1),
b=>B
(1),
cin=>cout(0),
cout=>cout
(1),
s=>S
(1)
);
FA3:
fullPORTMAP(
a=>A
(2),
b=>B
(2),
cin=>cout
(1),
s=>S
(2),
cout=>cout
(2)
);
FA4:
fullPORTMAP(
a=>A(3),
b=>B(3),
cin=>cout
(2),
s=>S(3),
cout=>cout(3)
);
FA5:
fullPORTMAP(
a=>A(4),
b=>B(4),
cin=>cout(3),
s=>S(4),
cout=>cout(4)
);
FA6:
fullPORTMAP(
a=>A(5),
b=>B(5),
cin=>cout(4),
s=>S(5),
cout=>cout(5)
);
FA7:
fullPORTMAP(
a=>A(6),
b=>B(6),
cin=>cout(5),
s=>S(6),
cout=>cout(6)
);
FA8:
fullPORTMAP(
a=>A(7),
b=>B(7),
cin=>cout(6),
s=>S(7),
cout=>cout(7)
);
endBehavioral;
Testbehavior程序代码:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
--Uncommentthefollowinglibrarydeclarationifusing
--arithmeticfunctionswithSignedorUnsignedvalues
--USEieee.numeric_std.ALL;
ENTITYtestIS
ENDtest;
ARCHITECTUREbehaviorOFtestIS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTapp_adders
PORT(
a:
INstd_logic_vector(7downto0);
b:
INstd_logic_vector(7downto0);
s:
OUTstd_logic_vector(7downto0)
);
ENDCOMPONENT;
--Inputs
signala:
std_logic_vector(7downto0):
=(others=>'0');
signalb:
std_logic_vector(7downto0):
=(others=>'0');
signalcin:
std_logic:
='0';
--Outputs
signals:
std_logic_vector(7downto0);
--Noclocksdetectedinportlist.Replacebelowwith
--appropriateportname
--constant_period:
time:
=10ns;
--
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
app_addersPORTMAP(
a=>a,
b=>b,
s=>s
);
--Clockprocessdefinitions
--_process:
process
--begin
--<='0';
--waitfor_period/2;
--<='1';
--waitfor_period/2;
--endprocess;
--Stimulusprocess
stim_proc:
process
begin
--holdresetstatefor100ns.
a<="00111111";
b<="01000001";
cin<='0';
waitfor100ns;
a<="01000001";
b<="01000010";
cin<='0';
waitfor100ns;
a<="00111110";
b<="00111111";
cin<='0';
waitfor100ns;
a<="01000010";
b<="01000000";
cin<='0';
waitfor100ns;
a<="01000001";
b<="01000000";
cin<='0';
waitfor100ns;
a<="00111110";
b<="00111101";
cin<='0';
waitfor100ns;
a<="00111111";
b<="00111111";
cin<='0';
waitfor100ns;
a<="01000101";
b<="01000010";
cin<='0';
waitfor100ns;
a<="01000001";
b<="00111111";
cin<='0';
waitfor100ns;
--waitfor_period*10;
--insertstimulushere
----wait;
endprocess;
END;
Matlab中选取了10000组数据进行计算。
从Matlab中的前十组数据中提取输入值(二进制),写入test的vhdl程序。
通过simulation仿真得到结果:
将matlab中workspace的高斯随机数和加法器7的前十组输出结果x0进行二进制转换。
A信号:
B信号:
S结果:
与simulation的仿真结果进行比较。
结果一致。
第二章总结与展望
运用VHDL和MATLAB进行程序的设计与编写,在学长与老师的指导下,总的来说进行的较为顺利,可以说这次课程设计主要帮助我熟悉了VHDL和MATLAB的相关操作并且帮助我复习巩固了二进制的数字运算以及门电路的相关知识,我希望在未来进行更多的VHDL设计,加强自己的能力。