12008~2009学年第一学期EDA技术A卷适用:06级电子信息工程专业EDA技术A一、填空题:(共20分,每空1分)1、在VHDL程序设计中,常用的库有(IEEE库)(STD)(WORK)库等。2、Max_plusII为原理图输入设计配备了各种需要的元件库,它们分别是(基本逻辑元件库)(宏功能元件库)(宏功能块LPM库)。3、采用原理图输入设计的文件后缀为(.gdf),采用波形图输入设计的文件后缀为(.wdf)4、在VHDL中的数值类属性测试函数主要有(left)(right)(high)和LOW。5、FPGA/CPLD的设计流程为(设计输入)、(综合)(适配)(时序仿真与功能仿真)(编程下载)(硬件测试)。6、若D=“11”&‘00’&“01”,则D的值为(“110001”)。7、若定义W:BUFFERSTD_LOGIC_VECTOR(0TO5),程序中有W=“100111”;则W(2)的值为(0)。8、定义signalf,g:std_logic_vector(5downto0);若f的值为“101011”,若执行g=(5=f(1),4=’1’,others=f(4));则g的值是(110000)。二、简答题:(共10分)1、VHDL程序一般包括几个组成部分,每部分的作用是什么?答:VHDL程序一般包括3个组成部分,它们是(1)实体,它描述的是电路器件的端口构成和信号属性;(2)结构体,描述设计实体的内部结构和外部设计实体端口间的逻辑关系;(3)库及程序包的声明,在设计实体中的语句可以使用库中相应程序包的数据和文件。2、什么叫顺序语句,它的适用范围是什么?VHDL有那几种基本的顺序语句?答:执行顺序与它们的书写顺序基本一致的语句叫顺序语句,顺序语句只能出现在进程和子程序中,子程序包括函数和过程。Vhdl有六类基本顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。三、改错,请指出下列描述中的语法错误并改正(10分)LIBRARYIEEE;--缺分号USEIEEE.STD_LOGIC_1164.ALL;--缺程序包名ENTITYh_adderIS--实体名不一致PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);---分号放外边ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderissignalabc:STD_LOGIC_vector(1downto0);--改成signal且数据宽度不对BEGINabc=a&b;PROCESS(abc)Begin---缺beginCASEabcISWHEN00=so='0';co='0';2WHEN01=so='1';co='0';WHEN10=so='1';co='0';--串行数据用单引号WHEN11=so='0';co='1';--并行数据用双引号WHENOTHERS=NULL;Endcase;--缺endcase;ENDPROCESS;ENDARCHITECTUREfh1;--结构体名不一致四、编程题(60分)1、UseVHDLlanguagetorealizethelogicfunctionoffigure(5分)Libraryieee;Useieee.std_logic_1164.all;EntityMULTI_DFFisPort(CLK,A,D:INSTD_LOGIC;QQ:OUTSTD_LOGIC);ENDMULTI_DFF;ARCHITECTUREbhvOFMULTI_DFFISSIGNALQ1,Q2:STD_LOGIC;BEGINPRO1:PROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1=NOT(Q2ORA);ENDIF;ENDPROCESS;PRO2:PROCESS(Q1)BEGINIFQ1'EVENTANDQ1='1'THENQ2=D;ENDIF;QQ=Q2;ENDPROCESS;2、用for_loop语句实现一个16位的串入并出移位寄存器。(10分)libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_unsigned.all;useIEEE.std_logic_arith.all;entitychuan_bingisport(load:instd_logic;d_in:instd_logic;d_out:bufferstd_logic_vector(15downto0);clk:instd_logic);endchuan_bing;architecturearchofchuan_bingissignall:std_logic_vector(15downto0);3beginprocess(clk)beginif(clk'eventandclk='1')thenl(0)=d_in;if(load='0')thenforiin14downto0loopl(i+1)=l(i);endloop;elsed_out=l;endif;endif;endprocess;endarch;3、用VHDL设计2位全减器电路,要求首先设计一个1位全减器,然后用元件例化语句设计2位全减器。(15分)一位全减器LIBRaryieee;useieee.std_logic_1164.all;entitysuberisport(a,b,c:instd_logic;dout,sub:outstd_logic);endsuber;architecturearchofsuberissignals:std_logic_vector(2downto0);begins=c&b&a;process(s)begincasesiswhen000=dout='0';sub='0';when001=dout='1';sub='0';when010=dout='1';sub='1';when011=dout='0';sub='0';when100=dout='1';sub='1';when101=dout='0';sub='0';when110=dout='0';sub='1';when111=dout='1';sub='1';whenothers=null;endcase;endprocess;endarch;42位全减器LIBRaryieee;useieee.std_logic_1164.all;entityfullsuberisport(x,y:instd_logic_vector(1downto0);sin:instd_logic;dout1:outstd_logic_vector(1downto0);sub1:outstd_logic);endfullsuber;architecturearchoffullsuberiscomponentsuberport(a,b,c:instd_logic;dout,sub:outstd_logic);endcomponent;signale:std_logic;beginu1:suberportmap(a=x(0),b=y(0),c=sin,dout=dout1(0),sub=e);u2:suberportmap(a=x(1),b=y(1),c=e,dout=dout1(1),sub=sub1);endarch;4、用VHDL描述一个具有计数使能、异步复位和计数器并行预置功能的16位加法计数器。(15分)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityt74ls161isport(clr,ld,en,clk:instd_logic;q:outstd_logic_vector(15downto0);p:instd_logic_vector(15downto0));endt74ls161;architecturearchoft74ls161issignalm:std_logic_vector(15downto0);beginprocess(clr,ld,en,clk)beginif(clr='0')thenm=(others=’0’);elsif(ld='0')thenm=p;elsif(clk'eventandclk='1')thenif(en=’1’)thenm=m+1;endif;输入输出ENclrldCLKQ[15..0]X0XX0000000000000000X10XP[15..0]011保持111非保持111自加计数5endif;q=m;endprocess;endarch;5、下图为一状态机的状态图,根据其输出判断其类型,并用VHDL描述之(15分)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmooreISPORT(clk,ready,rw:INStd_Logic;oe,we:OUTStd_Logic);ENDmoore;ARCHITECTUREstate_machineOFMooreISTYPEstate_typeIS(idle,decision,read,write);SIGNALpresent_state,next_state:state_type;BEGINstate_comb:PROCESS(present_state,ready,read_write)BEGINCASEpresent_stateISWHENidle=oe='0';we='0';IF(ready='1')THENnext_state=decision;ELSEnext_state=idle;ENDIF;WHENdecision=oe='0';we='0';IF(rw='1')THENnext_state=read;ELSEnext_state=write;ENDIF;WHENread=oe='1';we='0';IF(ready='1')THENnext_state=idle;ELSEnext_state=read;ENDIF;WHENwrite=6oe='0';we='1';iF(ready='1')THENnext_state=idle;ELSEnext_state=write;ENDIF;ENDCASE;ENDPROCESSstate_comb;state_clocked:PROCESS(clk)BEGINIF(rising_edge(clk))THENpresent_state=next_state;ENDIF;ENDPROCESSstate_clocked;ENDstate_machine;