深圳大学实验报告课程名称:数字系统设计实验项目名称: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;entitycontrollerisPort(clk:inSTD_LOGIC;N:inSTD_LOGIC;K,Sh,load:outSTD_LOGIC);endcontroller;architectureBehavioralofcontrollerissignalstate,nextstate:integerrange0to2;---设置状态signalcounter:std_logic_vector(4downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenstate=nextstate;---上升沿触发启动endif;endprocess;process(clk,N)beginif(clk'eventandclk='1')thencasestateis---设置各状态when0=sh='0';K='0';load='0';counter=00000;ifN='1'thenload='1';nextstate=1;elsenextstate=0;endif;when1=sh='1';K='0';load='0';ifcounter=11110thencounter=counter+1;nextstate=2;elsecounter=counter+1;nextstate=1;endif;when2=sh='0';K='1';load='0';ifN='0'thennextstate=0;elsenextstate=2;endif;endcase;endif;endprocess;endBehavioral;---------------------加数寄存器------------------------libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityregisters_jiashuisPort(input:inSTD_LOGIC_vector(31downto0);Sh,load,clk:inSTD_LOGIC;SO:outSTD_LOGIC);endregisters_jiashu;architectureBehavioralofregisters_jiashuissignalx:std_logic_vector(31downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenif(load='1')thenx=input;---输入放入寄存器elsif(sh='1')then---移位x(30downto0)=x(31downto1);endif;endif;endprocess;so=x(0);endBehavioral;----------------------累加器---------------------------libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityregisters_addisPort(input:inSTD_LOGIC_vector(31downto0);clk:inSTD_LOGIC;load,Sh,Si:inSTD_LOGIC;SO:outSTD_LOGIC;output:outstd_logic_vector(31downto0));endregisters_add;architectureBehavioralofregisters_addissignalx:std_logic_vector(31downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenif(load='1')thenx=input;elsif(Sh='1')thenx(30downto0)=x(31downto1);---移位x(31)=Si;endif;endif;endprocess;So=x(0);output=x;---把最后值输出来endBehavioral;--------------------------全加器----------------------------libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityfull_adderisPort(a:inSTD_LOGIC;b:inSTD_LOGIC;cin:inSTD_LOGIC;s:outSTD_LOGIC;cout:outSTD_LOGIC);endfull_adder;architectureBehavioraloffull_adderisbegins=axorbxorcin;cout=(aandb)or(aandcin)or(bandcin);endBehavioral;-------------------------D触发器----------------------------libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityDFFisPort(D:inSTD_LOGIC;clk:inSTD_LOGIC;rst,CE:inSTD_LOGIC;Q:outSTD_LOGIC);endDFF;architectureBehavioralofDFFisbeginprocess(rst,clk,CE)beginif(rst='1')thenQ='0';elsifCE='1'and(clk'eventandclk='1')thenQ=D;endif;endprocess;endBehavioral;------------------主函数--------------------------------libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityadder_32isport(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;-----中间变量beginA1: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_testbenchISENDadder_32_testbench;ARCHITECTUREbehaviorOFadder_32_testbenchIS--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTadder_32PORT(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;--InputssignalinputA:std_logic_vector(31downto0):=(others='0');signalinputB:std_logic_vector(31downto0):=(others='0');signalclk:std_logic:='0';signalN:std_logic:='0';--OutputssignaloutputA:std_logic_vector(31downto0);signalK:std_logic;--Clockperioddefinitionsconstantclk_period:time:=10ns;BEGIN--InstantiatetheUnitUnderTest(UUT)uut:adder_32PORTMAP(in