数字系统设计实验32位串行加法器实验综述.docx
- 文档编号:24287733
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:20
- 大小:181.11KB
数字系统设计实验32位串行加法器实验综述.docx
《数字系统设计实验32位串行加法器实验综述.docx》由会员分享,可在线阅读,更多相关《数字系统设计实验32位串行加法器实验综述.docx(20页珍藏版)》请在冰豆网上搜索。
数字系统设计实验32位串行加法器实验综述
深圳大学实验报告
课程名称:
数字系统设计
实验项目名称:
32位串行加法器
学院:
信息工程学院
专业:
电子信息工程
指导教师:
报告人:
学号:
20091000000班级:
1班
实验时间:
2011-12-4
实验报告提交时间:
2011-12-10
教务处制
一、实验目的与要求:
实验目的:
1、掌握串行加法器的原理和设计。
2、熟悉VHDL状态机的设计。
3、学会分析波形图。
实验要求:
设计一个用一个1位加法器构建的一个32位串行加法器。
重点是算法状态机的实现还有系统的时序分析;输出和整理VHDL源代码;输出和整理电路结构图;输出和整理仿真波形图
二、实验原理
1、设计原理图:
本图参考课本
2、流程图:
针对以上流程图,其中,Sh为控制移位寄存器的使能信号,k为工作状态指示信号,load为加载信号,counter为运算计数器,N为系统工作控制信号。
从流程图中可以看出加法器的整个工作流程是怎么样子的,具体工作情况如下面的设计。
三、实验内容与步骤
1、VHDL代码的编写:
------------------控制器-------------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useieee.std_logic_unsigned.all;
entitycontrolleris
Port(clk:
inSTD_LOGIC;
N:
inSTD_LOGIC;
K,Sh,load:
outSTD_LOGIC);
endcontroller;
architectureBehavioralofcontrolleris
signalstate,nextstate:
integerrange0to2;---设置状态
signalcounter:
std_logic_vector(4downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
state<=nextstate;---上升沿触发启动
endif;
endprocess;
process(clk,N)
begin
if(clk'eventandclk='1')then
casestateis---设置各状态
when0=>
sh<='0';K<='0';load<='0';counter<="00000";
ifN='1'then
load<='1';
nextstate<=1;
else
nextstate<=0;
endif;
when1=>
sh<='1';K<='0';load<='0';
ifcounter="11110"then
counter<=counter+1;
nextstate<=2;
else
counter<=counter+1;
nextstate<=1;
endif;
when2=>
sh<='0';K<='1';load<='0';
ifN='0'then
nextstate<=0;
else
nextstate<=2;
endif;
endcase;
endif;
endprocess;
endBehavioral;
---------------------加数寄存器------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityregisters_jiashuis
Port(input:
inSTD_LOGIC_vector(31downto0);
Sh,load,clk:
inSTD_LOGIC;
SO:
outSTD_LOGIC);
endregisters_jiashu;
architectureBehavioralofregisters_jiashuis
signalx:
std_logic_vector(31downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(load='1')then
x<=input;---输入放入寄存器
elsif(sh='1')then---移位
x(30downto0)<=x(31downto1);
endif;
endif;
endprocess;
so<=x(0);
endBehavioral;
----------------------累加器---------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityregisters_addis
Port(input:
inSTD_LOGIC_vector(31downto0);
clk:
inSTD_LOGIC;
load,Sh,Si:
inSTD_LOGIC;
SO:
outSTD_LOGIC;
output:
outstd_logic_vector(31downto0));
endregisters_add;
architectureBehavioralofregisters_addis
signalx:
std_logic_vector(31downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(load='1')then
x<=input;
elsif(Sh='1')then
x(30downto0)<=x(31downto1);---移位
x(31)<=Si;
endif;
endif;
endprocess;
So<=x(0);
output<=x;---把最后值输出来
endBehavioral;
--------------------------全加器----------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityfull_adderis
Port(a:
inSTD_LOGIC;
b:
inSTD_LOGIC;
cin:
inSTD_LOGIC;
s:
outSTD_LOGIC;
cout:
outSTD_LOGIC);
endfull_adder;
architectureBehavioraloffull_adderis
begin
s<=axorbxorcin;
cout<=(aandb)or(aandcin)or(bandcin);
endBehavioral;
-------------------------D触发器----------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityDFFis
Port(D:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
rst,CE:
inSTD_LOGIC;
Q:
outSTD_LOGIC);
endDFF;
architectureBehavioralofDFFis
begin
process(rst,clk,CE)
begin
if(rst='1')then
Q<='0';
elsifCE='1'and(clk'eventandclk='1')then
Q<=D;
endif;
endprocess;
endBehavioral;
------------------主函数--------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityadder_32is
port(inputA,inputB:
instd_logic_vector(31downto0);
clk,N:
instd_logic;
outputA:
outstd_logic_vector(31downto0);
K:
outstd_logic);
endadder_32;
architectureBehavioralofadder_32is
-----------------对各个元件进行例化------------------------
componentcontrolleris--------------控制器
Port(clk:
inSTD_LOGIC;
N:
inSTD_LOGIC;
K,Sh,load:
outSTD_LOGIC);
endcomponent;
componentregisters_jiashuis--------------加数寄存器
Port(input:
inSTD_LOGIC_vector(31downto0);
Sh,load,clk:
inSTD_LOGIC;
SO:
outSTD_LOGIC);
endcomponent;
componentregisters_addis---------------累加器
Port(input:
inSTD_LOGIC_vector(31downto0);
clk:
inSTD_LOGIC;
load,Sh,Si:
inSTD_LOGIC;
SO:
outSTD_LOGIC;
output:
outstd_logic_vector(31downto0));
endcomponent;
componentfull_adderis-------------全加器
Port(a:
inSTD_LOGIC;
b:
inSTD_LOGIC;
cin:
inSTD_LOGIC;
s:
outSTD_LOGIC;
cout:
outSTD_LOGIC);
endcomponent;
componentDFFis---------------D触发器
Port(D:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
rst,CE:
inSTD_LOGIC;
Q:
outSTD_LOGIC);
endcomponent;
signalSh,load,Xi,Yi,Si,cin,sum,cout:
std_logic;-----中间变量
begin
A1:
controllerportmap(clk,n,k,Sh,load);
A2:
registers_jiashuportmap(inputB,Sh,load,clk,Yi);
A3:
registers_addportmap(inputA,clk,load,Sh,sum,Xi,outputA);
A4:
full_adderportmap(Xi,Yi,cin,sum,cout);
A5:
DFFportmap(cout,clk,load,Sh,cin);
endBehavioral;
2、仿真代码的编写:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYadder_32_testbenchIS
ENDadder_32_testbench;
ARCHITECTUREbehaviorOFadder_32_testbenchIS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTadder_32
PORT(
inputA:
INstd_logic_vector(31downto0);
inputB:
INstd_logic_vector(31downto0);
clk:
INstd_logic;
N:
INstd_logic;
outputA:
OUTstd_logic_vector(31downto0);
K:
OUTstd_logic
);
ENDCOMPONENT;
--Inputs
signalinputA:
std_logic_vector(31downto0):
=(others=>'0');
signalinputB:
std_logic_vector(31downto0):
=(others=>'0');
signalclk:
std_logic:
='0';
signalN:
std_logic:
='0';
--Outputs
signaloutputA:
std_logic_vector(31downto0);
signalK:
std_logic;
--Clockperioddefinitions
constantclk_period:
time:
=10ns;
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
adder_32PORTMAP(
inputA=>inputA,
inputB=>inputB,
clk=>clk,
N=>N,
outputA=>outputA,
K=>K
);
--Clockprocessdefinitions
clk_process:
process
begin
clk<='0';
waitforclk_period/2;
clk<='1';
waitforclk_period/2;
endprocess;
stim_proc:
process
begin
---进行输入仿真
inputA<="00000000000000000000000001001001";--inputa=73,
inputB<="00000000000000000000000010001010";--inputb=138,
N<='1';--N=1时开始计时,并开始下载数据
waitfor32*clk_period;--32个时钟周期之后
N<='0';--N=0,停止数据下载,得出相加后的结果
waitfor10*clk_period;--延时10个时钟周期,进入下一轮仿真调试
inputA<="01010101010101010101010101010101";--inputa=1431655765,
inputB<="00110000000000000000000010101000";--inputb=805306536,
N<='1';--N=1时开始计时,并开始下载数据
waitfor32*clk_period;--32个时钟周期之后
N<='0';--N=0,停止数据下载,得出相加后的结果
waitfor10*clk_period;--延时10个时钟周期,进入下一轮仿真调试
wait;
endprocess;
END;
四、实验数据与分析
1、综合的电路:
设计图外观1:
设计图外观2:
1、控制器:
2、全加器:
3、移位寄存器:
4、累加器
2、仿真的波形图如下:
情况一:
inputa=73,inputb=138,outputa=211
情况二:
inputa=1431655765,inputb=805306536,outputa=2236962301
数据处理分析:
每次从N=1开始,加法器进行数据下载,32个时钟周期之后,当N=0时,输出k=1,表示串行累加的过程结束,此时输出的结果即为加法器的最后结果。
通过以上的波形可知,每次当k=1是,即输出一个结果,仿真波形验证了设计的正确性。
五、实验结论:
本次实验,成功设计并验证了本次设计的正确性。
使我了解了串行加法器的工作原理,再次加深了对ISE和Modelsim软件的使用。
特别是这一次使用了很多元件组成一个加法器,这还是第一次这样做的。
总之,这次实验收获不小。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 系统 设计 实验 32 串行 加法器 综述