计算机科学与技术学院实验报告(2011—2012学年度第二学期)课程名称EDA技术实用教程实验名称D触发器、八位二进制补码、双二选一多路选择器、一位全减器、八位二进制乘法器姓名学号专业计算机班级地点教师实验一D触发器一、实验目的1、熟悉Max+PlusII和GW48EDA开发系统的使用;2、掌握一位半减器具有上升沿触发的D触发器的VHDL设计;二、实验原理数字电路的信号只有两种状态:逻辑低或逻辑高,即通常所说的0状态或1状态、0电平或1电平。在各种复杂的数字电路中不但需要对二值(0,1)信号进行算术运算和逻辑适算(门电路),还经常需要将这些信号和运算结果保存起来。为此,需要使用具有记忆功能的基本逻辑单元。能够存储l位二值信号的基本单元电路统称触发器。触发器的特点:1、具有两个能自行保持的稳定状态,用来表示逻辑状态的0和1,或二进制数的0和1。2、根据不同的输入信号可以把输出置成1或O状态。原理图:3、当输入信号消失后,能保持其状态不变(具有记忆功能)。三、源程序HU.vhd的代码如下:libraryieee;USEIEEE.STD_LOGIC_1164.ALL;ENTITYHUISPORT(CL:INSTD_LOGIC;--输入选择信号CLK0:INSTD_LOGIC;--输入信号OUT1:OUTSTD_LOGIC);--输出端END;ARCHITECTUREONEOFHUISSIGNALQ:STD_LOGIC;BEGINPR01:PROCESS(CLK0)BEGINIFCLK0'EVENTANDCLK0='1'THENQ=NOT(CLORQ);ELSEENDIF;ENDPROCESS;PR02:PROCESS(CLK0)BEGINOUT1=Q;ENDPROCESS;ENDONE;四、实验结果实验二八位二进制补码一.实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握八位二进制补码的VHDL设计;3.元件例化语句的使用。二.实验原理若原码为正,则补码等于原码;若原码为负,则补码为(2+原码)mod2。三.源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYJACKANISPORT(rst:INSTD_LOGIC;din:INSTD_LOGIC_VECTOR(7DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYJACKAN;ARCHITECTUREHAIXIAOFJACKANISSIGNALtmp:STD_LOGIC_VECTOR(6DOWNTO0);BEGINPROCESS(din,rst)BEGINIFrst='0'THENdout=(OTHERS='0');ELSIFdin(7)='1'THENFORiIN0TO6LOOPtmp(i)=NOTdin(i);ENDLOOP;dout(6DOWNTO0)=tmp+1;dout(7)=din(7);ELSEdout=din;ENDIF;ENDPROCESS;ENDARCHITECTUREHAIXIA;四.实验结果实验三双2选1多路选择器一、实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握双2选1多路选择器的VHDL设计二、实验原理对于其中MUX21A,当s='0'和'1'时,分别有y='a'和y='b'。原理图:三、源程序mux221.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX221ISPORT(s0,s1:INSTD_LOGIC_VECTOR(1DOWNTO0);--输入信号a1,a2,a3:INSTD_LOGIC;outy:OUTSTD_LOGIC);--输出端END;ARCHITECTUREONEOFMUX221ISSIGNALtmp:STD_LOGIC;BEGINPR01:PROCESS(s0)BEGINIFs0=0THENtmp=a2;ELSEtmp=a3;ENDIF;ENDPROCESS;PR02:PROCESS(s1)BEGINIFs1=0THENouty=a1;ELSEouty=tmp;ENDIF;ENDPROCESS;ENDONE;四、实验结果实验四一位全减器一、实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握一位半减器的VHDL设计;3.掌握一位半减器构建一位全减器的方法;二、实验原理由两个半减器和一个或门构成一个全减器。首先,一位半减器的逻辑表达式:yxoutsyxyxyxdiff_其次,一位全减器的逻辑表达式:diffinsuboutsoutsubdiffinsubdiffr____三、源程序半减器的VHDL的程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entityJackanisport(x,y:instd_logic;diff,s_out:outstd_logic);endJackan;architectureHaixiaofJackanisbeginprocess(x,y)begindiff=xxory;s_out=(notx)andy;endprocess;endarchitectureHaixia;描述或门的VHDL程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entityhaixiaisport(x,y,sub_in:instd_logic;diffr,sub_out:outstd_logic);endentityhaixia;architectureYatyofhaixiaiscomponentJackanport(x,y:instd_logic;diff,s_out:outstd_logic);endcomponent;signalt0,t1,t2:std_logic;beginu1:Jackanportmap(x=x,y=y,diff=t0,s_out=t1);u2:Jackanportmap(x=t0,y=sub_in,diff=diffr,s_out=t2);sub_out=t1ort2;ENDARCHITECTUREYaty;四.实验结果实验五八位二进制乘法器一:实验目的(1)熟悉isEXPERT/MAX+plusisEXPERT/MAX+plusII/FoudationSeries软件的基本使用方法。(2)熟悉GW48-CKEDA实验开发系统的基本使用方法。(3)学习VHDL基本逻辑电路的综合设计。二:实验原理八位二进制乘法器是有由8位加法器构成的以时序方式设计的8位乘法器,采用逐项移位相加的方法来实现相乘。用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次。层次模块8位乘法器的层次结构,分为以下4个模块:①右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。②加法器模块:这是一个8位加法器,进行操作数的加法运算。③1位乘法器模块:完成8位与1位的乘法运算。④锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。简单流程图:八位寄存器Haixia存放乘数a,从a的最低位开始,每次从Haixia中移出一位,送至1×8位乘法器Yaty中,同时将被乘数加至Yaty中,进行乘法运算,运算的结果再送至8位加法器Quange中,同时取出16位移位寄存器Jackan的高8位与之进行相加,相加后结果即部分积存入Jackan中,进行移位后并保存。这样经过8次对乘数a的移位操作,所以的部分积已全加至Jackan中,此时锁存器Jackan存放的值即所要求的积。流程图如下:三、源程序8位移位寄存器:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;开始开始信号到来,置newstart为1寄存器Jackan置0,时钟上升沿到来,寄存器Haixia置乘数a时钟下降沿,置newstart为零Haixia移出1位后与被乘数放入Yaty中进行乘法运算,结果送至QuangeJackan取出高8位送Quange中,与Yaty得到结果进行加法运算,结果送至Jackan右移后并进行锁存输出每一步的运算结果,即输出Jackan的值,其中第八个值即为求得的积结果entityhaixiais--实体描述port(haixia_clk,haixia_load:instd_logic;haixia_in:instd_logic_vector(7downto0);haixia_out:outstd_logic);endhaixia;architecturearc_haixiaofhaixiais--结构体描述signalxiaoxia:std_logic_vector(7downto0);--定义信号变量beginprocess(haixia_clk,haixia_load)beginifhaixia_clk'eventandhaixia_clk='1'then--时钟上升沿到来ifhaixia_load='1'then--锁存新数据xiaoxia=r8_in;elsexiaoxia(6downto0)=xiaoxia(7downto1);--数据右移endif;endif;endprocess;haixia_out=xiaoxia(0);--输出最低位endarc_haixia;8位加法器:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityadder_4is--实体描述port(a4_in:instd_logic;a4_a,a4_b:instd_logic_vector(3downto0);a4_s:outstd_logic_vector(3downto0);a4_out:outstd_logic);endadder_4;architecturearc_adder_4ofadder_4is--结构体描述signalss:std_logic_vector(4downto0);--定义信号变量signalaa,bb:std_logic_vector(4downto0);beginaa='0'&a4_a;--为避免溢出,将0与a4_a连接bb='0'&a4_b;--将0与a4_b连接ss=aa+bb+a4_in;--执行加法运算a4_s=ss(3downto0);--输出结果a4_out=ss(4);--进位位endarc_adder_4;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityadder_8is--实体描述port(a8_in:instd_logic;a8_a,a8_b:instd_logic_vector(7downto0);a8_s:outstd_logic_vector(7downto0