logo资料库

《EDA技术实用教程(第五版)》习题答案潘松.docx

第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
资料共49页,剩余部分请下载后查看
《EDA 技术实用教程(第五版)》习题 1 习题 1-1EDA 技术与 ASIC 设计和 FPGA 开发有什么关系?FPGA 在 ASIC 设计中有什么用 途?P3~4 EDA 技术与 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)从算法表示 转换到寄存器传输级(RegisterTransport Level,RTL),即从行为域到结构域的综合,即行为综合。(3) 从 RTL 级表示转换到逻辑门(包括触发器)的表示,即逻辑综合。(4)从逻辑门表示转换到版图表示 (ASIC 设计),或转换到 FPGA 的配置网表文件,可称为版图综合或结构综合。 综合在电子设计自动化中的地位是什么?答:是核心地位(见图 1-3)。综合器具有更复杂的工 作环境,综合器在接受 VHDL 程序并准备对其综合前,必须获得与最终实现设计电路硬件特征相关 的工艺库信息,以及获得优化综合的诸多约束条件信息;根据工艺库和约束条件信息,将 VHDL 程 序转化成电路实现的相关信息。 1-4 在 EDA 技术中,自顶向下的设计方法的重要意义是什么? P8~10 答:在 EDA 技术应用中,自顶向下的设计方法,就是在整个设计流程中各设计环节逐步求精的 过程。 1-5 IP 在 EDA 技术的应用和发展中的意义是什么? P23~25 答:IP 核具有规范的接口协议,良好的可移植与可测试性,为系统开发提供了可靠的保证。 1-6 叙述 EDA 的 FPGA/CPLD 设计流程,以及涉及的 EDA 工具及其在整个流程中的作用。 (P12~14) 答:1.设计输入(原理图/HDL 文本编辑)(EDA 设计输入器将电路系统以一定的表达方式输入 计算机);2.综合(EDA 综合器就是将电路的高级语言(如行为描述)转换成低级的,可与 FPGA/CPLD 的基本结构相映射的网表文件或程序。);3.适配(EDA 适配器的功能是将 由综合器产生的网表文件配置于指定的目标器件中,使之产生最终的下载文件,如 JEDEC、 JAM 格式的文件。);4.时序仿真(ED A 时序仿真器就是接近真实器件运行特性的仿真,仿真文件中 已包含了器件硬件特性参数,因而,仿真精度高。)与功能仿真(ED A 功能仿真器直接对 VHDL、原 理图描述或其他描述形式的逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计的要求,
仿真过程不涉及任何具体器件的硬件特性。);5.编程下载(EDA 编程下载把适配后生成的下载或 配置文件,通过编程器或编程电缆向 FPGA 或 CPLD 下载,以便进行硬件调试和验证(Hardware Debugging)。);6.硬件测试(最后是将含有载入了设计的 FPGA 或 CPLD 的硬件系统进行统一测 试,以便最终验证设计项目在目标系统上的实际工作情况,以排除错误,改进设计。其中 EDA 的嵌 入式逻辑分析仪是将含有载入了设计的 FPGA 的硬件系统进行统一测试,并将测试波形在 PC 机 上显示、观察和分析。)。 2 习题 2-1OLMC(输出逻辑宏单元)有何功能?说明 GAL 是怎样实现可编程组合电路与时序电路的。 P34~36 OLMC 有何功能? 答:OLMC 单元设有多种组态,可配置成专用组合输出、专用输入、组合输 出双向口、寄存器输出、寄存器输出双向口等。 说明 GAL 是怎样实现可编程组合电路与时序电路的? 答:GAL(通用阵列逻辑器件)是通过对 其中的 OLMC(逻辑宏单元)的编程和三种模式配置(寄存器模式、复合模式、简单模式),实现组合 电路与时序电路设计的。 2-2 什么是基于乘积项的可编程逻辑结构?P33~34,40 什么是基于查找表的可编程逻辑结 构?P40~42 什么是基于乘积项的可编程逻辑结构?答:GAL、CPLD 之类都是基于乘积项的可编程结构; 即包含有可编程与阵列和固定的或阵列的 PAL(可编程阵列逻辑)器件构成。 什么是基于查找表的可编程逻辑结构?答:FPGA(现场可编程门阵列)是基于查找表的可编程 逻辑结构。 2-3FPGA 系列器件中的 LAB 有何作用? P42~44 答:FPGA(Cyclone/Cyclone II)系列器件主要由逻辑阵列块 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 器件? MAX II 系列又属于什么类型的 PLD 器
件?为什么? P47~51 答:APEX(Advanced Logic Element Matrix)系列属于 FPGA 类型 PLD 器件;编程信息存于 SRAM 中。MAX II 系列属于 CPLD 类型的 PLD 器件;编程信息存于 EEPROM 中。 3 习题 3-1 说明端口模式 INOUT 和 BUFFER 有何异同点。P60 INOUT : 具有三态控制的双向传送端口 BUFFER: 具有输出反馈的单向东湖出口。 3-2 画出与以下实体描述对应的原理图符号元件: ENTITY buf3s IS --实体 1:三态缓冲器 PORT(input:IN STD_LOGIC; --输入端 enable:IN STD_LOGIC; --使能端 output:OUT STD_LOGIC); --输出端 END buf3s ; ENTITY mux21 IS --实体 2: 2 选 1 多路选择器 PORT(in0, in1,sel: IN STD_LOGIC; output:OUT STD_LOGIC); 3-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 多路选择器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (a,b,c,d: IN STD_LOGIC; s0: IN STD_LOGIC; s1: IN STD_LOGIC; y: OUT STD_LOGIC); END ENTITY mux41; ARCHITECTURE if_mux41 OF mux41 IS
SIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据 BEGIN s0s1<=s1&s0; --s1 相并 s0,即 s1 与 s0 并置操作 PROCESS(s0s1,a,b,c,d) BEGIN IF s0s1 = "00" THEN y <= a; ELSIF s0s1 = "01" THEN y <= b; ELSIF s0s1 = "10" THEN y <= c; ELSE y <= d; END IF; END PROCESS; END ARCHITECTURE if_mux41; --解 2:用 CASE 语句实现 4 选 1 多路选择器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (a,b,c,d: IN STD_LOGIC; s0: IN STD_LOGIC; s1: IN STD_LOGIC; y: OUT STD_LOGIC); END ENTITY mux41; ARCHITECTURE case_mux41 OF mux41 IS SIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据类型 BEGIN s0s1<=s1&s0; --s1 相并 s0,即 s1 与 s0 并置操作 PROCESS(s0s1,a,b,c,d) BEGIN CASE s0s1 IS --类似于真值表的 case 语句 WHEN "00" => y <= a; WHEN "01" => y <= b; WHEN "10" => y <= c; WHEN "11" => y <= d; WHEN OTHERS =>NULL ; END CASE; END PROCESS; END ARCHITECTURE case_mux41; 3-4 给出 1 位全减器的 VHDL 描述;最终实现 8 位全减器。要求: 1)首先设计 1 位半减器,然后用例化语句将它们连接起来,图 4-20 中 h_suber 是半减器,diff 是 输出差(diff=x-y),s_out 是借位输出(s_out=1,x
PORT( x,y: IN STD_LOGIC; diff,s_out: OUT STD_LOGIC); END ENTITY h_suber; ARCHITECTURE hs1 OF h_suber IS BEGIN Diff <= x XOR (NOT y); s_out <= (NOT x) AND y; END ARCHITECTURE hs1; --解(1.2):采用例化实现图 4-20 的 1 位全减器 LIBRARY IEEE; --1 位二进制全减器顺层设计描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_suber IS PORT(xin,yin,sub_in: IN STD_LOGIC; sub_out,diff_out: OUT STD_LOGIC); END ENTITY f_suber; ARCHITECTURE fs1 OF f_suber IS COMPONENT h_suber --调用半减器声明语句 PORT(x, y: IN STD_LOGIC; diff,s_out: OUT STD_LOGIC); END COMPONENT; SIGNAL a,b,c: STD_LOGIC; --定义 1 个信号作为内部的连接线。 BEGIN u1: h_suber PORT MAP(x=>xin,y=>yin, diff=>a, s_out=>b); u2: h_suber PORT MAP(x=>a, y=>sub_in, diff=>diff_out,s_out=>c); sub_out <= c OR b; END ARCHITECTURE fs1; (2)以 1 位全减器为基本硬件,构成串行借位的 8 位减法器,要求用例化语句来完成此项设计 (减法运算是 x-y-sun_in=difft)。 xin yin a b diff_out c
解(2):采用例化方法,以 1 位全减器为基本硬件;实现串行借位的 8 位减法器(上图所示)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY suber_8 IS PORT(x0,x1,x2,x3,x4,x5,x6,x7: IN STD_LOGIC; y0,y1,y2,y3,y4,y5,y6,y7,sin: IN STD_LOGIC; diff0,diff1,diff2,diff3: OUT STD_LOGIC; diff4,diff5,diff6,diff7,sout: OUT STD_LOGIC); END ENTITY suber_8; ARCHITECTURE s8 OF suber_8 IS COMPONENT f_suber --调用全减器声明语句 PORT(xin,yin,sub_in: IN STD_LOGIC; sub_out,diff_out: OUT STD_LOGIC); END COMPONENT; SIGNAL a0,a1,a2,a3,a4,a5,a6: STD_LOGIC; --定义 1 个信号作为内部的连接线。 BEGIN u0:f_suber PORT MAP(xin=>x0,yin=>y0,diff_out=>diff0,sub_in=>sin,sub_out=>a0); u1:f_suber PORT MAP(xin=>x1,yin=>y1,diff_out=>diff1,sub_in=>a0,sub_out=>a1); u2:f_suber PORT MAP(xin=>x2,yin=>y2,diff_out=>diff2,sub_in=>a1,sub_out=>a2); u3:f_suber PORT MAP(xin=>x3,yin=>y3,diff_out=>diff3,sub_in=>a2,sub_out=>a3); u4:f_suber PORT MAP(xin=>x4,yin=>y4,diff_out=>diff4,sub_in=>a3,sub_out=>a4); u5:f_suber PORT MAP(xin=>x5,yin=>y5,diff_out=>diff5,sub_in=>a4,sub_out=>a5); u6:f_suber PORT MAP(xin=>x6,yin=>y6,diff_out=>diff6,sub_in=>a5,sub_out=>a6); u7:f_suber PORT MAP(xin=>x7,yin=>y7,diff_out=>diff7,sub_in=>a6,sub_out=>sout); END ARCHITECTURE s8; 3-5 用 VHDL 设计一个 3-8 译码器,要求分别用(条件)赋值语句、case 语句、if else 语句或 移位操作符来完成。比较这 4 种方式中,哪一种最节省逻辑资源。 解(1):条件赋值语句 --3-5 3 到 8 译码器设计(条件赋值语句实现) diff0 diff1 sout diff7 串行借位的 8 位减法器 DOUT<="00000001" WHEN 0, "00000010" WHEN 1, "00000100" WHEN 2, "00001000" WHEN 3, "00010000" WHEN 4, "00100000" WHEN 5, "01000000" WHEN 6, "10000000" WHEN 7, UNAFFECTED WHEN OTHERS; END behave; 解(2):case 语句 --3-5 3 到 8 译码器设计(case 语句实现) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --为使用类型转换函数,打开此程序包。
ENTITY decoder3to8 IS port( DIN: IN STD_LOGIC_VECTOR(2 DOWNTO 0); DOUT: OUT BIT_VECTOR(7 DOWNTO 0)); END decoder3to8; ARCHITECTURE behave OF decoder3to8 IS BEGIN PROCESS (DIN) BEGIN CASE CONV_INTEGER(DIN) IS WHEN 0 => DOUT<="00000001"; WHEN 1 => DOUT<="00000010"; WHEN 2 => DOUT<="00000100"; WHEN 3 => DOUT<="00001000"; WHEN 4 => DOUT<="00010000"; WHEN 5 => DOUT<="00100000"; WHEN 6 => DOUT<="01000000"; WHEN 7 => DOUT<="10000000"; WHEN OTHERS => NULL; END CASE; END decoder3to8; ARCHITECTURE behave OF decoder3to8 IS BEGIN PROCESS (DIN) BEGIN IF CONV_INTEGER(DIN)=0 THEN DOUT<="00000001"; ELSIF CONV_INTEGER(DIN)=1 THEN DOUT<="00000010"; ELSIF CONV_INTEGER(DIN)=2 THEN DOUT<="00000100"; ELSIF CONV_INTEGER(DIN)=3 THEN DOUT<="00001000"; ELSIF CONV_INTEGER(DIN)=4 THEN DOUT<="00010000"; ELSIF CONV_INTEGER(DIN)=5 THEN DOUT<="00100000"; ELSIF CONV_INTEGER(DIN)=6 THEN DOUT<="01000000"; ELSIF CONV_INTEGER(DIN)=7 THEN DOUT<="10000000"; END IF; END PROCESS; END behave; 解(4):移位操作符 --3-5 3 到 8 译码器设计(移位操作实现) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --为使用类型转换函数,打开此程序包。 ENTITY decoder3to8 IS port( DIN: IN STD_LOGIC_VECTOR(2 DOWNTO 0); DOUT: OUT BIT_VECTOR(7 DOWNTO 0)); END decoder3to8;
ARCHITECTURE behave OF decoder3to8 IS BEGIN DOUT<="00000001" SLL CONV_INTEGER(DIN); --被移位部分是常数 END behave; 3-6 设计一个比较电路,当输入的 8421BCD 码大于 5 时输出 1,否则输出 0。 --解:3-6 设计一个比较电路,当输入的 8421BCD 码大于 5 时输出 1,否则输出 0。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY g_5_cmp IS PORT( d_in : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入数据 cmp_out : OUT STD_LOGIC); --比较输出(1:输入数据>5) END g_5_cmp; ARCHITECTURE BHV OF g_5_cmp IS BEGIN PROCESS(d_in) BEGIN IF(d_in>"0101") THEN cmp_out<='1'; --输入数据大于 5,比较输出 1。 else cmp_out<='0'; --输入数据小于等于 5,比较输出 0。 END IF; END PROCESS; END BHV; 3-7 利用 if 语句设计一个全加器。 --3-7 利用 if 语句设计一个全加器 LIBRARY IEEE; --1 位二进制全加器顶层设计描述 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY f_adder IS PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END ENTITY f_adder; ARCHITECTURE fd1 OF f_adder IS BEGIN PROCESS (ain,bin,cin) BEGIN IF ain='1' XOR bin='1' XOR cin='1' THEN sum<='1'; ELSE sum<='0'; END IF; IF (ain='1' AND bin='1')OR(ain='1' AND cin='1')OR(bin='1' AND cin='1')OR(ain='1' AND bin='1' AND cin='1') THEN cout<='1'; ELSE cout<='0'; END IF; END PROCESS; END ARCHITECTURE fd1;
分享到:
收藏