• 366.12 KB
  • 2022-04-22 11:21:36 发布

EDA技术实用教程 第三版 (潘松 黄继业 著) 科学出版社 部分习题参考答案

  • 27页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《EDA技术实用教程》部分习题解答习题四习题4-5列表详细说明MAX+plusII中prim.mf和mega_lpm库中的内容和用法。答:prim:基本的元件mf:主要是74系列芯片的逻辑元件mega_lpm:参数可定制的复杂逻辑元件⊕习题4-7用74139组成一个5-24线译码器。解:共使用3片74139作6个2-4译码课后答案网图习题4-8用74283加法器和逻辑门设计实现一位8421BCD码加法器电路,输入输出均是BCD码,CI为低位的进位信号,CO为高位的进位信号,输入为两个www.hackshp.cn1位十进制数A,输出用S表示。解:如果二进制的和大于9,需要再加上6来补成BCD码 2第1章概述图习题4-9设计一个7人表决电路,参加表决者7人,同意为1,不同意为0,同意者过半则表决通过,绿指示灯亮;表决不通过则红指示灯亮。解:方法有多种,仅举一例。有多个1位全加器构成。图其中1位全加器的原理图如下:课后答案网www.hackshp.cn图1位全加器 3第1章概述习题4-10使用prim和mf库中的元件设计一个周期性产生二进制序列01001011001的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。解:给出一种解法习题4-11用D触发器设计3位二进制加法计数器。解:注意D触发器级联时应取非端,否则只能作分频器下图是异步计数器方式,同步计数器方式请读者自行考虑课后答案网习题4-12用D触发器构成按循环码www.hackshp.cn(000->001->011->111->101->100->000)规律工作的六进制同步计数器。解:用同步计数器来实现。(事实上要求设计的是一个袼雷码计数器)考虑不同状态时,对应的DFF输入端的值:Q2Q1Q0000001011111101100D2001110D1011000 4第1章概述D0111100D0=Q2+Q2Q1D1=Q2Q0D2=Q2Q0+Q2Q1×习题4-13应用4位全加器和74374构成4位二进制加法计数器。习题4-14用74194、74273、D触发器等器件组成8位串入并出的转换电路,要求在转换过程中数据不变,只有当8位一组数据全部转换结束后,输出才变化一次。课后答案网www.hackshp.cn 5第1章概述×如果使用74299、74373、D触发器和非门来完成上述功能,应该有怎样的电路?习题4-15用一片74163和2片74138构成一个具有12路脉冲输出的数据分配器。要求在原理图上标明第1路到第12路输出的位置。×改用一片74195代替以上的74163,完成同样的设计。习题4-16用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果:当5位输入中1的数目为奇数时,在最后一位的时刻输出1。课后答案网×习题4-17用7490设计模为872的计数器,且输出的个位、十位、百位都应符合8421码权重。习题4-18用74161设计一个97www.hackshp.cn分频电路,用置0和置数两种方法实现。 6第1章概述图1课后答案网www.hackshp.cn×习题4-19某通信接收机的同步信号为巴克码1110010。设计一个检测器,其输入为串行码x,输出为检测结果y,当检测到巴克码时,输出1。 7第1章概述习题五习题5-1画出与下例实体描述对应的原理图符号:ENTITYbuf3sIS--实体1:三态缓冲器PORT(input:INSTD_LOGIC;--输入端enable:INSTD_LOGIC;--使能端output:OUTSTD_LOGIC);--输出端ENDbuf3x;ENTITYmux21IS--实体2:2选1多路选择器PORT(in0,in1,sel:INSTD_LOGIC;output:OUTSTD_LOGIC);解:习题5-2图5-19所示的是4选1多路选择器,试分别用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。解:使用IF…THEN语句:process(s0,s1,a,b,c,d)beginifs0="0"ands1="0"theny<=a;elsifs0="1"ands1="0"theny<=b;elsifs0="0"ands1="1"theny<=c;课后答案网elsey<=d;endif;endprocess;www.hackshp.cn使用CASE语句:architecturehdlarchofmux41issignalstmp:std_logic_vector(1downto0);beginstmp<=s1&s0;process(s0,s1,a,b,c,d)begin 8第1章概述casestmpiswhen"00"=>y<=a;when"01"=>y<=b;when"10"=>y<=c;whenothers=>y<=d;endcase;endprocess;endhdlarch;⊕习题5-3图5-20所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s=‘0’和‘1’时,分别有y<=‘a’和y<=‘b’。试在一个结构体中用两个进程来表达此电路,每个进程中用IF语句描述一个2选1多路选择器MUX21A。图5-194选1多路选择器图5-20双2选1多路选择器解:architecturehdlarchofMUXKissignaltmp:std_logic;beginprocess(s0,a2,a3)beginifs0="0"thentmp<=a2;elsetmp<=a3;课后答案网endif;endprocess;process(s1,a1,tmp)beginifs1="0"thenwww.hackshp.cnouty<=a1;elseouty<=tmp;endif;endprocess;endhdlarch;习题5-4图5-21是一个含有上升沿触发的D触发器的时序电路,试写出此电路的VHDL设计文件。 9第1章概述图5-21习题5-4图解:VHDL设计文件内容如下:libraryieee;useieee.std_logic_1164.all;entityexenisport(cl:instd_logic;clk0:instd_logic;out1:outstd_logic);endentity;architecturehdlarchofexenissignaltmp:std_logic;beginprocess(clk0)beginifrising_edge(clk0)thentmp<=not(tmporcl);endif;endprocess;out1<=nottmp;endhdlarch;课后答案网⊕习题5-5给出1位全减器的VHDL描述。要求:(1)首先设计1位半减器,然后用例化语句将它们连接起来,图5-22中h_suber是半减器,diffr是输出差,s_out是借位输出,sub_in是借位输入。www.hackshp.cn图5-22习题5-5图(2)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句和生成语句来完成此项设计(减法运算是x–y–sub_in=diffr)。 10第1章概述解:(1)先设计一个半减器:xy00011011diff0110s_out0100libraryieee;useieee.std_logic_1164.all;entityh_suberisport(x,y:instd_logic;diff,s_out:outstd_logic);endentity;architecturehdlarchofh_suberisbeginprocess(x,y)begindiff<=xxory;s_out<=(notx)andy;endprocess;endhdlarch;1位全减器的VHDL设计文件:suber.vhdLIBRARYieee;USEieee.std_logic_1164.all;ENTITYsuberIS课后答案网port(x,y:INSTD_LOGIC;sub_in:INSTD_LOGIC;diffr:OUTSTD_LOGIC;www.hackshp.cnsub_out:OUTSTD_LOGIC);ENDsuber;ARCHITECTUREscharchOFsuberIScomponenth_suberPORT(x:INSTD_LOGIC;y:INSTD_LOGIC; 11第1章概述diff:OUTSTD_LOGIC;s_out:OUTSTD_LOGIC);endcomponent;signalt0,t1,t2:STD_LOGIC;BEGINu1:h_suberPORTMAP(x=>x,y=>y,diff=>t0,s_out=>t1);u2:h_suberPORTMAP(x=>t0,y=>sub_in,diff=>diffr,s_out=>t2);sub_out<=t1ORt2;END;(2)8位减法器,关于生成语句可以参见第9章LIBRARYieee;USEieee.std_logic_1164.all;ENTITYsub8ISport(a:INstd_logic_vector(7downto0);b:INstd_logic_vector(7downto0);sin:INSTD_LOGIC;sout:OUTSTD_LOGIC;课后答案网c:OUTstd_logic_vector(7downto0));ENDsub8;ARCHITECTUREhdlarchOFsub8ISwww.hackshp.cncomponentsuberPORT(x:INSTD_LOGIC;y:INSTD_LOGIC;sub_in:INSTD_LOGIC;diffr:OUTSTD_LOGIC;sub_out:OUTSTD_LOGIC);endcomponent; 12第1章概述signalstmp:std_logic_vector(8downto0);BEGINstmp(0)<=sin;sout<=stmp(8);gensub:foriin0to7generateu1:suberPORTMAP(x=>a(i),y=>b(i),sub_in=>stmp(i),diffr=>c(i),sub_out=>stmp(i+1));endgenerate;end;习题5-6根据图5-23,写出顶层文件MX3256.VHD的VHDL设计文件。图5-23习题5-6图解:LIBRARYieee;课后答案网USEieee.std_logic_1164.all;ENTITYMX3256ISport(INA:INSTD_LOGIC;INB:INSTD_LOGIC;www.hackshp.cnINCK:INSTD_LOGIC;INC:INSTD_LOGIC;E:OUTSTD_LOGIC;OUT1:OUTSTD_LOGIC);ENDMX3256; 13第1章概述ARCHITECTUREschtypeOFMX3256IScomponentLK35PORT(A1:INSTD_LOGIC;A2:INSTD_LOGIC;CLK:INSTD_LOGIC;Q1:OUTSTD_LOGIC;Q2:OUTSTD_LOGIC);endcomponent;signalt1:STD_LOGIC;signalt2:STD_LOGIC;signalt3:STD_LOGIC;signalt4:STD_LOGIC;BEGINinst1:lk35PORTMAP(A1=>INA,A2=>INB,CLK=>INCK,Q1=>t3,Q2=>t2);inst2:lk35PORTMAP(A1=>t2,A2=>t1,CLK=>INCK,Q1=>t4,Q2=>OUT1);process(INCK,INC)begin课后答案网if(INC="0")thent1<="0";elsif(rising_edge(INCK))thent1<=t2;www.hackshp.cnendif;endprocess;e<=t4whent2="0"elset3;END; 14第1章概述习题六习题6-5在VHDL设计中,给时序电路清0(复位)有两种方法,它们是什么?答:异步复位与同步清零习题6-6在描述时序电路的进程中,哪一种复位方法必须将复位信号放在敏感信号表中?给出这两种电路的VHDL描述。解:异步复位:process(clk,rst)beginifrst=‘1’thencnt<=(others=>‘0’);elsifrising_edge(clk)thencnt<=cnt+1;endif;endprocess;同步复位:process(clk)beginifrising_edge(clk)thenifrst=‘1’thencnt<=(others=>‘0’);elsecnt<=cnt+1;endif;endif;endprocess;习题6-8判断下面三个程序中是否有错误,若有则指出错误所在,并给出完整程序。程序1:课后答案网SignalA,EN:std_logic;Process(A,EN)VariableB:std_logic;BeginifEN=1thenB<=A;www.hackshp.cnendif;endprocess;程序2:Architectureoneofsampleisvariablea,b,c:integer;beginc<=a+b; 15第1章概述end;程序3:libraryieee;useieee.std_logic_1164.all;entitymux21isport(a,b:instd_logic;sel:instd_logic;c:outstd_logic;);endsam2;architectureoneofmux21isbeginifsel="0"thenc:=a;elsec:=b;endif;endtwo;解:程序1:变量B赋值错误,不能使用“<=”,应使用“:=”程序2:变量声明错误,变量只能在process中声明,应改为signal程序3:if语句应该处于process中习题6-9设计含有异步清零和计数使能的16位二进制减法计数器。解:设clr为异步清零端,en为计数使能端LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;USEieee.std_logic_arith.all;ENTITYex6_9ISport(clk:INSTD_LOGIC;clr,en:instd_logic;cnt:OUTstd_logic_vector(15downto0));END;课后答案网ARCHITECTUREhdlarchOFex6_9ISsignalcnttmp:std_logic_vector(15downto0);BEGINprocess(clk,clr)beginifclr="1"thenwww.hackshp.cncnttmp<=(others=>"0");elsif(rising_edge(clk))thenifen="1"thencnttmp<=cnttmp+1;endif;endif; 16第1章概述endprocess;cnt<=cnttmp;END;习题6-10设计8位左移移位寄存器,给出时序仿真波形。解:LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;USEieee.std_logic_arith.all;ENTITYex6_10ISport(sck:instd_logic;sda:instd_logic;q:outstd_logic_vector(7downto0));END;ARCHITECTUREhdlarchOFex6_10ISsignalshift:std_logic_vector(7downto0);BEGINprocess(sck)beginif(rising_edge(sck))thenshift<=sda&shift(7downto1);endif;endprocess;q<=shift;END;×习题6-11将例6-15中的4个IF语句分别用4个并列进程语句表达出来。习题6-12参考例6-2、图6-1、例课后答案网6-3和例6-22,用VHDL描述一个具有如图6-20功能的含计数使能、异步复位和计数值并行预置功能的8位加法计数器。解:LIBRARYieee;USEieee.std_logic_1164.all;www.hackshp.cnUSEieee.std_logic_unsigned.all;USEieee.std_logic_arith.all;ENTITYex6_12ISport(clk:INSTD_LOGIC;rst,load:instd_logic;d:instd_logic_vector(3downto0); 17第1章概述q:OUTstd_logic_vector(3downto0);cout:outstd_logic);END;ARCHITECTUREhdlarchOFex6_12ISsignalcnt:std_logic_vector(3downto0);BEGINprocess(clk,rst)beginifrst="1"thencnt<=(others=>"0");elsif(rising_edge(clk))thenifload="1"thencnt<=d;elsecnt<=cnt+1;endif;endif;endprocess;q<=cnt;cout<=cnt(0)andcnt(1)andcnt(2)andcnt(3);END;习题七习题7-1仿照例7-1,将例7-4用两个进程,即一个时序进程,一个组合进程表达出来。习题7-2为确保例7-5的状态机输出信号没有毛刺,试用例课后答案网7-4的方式构成一个单进程状态,使输出信号得到可靠锁存,在相同输入信号条件下,给出两程序的仿真波形。习题7-3序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始www.hackshp.cn状态重新开始检测。例7-11描述的电路完成对序列数“11100101”的检测,当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“B”。【例7-11】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSCHKISPORT(DIN,CLK,CLR:INSTD_LOGIC;--串行输入数据位/工作时钟/复位信号 18第1章概述AB:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--检测结果输出ENDSCHK;ARCHITECTUREbehavOFSCHKISSIGNALQ:INTEGERRANGE0TO8;SIGNALD:STD_LOGIC_VECTOR(7DOWNTO0);--8位待检测预置数BEGIND<="11100101";--8位待检测预置数PROCESS(CLK,CLR)BEGINIFCLR="1"THENQ<=0;ELSIFCLK"EVENTANDCLK="1"THEN--时钟到来时,判断并处理当前输入的位CASEQISWHEN0=>IFDIN=D(7)THENQ<=1;ELSEQ<=0;ENDIF;WHEN1=>IFDIN=D(6)THENQ<=2;ELSEQ<=0;ENDIF;WHEN2=>IFDIN=D(5)THENQ<=3;ELSEQ<=0;ENDIF;WHEN3=>IFDIN=D(4)THENQ<=4;ELSEQ<=0;ENDIF;WHEN4=>IFDIN=D(3)THENQ<=5;ELSEQ<=0;ENDIF;WHEN5=>IFDIN=D(2)THENQ<=6;ELSEQ<=0;ENDIF;WHEN6=>IFDIN=D(1)THENQ<=7;ELSEQ<=0;ENDIF;WHEN7=>IFDIN=D(0)THENQ<=8;ELSEQ<=0;ENDIF;WHENOTHERS=>Q<=0;ENDCASE;ENDIF;ENDPROCESS;PROCESS(Q)--检测结果判断输出BEGINIFQ=8THENAB<="1010";--序列数检测正确,输出“A”ELSEAB<="1011";--序列数检测错误,输出“B”ENDIF;ENDPROCESS;ENDbehav;习题要求1:说明例7-11的代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程。习题要求2:根据例7-11写出由两个主控进程构成的相同功能的符号化课后答案网Moore型有限状态机,画出状态图,并给出其仿真测试波形。习题要求3:将8位待检测预置数作为外部输入信号,即可以随时改变序列检测器中的比较数据。写出此程序的符号化单进程有限状态机。习题7-3提示:对于D<=“11100101”,电路需分别不间断记忆:初始状态、1、11、111、1110、11100、111001、1110010、11100101共9www.hackshp.cn种状态。习题7-4根据图7-14(a)所示的状态图,分别按照图7-14(b)和图7-14(c)写出对应结构的VHDL有限状态机。 19第1章概述图7-14习题7-4状态图习题7-5例7-12是对A/D转换器ADC0809采样控制的有限状态机的VHDL代码。习题要求1:根据图7-15,分析并详述例7-12的结构和功能,绘出状态图;习题要求2:在不改变原代码功能的条件下用两种方法改写例7-12,使其输出的控制信号(ALE、START、OE)没有毛刺。方法1:将输出信号锁存后输出;方法2:使用状态码直接输出型状态机,并比较这三种状态机的特点。【例7-12】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYADCINTISPORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);--0809的8位转换数据输出CLK,EOC:INSTD_LOGIC;--CLK是转换工作时钟LOCK1,ALE,START,OE,ADDA:OUTSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDADCINT;ARCHITECTUREbehavOFADCINTISTYPEstatesIS(st0,st1,st2,st3,st4,st5,st6);--定义各状态子类型SIGNALcurrent_state,next_state:states:=st0;课后答案网SIGNALREGL:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALLOCK:STD_LOGIC;--转换后数据输出锁存时钟信号BEGINADDA<="1";LOCK1<=LOCK;PRO:PROCESS(current_state,EOC)BEGIN--规定各状态转换方式CASEcurrent_stateISwww.hackshp.cnWHENst0=>ALE<="0";START<="0";OE<="0";LOCK<="0";next_state<=st1;WHENst1=>ALE<="1";START<="0";OE<="0";LOCK<="0";next_state<=st2;WHENst2=>ALE<="0";START<="1";OE<="0";LOCK<="0";next_state<=st3;WHENst3=>ALE<="0";START<="0";OE<="0";LOCK<="0";IF(EOC="1")THENnext_state<=st3;--测试EOC的下降沿 20第1章概述ELSEnext_state<=st4;ENDIF;WHENst4=>ALE<="0";START<="0";OE<="0";LOCK<="0";--测试EOC的上升沿,=1表明转换结束IF(EOC="0")THENnext_state<=st4;ELSEnext_state<=st5;--继续等待ENDIF;WHENst5=>ALE<="0";START<="0";OE<="1";LOCK<="0";next_state<=st6;WHENst6=>ALE<="0";START<="0";OE<="1";LOCK<="1";next_state<=st0;WHENOTHERS=>ALE<="0";START<="0";OE<="0";LOCK<="0";next_state<=st0;ENDCASE;ENDPROCESSPRO;PROCESS(CLK)BEGINIF(CLK"EVENTANDCLK="1")THENcurrent_state<=next_state;--在时钟上升沿,转换至下一状态ENDIF;ENDPROCESS;--由信号current_state将当前状态值带出此进程,进入进程PROPROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入BEGINIFLOCK="1"ANDLOCK"EVENTTHENREGL<=D;ENDIF;ENDPROCESS;Q<=REGL;ENDbehav;ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。ADC0809的精度为8位,转换时间约100μs,含锁存控制的8路多路开关,输出有三态缓冲器控制,单5V电源供电。主要控制信号说明:如图7-15所示,START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC、ADDB课后答案网、ADDA)信号的锁存信号。当模拟量送至某一输入端(如IN1或IN2等),由3位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号(类似于AD574的STATUS),当启动转换约100us后,EOC产生一个负脉冲,以示转换结束;在EOC的上升沿后,若使输出使能信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。至此www.hackshp.cnADC0809的一次转换结束。图7-15ADC0809工作时序 21第1章概述习题八习题8-2举例说明类属、类属映射语句有何用处。答:参数化元件,举例见书习题8-5在以下数据类型中,VHDL综合器支持哪些类型:STRING、TIME、REAL、BIT答:对于大多数主流的VHDL综合器,一般支持:STRING、BIT不支持:TIME、REAL习题8-6详细说明例8-23中的语句作用和程序实现的功能。答:“SLL”左移“CONV_INTEGER()”类型转换函数习题8-7表式C<=A+B中,A、B和C的数据类型都是STD_LOGIC_VECTOR,是否能直接进行加法运算?说明原因和解决方法。答:不能原因:VHDL没有定义STD_LOGIC_VECTOR的“+”操作解决方法:加载ieee.std_logic_unsigned程序包useieee.std_logic_unsigned.all;习题8-9能把任意一种进制的值向一整数类型的数据对象赋值吗?如果能,怎样做?答:可以。习题8-10判断下列VHDL标识符是否合法,如果有误则指出原因:16#0FA#,10#12F#,8#789#,8#356#,2#0101010#74HC245,74HC574,CLR/RESET,IN4/SCLK,D100%答:错误的是:74HC245、CLR/RESET、4/SCLK、D100%⊕习题8-11数据类型BIT、INTEGER和BOOLEAN分别定义在哪个库中?哪些库和程序包总是可见的?答:std、work库、std.standard课后答案网程序包总是可见的。Bit、integer、boolean定义在std库中⊕习题8-14运算符重载函数通常要调用转换函数,以便能够利用已有的数据类型。下面给出一个新的数据类型AGE,并且下面的转换函数已经实现:www.hackshp.cnfunctionCONV_INTEGER(VAL:AGE)returnINTEGER;functionCONV_AGE(VAL:INTEGER)returnAGE;仿照本章中的示例,利用此函数编写一个“+”运算符重载函数,支持下面的运算:SIGNALa,c:AGE;...c<=a+20;解:function“+”(L:AGE,R:integer)returnAGEis 22第1章概述beginreturnCONV_AGE(L+CONV_INTEGER(R));End;习题8-15用两种方法设计8位比较器,比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..B0],输出是D、E、F。当A=B时D=1;当A>B时E=1;当A

您可能关注的文档