《EDA技术教程》习题答案_第1页
《EDA技术教程》习题答案_第2页
《EDA技术教程》习题答案_第3页
《EDA技术教程》习题答案_第4页
《EDA技术教程》习题答案_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《EDA技术实用教程(第五版)》习题1习题1-1EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?P3~4EDA技术与ASIC设计和FPGA开发有什么关系?答:利用EDA技术进行电子系统设计的最后目标是完成专用集成电路ASIC的设计和实现;FPGA和CPLD是实现这一途径的主流器件。FPGA和CPLD的应用是EDA技术有机融合软硬件电子设计技术、SoC(片上系统)和ASIC设计,以及对自动设计与自动实现最典型的诠释。FPGA在ASIC设计中有什么用途?答:FPGA和CPLD通常也被称为可编程专用IC,或可编程ASIC。FPGA实现ASIC设计的现场可编程器件。1-2与软件描述语言相比,VHDL有什么特点?P4~6答:编译器将软件程序翻译成基于某种特定CPU的机器代码,这种代码仅限于这种CPU而不能移植,并且机器代码不代表硬件结构,更不能改变CPU的硬件结构,只能被动地为其特定的硬件电路结构所利用。综合器将VHDL程序转化的目标是底层的电路结构网表文件,这种满足VHDL设计程序功能描述的电路结构,不依赖于任何特定硬件环境;具有相对独立性。综合器在将VHDL(硬件描述语言)表达的电路功能转化成具体的电路结构网表过程中,具有明显的能动性和创造性,它不是机械的一一对应式的“翻译”,而是根据设计库、工艺库以及预先设置的各类约束条件,选择最优的方式完成电路结构的设计。l-3什么是综合?有哪些类型?综合在电子设计自动化中的地位是什么?P6什么是综合?答:在电子设计领域中综合的概念可以表示为:将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。有哪些类型?答:(1)从自然语言转换到VHDL语言算法表示,即自然语言综合。(2)从算法表示转换到寄存器传输级(RegisterTransportLevel,RTL),即从行为域到结构域的综合,即行为综合。(3)从RTL级表示转换到逻辑门(包括触发器)的表示,即逻辑综合。(4)从逻辑门表示转换到版图表示(ASIC设计),或转换到FPGA的配置网表文件,可称为版图综合或结构综合。综合在电子设计自动化中的地位是什么?答:是核心地位(见图1-3)。综合器具有更复杂的工作环境,综合器在接受VHDL程序并准备对其综合前,必须获得与最终实现设计电路硬件特征相关的工艺库信息,以及获得优化综合的诸多约束条件信息;根据工艺库和约束条件信息,将VHDL程序转化成电路实现的相关信息。1-4在EDA技术中,自顶向下的设计方法的重要意义是什么?P8~10答:在EDA技术应用中,自顶向下的设计方法,就是在整个设计流程中各设计环节逐步求精的过程。1-5IP在EDA技术的应用和发展中的意义是什么?P23~25答:IP核具有规范的接口协议,良好的可移植与可测试性,为系统开发提供了可靠的保证。1-6叙述EDA的FPGA/CPLD设计流程,以及涉及的EDA工具及其在整个流程中的作用。(P12~14)答:1.设计输入(原理图/HDL文本编辑)(EDA设计输入器将电路系统以一定的表达方式输入计算机);2.综合(EDA综合器就是将电路的高级语言(如行为描述)转换成低级的,可与FPGA/CPLD的基本结构相映射的网表文件或程序。);3.适配(EDA适配器的功能是将由综合器产生的网表文件配置于指定的目标器件中,使之产生最终的下载文件,如JEDEC、JAM格式的文件。);4.时序仿真(EDA时序仿真器就是接近真实器件运行特性的仿真,仿真文件中已包含了器件硬件特性参数,因而,仿真精度高。)与功能仿真(EDA功能仿真器直接对VHDL、原理图描述或其他描述形式的逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计的要求,仿真过程不涉及任何具体器件的硬件特性。);5.编程下载(EDA编程下载把适配后生成的下载或配置文件,通过编程器或编程电缆向FPGA或CPLD下载,以便进行硬件调试和验证(HardwareDebugging)。);6.硬件测试(最后是将含有载入了设计的FPGA或CPLD的硬件系统进行统一测试,以便最终验证设计项目在目标系统上的实际工作情况,以排除错误,改进设计。其中EDA的嵌入式逻辑分析仪是将含有载入了设计的FPGA的硬件系统进行统一测试,并将测试波形在PC机上显示、观察和分析。)。2习题2-1OLMC(输出逻辑宏单元)有何功能?说明GAL是怎样实现可编程组合电路与时序电路的。P34~36OLMC有何功能?答:OLMC单元设有多种组态,可配置成专用组合输出、专用输入、组合输出双向口、寄存器输出、寄存器输出双向口等。说明GAL是怎样实现可编程组合电路与时序电路的?答:GAL(通用阵列逻辑器件)是通过对其中的OLMC(逻辑宏单元)的编程和三种模式配置(寄存器模式、复合模式、简单模式),实现组合电路与时序电路设计的。2-2什么是基于乘积项的可编程逻辑结构?P33~34,40什么是基于查找表的可编程逻辑结构?P40~42什么是基于乘积项的可编程逻辑结构?答:GAL、CPLD之类都是基于乘积项的可编程结构;即包含有可编程与阵列和固定的或阵列的PAL(可编程阵列逻辑)器件构成。什么是基于查找表的可编程逻辑结构?答:FPGA(现场可编程门阵列)是基于查找表的可编程逻辑结构。2-3FPGA系列器件中的LAB有何作用?P42~44答:FPGA(Cyclone/CycloneII)系列器件主要由逻辑阵列块LAB、嵌入式存储器块(EAB)、I/O单元、嵌入式硬件乘法器和PLL等模块构成;其中LAB(逻辑阵列块)由一系列相邻的LE(逻辑单元)构成的;FPGA可编程资源主要来自逻辑阵列块LAB。2-4与传统的测试技术相比,边界扫描技术有何优点?P47~50答:使用BST(边界扫描测试)规范测试,不必使用物理探针,可在器件正常工作时在系统捕获测量的功能数据。克服传统的外探针测试法和“针床”夹具测试法来无法对IC内部节点无法测试的难题。2-5解释编程与配置这两个概念。P51~56答:编程:基于电可擦除存储单元的EEPROM或Flash技术。CPLD一股使用此技术进行编程。CPLD被编程后改变了电可擦除存储单元中的信息,掉电后可保存。电可擦除编程工艺的优点是编程后信息不会因掉电而丢失,但编程次数有限,编程的速度不快。配置:基于SRAM查找表的编程单元。编程信息是保存在SRAM中的,SRAM在掉电后编程信息立即丢失,在下次上电后,还需要重新载入编程信息。大部分FPGA采用该种编程工艺。该类器件的编程一般称为配置。对于SRAM型FPGA来说,配置次数无限,且速度快;在加电时可随时更改逻辑;下载信息的保密性也不如电可擦除的编程。2-6请参阅相关资料,并回答问题:按本章给出的归类方式,将基于乘积项的可编程逻辑结构的PLD器件归类为CPLD;将基于查找表的可编程逻辑结构的PLD器什归类为FPGA,那么,APEX系列属于什么类型PLD器件?MAXII系列又属于什么类型的PLD器件?为什么?P47~51答:APEX(AdvancedLogicElementMatrix)系列属于FPGA类型PLD器件;编程信息存于SRAM中。MAXII系列属于CPLD类型的PLD器件;编程信息存于EEPROM中。3习题3-1说明端口模式INOUT和BUFFER有何异同点。P60INOUT:具有三态控制的双向传送端口BUFFER:具有输出反馈的单向东湖出口。3-2画出与以下实体描述对应的原理图符号元件:ENTITYbuf3sIS--实体1:三态缓冲器PORT(input:INSTD_LOGIC;--输入端enable:INSTD_LOGIC;--使能端output:OUTSTD_LOGIC);--输出端ENDbuf3s;buf3sbuf3sinputoutputenableENTITYmux21IS--实体2:2选1多路选择器PORT(in0,in1,sel:INSTD_LOGIC;output:OUTSTD_LOGIC);mux2mux21in0outputin1sel3-3试分别用IF_THEN语句和CASE语句的表达方式写出此电路的VHDL程序,选择控制信号s1和s0的数据类型为STD_LOGIC_VECTOR;当s1=’0’,s0=’0’;s1=’0’,s0=’1’;s1=’1’,s0=’0’和s1=’1’,s0=’1’时,分别执行y<=a、y<=b、y<=c、y<=d。--解1:用IF_THEN语句实现4选1多路选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41ISPORT(a,b,c,d:INSTD_LOGIC;s0:INSTD_LOGIC;s1:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYmux41;ARCHITECTUREif_mux41OFmux41ISSIGNALs0s1:STD_LOGIC_VECTOR(1DOWNTO0);--定义标准逻辑位矢量数据BEGINs0s1<=s1&s0;--s1相并s0,即s1与s0并置操作PROCESS(s0s1,a,b,c,d)BEGINIFs0s1="00"THENy<=a;ELSIFs0s1="01"THENy<=b;ELSIFs0s1="10"THENy<=c;ELSEy<=d;ENDIF;ENDPROCESS;ENDARCHITECTUREif_mux41;--解2:用CASE语句实现4选1多路选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41ISPORT(a,b,c,d:INSTD_LOGIC;s0:INSTD_LOGIC;s1:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYmux41;ARCHITECTUREcase_mux41OFmux41ISSIGNALs0s1:STD_LOGIC_VECTOR(1DOWNTO0);--定义标准逻辑位矢量数据类型BEGINs0s1<=s1&s0;--s1相并s0,即s1与s0并置操作PROCESS(s0s1,a,b,c,d)BEGINCASEs0s1IS--类似于真值表的case语句WHEN"00"=>y<=a;WHEN"01"=>y<=b;WHEN"10"=>y<=c;WHEN"11"=>y<=d;WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDARCHITECTUREcase_mux41;3-4给出1位全减器的VHDL描述;最终实现8位全减器。要求:1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-20中h_suber是半减器,diff是输出差(diff=x-y),s_out是借位输出(s_out=1,x<y),sub_in是借位输入。cyinxindiff_outbacyinxindiff_outba图3-18全减器结构图--解(1.1):实现1位半减器h_suber(diff=x-y;s_out=1,x<y)LIBRARYIEEE;--半减器描述(1):布尔方程描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_suberISPORT(x,y:INSTD_LOGIC;diff,s_out:OUTSTD_LOGIC);ENDENTITYh_suber;ARCHITECTUREhs1OFh_suberISBEGINDiff<=xXOR(NOTy);s_out<=(NOTx)ANDy;ENDARCHITECTUREhs1;--解(1.2):采用例化实现图4-20的1位全减器LIBRARYIEEE;--1位二进制全减器顺层设计描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_suberISPORT(xin,yin,sub_in:INSTD_LOGIC;sub_out,diff_out:OUTSTD_LOGIC);ENDENTITYf_suber;ARCHITECTUREfs1OFf_suberISCOMPONENTh_suber--调用半减器声明语句PORT(x,y:INSTD_LOGIC;diff,s_out:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa,b,c:STD_LOGIC;--定义1个信号作为内部的连接线。BEGINu1:h_suberPORTMAP(x=>xin,y=>yin,diff=>a,s_out=>b);u2:h_suberPORTMAP(x=>a,y=>sub_in,diff=>diff_out,s_out=>c);sub_out<=cORb;ENDARCHITECTUREfs1;(2)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句来完成此项设计(减法运算是x-y-sun_in=difft)。xinsub_outxinsub_outyinu0sub_indiff_outx0y0sindiff0xinsub_outyinu1sub_indiff_outx1y1diff1xinsub_outyinu7sub_indiff_outx7y7soutdiff7……………….……………….串行借位的8位减法器a0a1a6--解(2):采用例化方法,以1位全减器为基本硬件;实现串行借位的8位减法器(上图所示)。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYsuber_8ISPORT(x0,x1,x2,x3,x4,x5,x6,x7:INSTD_LOGIC;y0,y1,y2,y3,y4,y5,y6,y7,sin:INSTD_LOGIC;diff0,diff1,diff2,diff3:OUTSTD_LOGIC;diff4,diff5,diff6,diff7,sout:OUTSTD_LOGIC);ENDENTITYsuber_8;ARCHITECTUREs8OFsuber_8ISCOMPONENTf_suber--调用全减器声明语句PORT(xin,yin,sub_in:INSTD_LOGIC;sub_out,diff_out:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa0,a1,a2,a3,a4,a5,a6:STD_LOGIC;--定义1个信号作为内部的连接线。BEGINu0:f_suberPORTMAP(xin=>x0,yin=>y0,diff_out=>diff0,sub_in=>sin,sub_out=>a0);u1:f_suberPORTMAP(xin=>x1,yin=>y1,diff_out=>diff1,sub_in=>a0,sub_out=>a1);u2:f_suberPORTMAP(xin=>x2,yin=>y2,diff_out=>diff2,sub_in=>a1,sub_out=>a2);u3:f_suberPORTMAP(xin=>x3,yin=>y3,diff_out=>diff3,sub_in=>a2,sub_out=>a3);u4:f_suberPORTMAP(xin=>x4,yin=>y4,diff_out=>diff4,sub_in=>a3,sub_out=>a4);u5:f_suberPORTMAP(xin=>x5,yin=>y5,diff_out=>diff5,sub_in=>a4,sub_out=>a5);u6:f_suberPORTMAP(xin=>x6,yin=>y6,diff_out=>diff6,sub_in=>a5,sub_out=>a6);u7:f_suberPORTMAP(xin=>x7,yin=>y7,diff_out=>diff7,sub_in=>a6,sub_out=>sout);ENDARCHITECTUREs8;3-5用VHDL设计一个3-8译码器,要求分别用(条件)赋值语句、case语句、ifelse语句或移位操作符来完成。比较这4种方式中,哪一种最节省逻辑资源。解(1):条件赋值语句--3-53到8译码器设计(条件赋值语句实现)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为使用类型转换函数,打开此程序包。ENTITYdecoder3to8ISport(DIN:INSTD_LOGIC_VECTOR(2DOWNTO0);DOUT:OUTBIT_VECTOR(7DOWNTO0));ENDdecoder3to8;ARCHITECTUREbehaveOFdecoder3to8ISBEGINWITHCONV_INTEGER(DIN)SELECTDOUT<="00000001"WHEN0,"00000010"WHEN1,"00000100"WHEN2,"00001000"WHEN3,"00010000"WHEN4,"00100000"WHEN5,"01000000"WHEN6,"10000000"WHEN7,UNAFFECTEDWHENOTHERS;ENDbehave;解(2):case语句--3-53到8译码器设计(case语句实现)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为使用类型转换函数,打开此程序包。ENTITYdecoder3to8ISport(DIN:INSTD_LOGIC_VECTOR(2DOWNTO0);DOUT:OUTBIT_VECTOR(7DOWNTO0));ENDdecoder3to8;ARCHITECTUREbehaveOFdecoder3to8ISBEGINPROCESS(DIN)BEGINCASECONV_INTEGER(DIN)ISWHEN0=>DOUT<="00000001";WHEN1=>DOUT<="00000010";WHEN2=>DOUT<="00000100";WHEN3=>DOUT<="00001000";WHEN4=>DOUT<="00010000";WHEN5=>DOUT<="00100000";WHEN6=>DOUT<="01000000";WHEN7=>DOUT<="10000000";WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDbehave;解(3):if_else语句--3-53到8译码器设计(if_else语句实现)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为使用类型转换函数,打开此程序包。ENTITYdecoder3to8ISport(DIN:INSTD_LOGIC_VECTOR(2DOWNTO0);DOUT:OUTBIT_VECTOR(7DOWNTO0));ENDdecoder3to8;ARCHITECTUREbehaveOFdecoder3to8ISBEGINPROCESS(DIN)BEGINIFCONV_INTEGER(DIN)=0THENDOUT<="00000001";ELSIFCONV_INTEGER(DIN)=1THENDOUT<="00000010";ELSIFCONV_INTEGER(DIN)=2THENDOUT<="00000100";ELSIFCONV_INTEGER(DIN)=3THENDOUT<="00001000";ELSIFCONV_INTEGER(DIN)=4THENDOUT<="00010000";ELSIFCONV_INTEGER(DIN)=5THENDOUT<="00100000";ELSIFCONV_INTEGER(DIN)=6THENDOUT<="01000000";ELSIFCONV_INTEGER(DIN)=7THENDOUT<="10000000";ENDIF;ENDPROCESS;ENDbehave;解(4):移位操作符--3-53到8译码器设计(移位操作实现)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为使用类型转换函数,打开此程序包。ENTITYdecoder3to8ISport(DIN:INSTD_LOGIC_VECTOR(2DOWNTO0);DOUT:OUTBIT_VECTOR(7DOWNTO0));ENDdecoder3to8;ARCHITECTUREbehaveOFdecoder3to8ISBEGINDOUT<="00000001"SLLCONV_INTEGER(DIN);--被移位部分是常数ENDbehave;3-6设计一个比较电路,当输入的8421BCD码大于5时输出1,否则输出0。--解:3-6设计一个比较电路,当输入的8421BCD码大于5时输出1,否则输出0。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYg_5_cmpISPORT(d_in:INSTD_LOGIC_VECTOR(3DOWNTO0);--输入数据cmp_out:OUTSTD_LOGIC);--比较输出(1:输入数据>5)ENDg_5_cmp;ARCHITECTUREBHVOFg_5_cmpISBEGINPROCESS(d_in)BEGINIF(d_in>"0101")THENcmp_out<='1';--输入数据大于5,比较输出1。elsecmp_out<='0';--输入数据小于等于5,比较输出0。ENDIF;ENDPROCESS;ENDBHV;3-7利用if语句设计一个全加器。--3-7利用if语句设计一个全加器LIBRARYIEEE;--1位二进制全加器顶层设计描述USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREfd1OFf_adderISBEGINPROCESS(ain,bin,cin)BEGINIFain='1'XORbin='1'XORcin='1'THENsum<='1';ELSEsum<='0';ENDIF;IF(ain='1'ANDbin='1')OR(ain='1'ANDcin='1')OR(bin='1'ANDcin='1')OR(ain='1'ANDbin='1'ANDcin='1')THENcout<='1';ELSEcout<='0';ENDIF;ENDPROCESS;ENDARCHITECTUREfd1;3-8设计一个求补码的程序,输入数据是一个有符号的8位二进制数。--解:3-8设计一个求补码的程序,输入数据是一个有符号的8位二进制数。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYorg_patchISPORT(org_data:INSTD_LOGIC_VECTOR(7DOWNTO0);--原码输入patch_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--补码输出ENDorg_patch;ARCHITECTUREBHVOForg_patchISBEGINPROCESS(org_data)BEGINIF(org_data(7)='0')THENpatch_data<=org_data;--org_data>=0,补码=原码。elsepatch_data<=org_data(7)&(notorg_data(6DOWNTO0))+1;--org_data<0,补码=|原码|取反+1。ENDIF;ENDPROCESS;ENDBHV;3-9设计一个格雷码至二进制数的转换器。--3-9设计一个格雷码至二进制数的转换器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为使用类型转换函数,打开此程序包。ENTITYgrayTObinaryISport(DIN:INSTD_LOGIC_VECTOR(3DOWNTO0);DOUT:OUTBIT_VECTOR(3DOWNTO0));ENDgrayTObinary;ARCHITECTUREbehaveOFgrayTObinaryISBEGINPROCESS(DIN)BEGINCASEDINISWHEN"0000"=>DOUT<="0000";WHEN"0001"=>DOUT<="0001";WHEN"0011"=>DOUT<="0010";WHEN"0010"=>DOUT<="0011";WHEN"0110"=>DOUT<="0100";WHEN"0111"=>DOUT<="0101";WHEN"0101"=>DOUT<="0110";WHEN"0100"=>DOUT<="0111";WHEN"1100"=>DOUT<="1000";WHEN"1101"=>DOUT<="1001";WHEN"1111"=>DOUT<="1010";WHEN"1110"=>DOUT<="1011";WHEN"1010"=>DOUT<="1100";WHEN"1011"=>DOUT<="1101";WHEN"1001"=>DOUT<="1110";WHEN"1000"=>DOUT<="1111";WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDbehave;3-10利用if语句设计一个3位二进制数A[2..0]、B[2..0]的比较器电路。对于比较(A<B)、(A>B)、(A=B)的结果分别给出输出信号LT=1、GT=1、EQ=1。--3-10利用if语句设计一个3位二进制数A[2..0]、B[2..0]的比较器电路。--对于比较(A<B)、(A>B)、(A=B)的结果分别给出输出信号LT=1、GT=1、EQ=1。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOMPISPORT(A,B:INSTD_LOGIC_VECTOR(2DOWNTO0);--两个3位输入LT:OUTSTD_LOGIC;--小于输出GT:OUTSTD_LOGIC;--大于输出EQ:OUTSTD_LOGIC);--等于输出ENDENTITYCOMP;ARCHITECTUREONEOFCOMPISBEGINPROCESS(A,B)BEGINIF(A<B)THENLT<='1';ELSELT<='0';ENDIF;IF(A>B)THENGT<='1';ELSEGT<='0';ENDIF;IF(A=B)THENEQ<='1';ELSEEQ<='0';ENDIF;ENDPROCESS;--LT<=(A<B);--小于--GT<=(A>B);--大于--EQ<=(A=B);--等于ENDARCHITECTUREONE;3-11利用8个全加器,可以构成一个8位加法器。利用循环语句来实现这项设计。并以此项设计为例,使用GENERIC参数传递的功能,设计一个32位加法器。--3-11利用GENERIC参数和循环语句将8个全加器构成成8位加法器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYADDER8BISGENERIC(S:INTEGER:=8);--定义参数S为整数类型,且等于4PORT(A,B:INSTD_LOGIC_VECTOR(S-1DOWNTO0);CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(S-1DOWNTO0);COUT:OUTSTD_LOGIC);ENDENTITYADDER8B;ARCHITECTUREONEOFADDER8BISBEGINPROCESS(A,B,CIN)VARIABLES1:STD_LOGIC_VECTOR(S-1DOWNTO0);VARIABLEC1:STD_LOGIC;--_VECTOR(SDOWNTO0);BEGINC1:=CIN;--C1(0):=CIN;FORiIN1TOSLOOPIFA(i-1)='1'XORB(i-1)='1'XORC1='1'THENS1(i-1):='1';ELSES1(i-1):='0';ENDIF;IF(A(i-1)='1'ANDB(i-1)='1')OR(A(i-1)='1'ANDC1='1')OR(B(i-1)='1'ANDC1='1')OR(A(i-1)='1'ANDB(i-1)='1'ANDC1='1')THENC1:='1';ELSEC1:='0';ENDIF;ENDLOOP;SUM<=S1;COUT<=C1;ENDPROCESS;ENDARCHITECTUREONE;3-12设计一个2位BCD码减法器。注意可以利用BCD码加法器来实现。因为减去一个二进制数,等于加上这个数的补码。只是需要注意,作为十进制的BCD码的补码获取方式与普通二进制数稍有不同。我们知道二进制数的补码是这个数的取反加1。假设有一个4位二进制数是0011,其取补实际上是用1111减去0011,再加上l。相类似,以4位二进制表达的BCD码的取补则是用9(1001)减去这个数再加上1。--3-12设计2位BCD码减法器(利用减去数等于加上该数补码方法)(a-b=a+[-b]补码)LIBRARYIEEE;--待例化元件USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_arith.ALL;USEIEEE.STD_LOGIC_unsigned.ALL;ENTITYSUB2BCDISPORT(a,b:INSTD_LOGIC_VECTOR(7DOWNTO0);diff:outSTD_LOGIC_VECTOR(7DOWNTO0);sout:OUTSTD_LOGIC);ENDSUB2BCD;ARCHITECTUREbehaveOFSUB2BCDISBEGINPROCESS(a,b)VARIABLEcc:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFa<bTHENsout<='1';ELSEsout<='0';ENDIF;cc:="10011010"-b;IFcc(3DOWNTO0)>"1001"THENcc:=cc+"00000110";ENDIF;IFcc(7DOWNTO4)>"1001"THENcc:=cc+"01100000";ENDIF;cc:=a+cc;IFcc(3DOWNTO0)>"1001"THENcc:=cc+"00000110";ENDIF;IFcc(7DOWNTO4)>"1001"THENcc:=cc+"01100000";ENDIF;IFa<bTHENcc:="10011010"-cc;IFcc(3DOWNTO0)>"1001"THENcc:=cc+"00000110";ENDIF;IFcc(7DOWNTO4)>"1001"THENcc:=cc+"01100000";ENDIF;ENDIF;diff<=cc;ENDPROCESS;ENDbehave;3-13设计一个4位乘法器,为此首先设计一个加法器,用例化语句调用这个加法器,用移位相加的方式完成乘法。并以此项设计为基础,使用GENERIC参数传递的功能,设计一个16位乘法器。--3-134位移位相加型乘法器设计(例化调用加法器)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYMULT4BISGENERIC(S:INTEGER:=4);--定义参数S为整数类型,且等于4PORT(R:OUTSTD_LOGIC_VECTOR(2*S-1DOWNTO0);A,B:INSTD_LOGIC_VECTOR(S-1DOWNTO0));ENDENTITYMULT4B;ARCHITECTUREONEOFMULT4BISCOMPONENTaddernISPORT(a,b:INSTD_LOGIC_VECTOR;result:outSTD_LOGIC_VECTOR);ENDCOMPONENT;SIGNALA0:STD_LOGIC_VECTOR(2*S-1DOWNTO0);SIGNALRR3,RR2,RR1,RR0,ZZ1,ZZ0:STD_LOGIC_VECTOR(2*S-1DOWNTO0);BEGINA0<=CONV_STD_LOGIC_VECTOR(0,S)&A;PROCESS(A,B)BEGINIF(B(0)='1')THENRR0<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0)SLL0);ELSERR0<=(OTHERS=>'0');ENDIF;IF(B(1)='1')THENRR1<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0)SLL1);ELSERR1<=(OTHERS=>'0');ENDIF;IF(B(2)='1')THENRR2<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0)SLL2);ELSERR2<=(OTHERS=>'0');ENDIF;IF(B(3)='1')THENRR3<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0)SLL3);ELSERR3<=(OTHERS=>'0');ENDIF;ENDPROCESS;u0:addernPORTMAP(a=>RR0,b=>RR1,result=>ZZ0);u1:addernPORTMAP(a=>ZZ0,b=>RR2,result=>ZZ1);u2:addernPORTMAP(a=>ZZ1,b=>RR3,result=>R);ENDARCHITECTUREONE;--3-13a16位乘法器(通过底层3-13_MULTSB和顶层GENERIC参数和传递例化语句实现)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMULT16BISPORT(D1,D2:INSTD_LOGIC_VECTOR(15DOWNTO0);Q:OUTSTD_LOGIC_VECTOR(31DOWNTO0));END;ARCHITECTUREBHVOFMULT16BISCOMPONENTMULTSB--MULTS8模块的调用声明GENERIC(S:integer);--照抄MULTSB实体中关于参数“端口”定义的语句PORT(R:OUTstd_logic_vector(2*S-1DOWNTO0);A,B:INstd_logic_vector(S-1DOWNTO0));ENDCOMPONENT;BEGINu1:MULTSBGENERICMAP(S=>16)PORTMAP(R=>Q,A=>D1,B=>D2);END;3-14用循环语句设计一个7人投票表决器。--解:3-14用循环语句设计一个7人投票表决器,及一个4位4输出最大数值检测电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYvote_7ISPORT(DIN:INSTD_LOGIC_VECTOR(6DOWNTO0);--7位表决输入(1:同意,0:不同意)G_4:OUTSTD_LOGIC;--超过半数指示CNTH:OUTSTD_LOGIC_VECTOR(2DOWNTO0));--表决结果统计数ENDvote_7;ARCHITECTUREBHVOFvote_7ISBEGINPROCESS(DIN)VARIABLEQ:STD_LOGIC_VECTOR(2DOWNTO0);BEGINQ:="000";FORnIN0TO6LOOP--n是LOOP的循环变量IF(DIN(n)='1')THENQ:=Q+1;ENDIF;ENDLOOP;CNTH<=Q;IFQ>=4THENG_4<='1';ELSEG_4<='0';ENDIF;ENDPROCESS;ENDBHV;3-15设计一个4位4输入最大数值检测电路。--3-15设计一个4位4输入最大数值检测电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYMAXDATAISPORT(A:INSTD_LOGIC_VECTOR(3DOWNTO0);MAXOUT:OUTSTD_LOGIC);ENDENTITYMAXDATA;ARCHITECTUREONEOFMAXDATAISBEGINPROCESS(A)BEGINIFA="1111"THENMAXOUT<='1';ELSEMAXOUT<='0';ENDIF;ENDPROCESS;ENDARCHITECTUREONE;3-16设计VHDL程序,实现两个8位二进制数相加,然后将和左移或右移4位,并分别将移位后的值存入变量AA和BB中。--3-16设计VHDL程序,实现两个8位二进制数相加,然后将和左移或右移4位,并分别将移位后的值存入变量A和B中。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYADDER8BISGENERIC(S:INTEGER:=8);--定义参数S为整数类型,且等于4PORT(A,B:INSTD_LOGIC_VECTOR(S-1DOWNTO0);CIN:INSTD_LOGIC;SUM:OUTSTD_LOGIC_VECTOR(S-1DOWNTO0);COUT:OUTSTD_LOGIC;AA,BB:OUTSTD_LOGIC_VECTOR(S-1+4DOWNTO0));ENDENTITYADDER8B;ARCHITECTUREONEOFADDER8BISBEGINPROCESS(A,B,CIN)VARIABLES1:STD_LOGIC_VECTOR(S-1DOWNTO0);VARIABLEC1:STD_LOGIC;VARIABLEAB:STD_LOGIC_VECTOR(S-1+4DOWNTO0);BEGINC1:=CIN;FORiIN1TOSLOOPIFA(i-1)='1'XORB(i-1)='1'XORC1='1'THENS1(i-1):='1';ELSES1(i-1):='0';ENDIF;IF(A(i-1)='1'ANDB(i-1)='1')OR(A(i-1)='1'ANDC1='1')OR(B(i-1)='1'ANDC1='1')OR(A(i-1)='1'ANDB(i-1)='1'ANDC1='1')THENC1:='1';ELSEC1:='0';ENDIF;ENDLOOP;SUM<=S1;COUT<=C1;AA<=TO_STDLOGICVECTOR(TO_BITVECTOR("0000"&S1)SLL4);BB<=TO_STDLOGICVECTOR(TO_BITVECTOR("0000"&S1)SRL4);ENDPROCESS;ENDARCHITECTUREONE;3-17举例说明GENERIC说明语句(在实体定义语句中定义类属常数)和GENERIC映射语句(在例化语句中将类属常数赋予新值)有何用处。P823-18表达式C<=A+B中,A、B和C的数据类型都是STD_LOGIC_VECTOR,是否能直接进行加法运算?说明原因和解决方法。能(第一种将A、B转换成整型数相加结果再转换成逻辑位矢后送CP89;第二种使用USEIEEE.SDT_LOGIC_UNSIGNED.ALL语句打开重载运算符程序包。P70,P130)3-19VHDL中有哪三种数据对象?详细说明它们的功能特点以及使用方法,举例说明数据对象与数据类型的关系。信号,变量,常量P713-20能把任意一种进制的值向一整数类型的数据对象赋值吗?如果能,怎样做?能(若A,B,C,D是信号整数类型,A<=16#df#;B<=8#23#;C<=2#01#;D<=10)P833-21回答有关BIT和BOOLEAN数据类型的问题:P59(1)解释BIT(‘0’;‘1’)和BOOLEAN(“TRUE”,“FALSE”)类型的区别。(2)对于逻辑操作应使用哪种类型?BIT(3)关系操作的结果为哪种类型?BOOLEAN(4)IF语句测试的表达式是哪种类型?BOOLEAN3-22用两种方法设计8位比较器,比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是D、E、F。当A=B时D=1;当A>B时E=1;当A<B时F=1。第一种设计方案是常规的比较器设计方法,即直接利用关系操作符进行编程设计;第二种设计方案是利用减法器来完成,通过减法运算后的符号和结果来判别两个被比较值的大小。对两种设计方案的资源耗用情况进行比较,并给以解释。--3-22比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是EQ、GT、F。当A=B时EQ=1;当A>B时GT=1;当A<B时LT=1。--第一种设计方案是常规的比较器设计方法,即直接利用关系操作符进行编程设计。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOMPISPORT(A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);--两个3位输入LT:OUTSTD_LOGIC;--小于输出GT:OUTSTD_LOGIC;--大于输出EQ:OUTSTD_LOGIC);--等于输出ENDENTITYCOMP;ARCHITECTUREONEOFCOMPISBEGINPROCESS(A,B)BEGINIF(A<B)THENLT<='1';ELSELT<='0';ENDIF;IF(A>B)THENGT<='1';ELSEGT<='0';ENDIF;IF(A=B)THENEQ<='1';ELSEEQ<='0';ENDIF;ENDPROCESS;ENDARCHITECTUREONE;--3-22比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是EQ、GT、F。当A=B时EQ=1;当A>B时GT=1;当A<B时LT=1。--第二种设计方案是利用减法器来完成,通过减法运算后的符号和结果来判别两个被比较值的大小。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOMPISPORT(A,B:INSTD_LOGIC_VECTOR(7DOWNTO0);--两个3位输入LT:OUTSTD_LOGIC;--小于输出GT:OUTSTD_LOGIC;--大于输出EQ:OUTSTD_LOGIC);--等于输出ENDENTITYCOMP;ARCHITECTUREONEOFCOMPISSIGNALC:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALD,E,F,G:INTEGERBEGINC<=A-B;D<=10;E<=16#D9#;F<=8#72#;G<=2#11010010#;PROCESS(A,B)BEGINIF(C(7)='1')THENLT<='1';ELSELT<='0';ENDIF;IF(C=0)THENEQ<='1';ELSEEQ<='0';IF(C(7)='0')THENGT<='1';ELSEGT<='0';ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREONE;3-23根据图3-19,用两种不同描述方式设计一4选1多路选择器。在设计中需要体现此电路由三个2选l多路选择器构成。解1:层次例化;解2:单层3进程。--解1:层次例化。底层元件mux21a.vhd程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux21aISPORT(a,b,s:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;--解1:层次例化。顶层mux41b.vhd程序如下:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmux41bISport(X0,X1,X2,X3:INSTD_LOGIC;S0,S1:INSTD_LOGIC;OUTY:OUTSTD_LOGIC);ENDmux41b;ARCHITECTUREbdf_typeOFmux41bIScomponentmux21aPORT(a,b,s:INSTD_LOGIC;y:OUTSTD_LOGIC);endcomponent;signalN0,N1:STD_LOGIC;BEGINu1:mux21aPORTMAP(a=>X0,b=>X1,s=>S0,y=>N0);u2:mux21aPORTMAP(a=>X2,b=>X3,s=>S0,y=>N1);u3:mux21aPORTMAP(a=>N0,b=>N1,s=>S1,y=>OUTY);END;--解2:单层结构mux41a.vhd程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41aISPORT(x1,x2,x3,x4,s0,s1:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDENTITYmux41a;ARCHITECTUREoneOFmux41aISsignalN0,N1:STD_LOGIC;BEGINcom1:PROCESS(x1,x2,s0)BEGINIFs0='0'THENN0<=x1;ELSEN0<=x2;ENDIF;ENDPROCESS;com2:PROCESS(x3,x4,s0)BEGINIFs0='0'THENN1<=x3;ELSEN1<=x4;ENDIF;ENDPROCESS;com3:PROCESS(N0,N1,s1)BEGINIFs1='0'THENy<=N0;ELSEy<=N1;ENDIF;ENDPROCESS;ENDARCHITECTUREone;4习题4-1归纳利用QuartusII进行VHDL文本输入设计的流程:从文件输入一直到硬件功能测试。P96~P110答:1建立工作库文件夹和编辑设计文件;2创建工程;3编译前设置;4全程编译;5时序仿真;6引脚锁定;7配置文件下载;8打开SignalTapII编辑窗口;9调入SignalTapII的待测信号;10SignalTapII参数设置;11SignalTapII参数设置文件存盘;12带有SignalTapII测试信息的编译下载;13启动SignalTapII进行采样与分析;14SignalTapII的其他设置和控制方法。4-2参考Quartus

II的Help,详细说明Assignments菜单中Settings对话框的功能。(1)说明其中的TimingRequirements&Qptions的功能、使用方法和检测途径。(2)说明其中的CompilationProcess的功能和使用方法。(3)说明Analysis&SynthesisSetting的功能和使用方法,以及其中的SynthesisNetlistOptimization的功能和使用方法。(1)说明其中的TimingRequirements&Qptions的功能、他用方法和检测途经。SpecifyingTimingRequirementsandOptions(ClassicTimingAnalyzer)YoucanspecifytimingrequirementsforClassictiminganalysisthathelpyouachievethedesiredspeedperformanceandothertimingcharacteristicsfortheentireproject,forspecificdesignentities,orforindividualclocks,nodes,andpins.Whenyouspecifyeitherproject-wideorindividualtimingrequirements,theFitteroptimizestheplacementoflogicinthedeviceinordertomeetyourtiminggoals.YoucanusetheTimingwizardortheTimingAnalysisSettingscommandtoeasilyspecifyallproject-widetimingrequirements,oryoucanusetheAssignmentEditortoassignindividualclockorI/Otimingrequirementstospecificentities,nodes,andpins,ortoallvalidnodesincludedinawildcardorassignmentgroupassignment.Tospecifyproject-widetimingrequirements:OntheAssignmentsmenu,clickSettings.IntheCategorylist,selectTimingAnalysisSettings.Tospecifyproject-widetSU,tH,tCO,and/ortPDtimingrequirements,specifyvaluesunderDelayrequirements.Tospecifyproject-wideminimumdelayrequirements,specifyoptionsunderMinimumdelayrequirements.UnderClockSettings,selectDefaultrequi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论