为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 《EDA技术实用教程(第五版)》习题答案(第110章)--潘

《EDA技术实用教程(第五版)》习题答案(第110章)--潘

2017-06-11 50页 doc 40KB 802阅读

用户头像

is_713593

暂无简介

举报
《EDA技术实用教程(第五版)》习题答案(第110章)--潘《EDA技术实用教程(第五版)》习题答案(第1~10章)--潘 《EDA技术实用教程(第五版)》习题 1 习 题 1-1 EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?P3~4 EDA技术与ASIC设计和FPGA开发有什么关系?答:利用EDA技术进行电子系统设计的最后目标是完成专用集成电路ASIC的设计和实现;FPGA和CPLD是实现这一途径的主流器件。FPGA和CPLD的应用是EDA技术有机融合软硬件电子设计技术、SoC(片上系统)和ASIC设计,以及对自动设计与自动实现最典型的诠释。...
《EDA技术实用教程(第五版)》习题答案(第110章)--潘
《EDA技术实用教程(第五版)》习题答案(第1~10章)--潘 《EDA技术实用教程(第五版)》习题 1 习 题 1-1 EDA技术与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.时序仿真(EDA时序仿真器就是接近真实器件运行特性的仿真,仿真文件中已包含了器件硬件特性参数,因而,仿真精度高。)与功能仿真(EDA功能仿真器直接对VHDL、原理图描述或其他描述形式的逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计的要求,仿真过程不涉及任何具体器件的硬件特性。);5.编程下载(EDA编程下载把适配后生成的下载或配置文件,通过编程器或编程电缆向FPGA或CPLD下载,以便进行硬件调试和验证(Hardware Debugging)。);6.硬件测试(最后是将含有载入了设计的FPGA或CPLD的硬件系统进行统一测试,以便最终验证设计项目在目标系统上的实际工作情况,以排除错误,改进设计。其中EDA的嵌入式逻辑仪是将含有载入了设计的FPGA的硬件系统进行统一测试,并将测试波形在PC机上显示、观察和分析。)。 2 习 题 2-1 OLMC(输出逻辑宏单元)有何功能?说明GAL是怎样实现可编程组合电路与时序电路的。 P34~36 OLMC有何功能? 答:OLMC单元设有多种组态,可配置成专用组合输出、专用输入、组合输出双向口、寄存器输出、寄存器输出双向口等。 说明GAL是怎样实现可编程组合电路与时序电路的? 答:GAL(通用阵列逻辑器件)是通过对其中的OLMC(逻辑宏单元)的编程和三种模式配置(寄存器模式、复合模式、简单模式),实现组合电路与时序电路设计的。 2-2 什么是基于乘积项的可编程逻辑结构? P33~34,40 什么是基于查找表的可编程逻辑结构? P40~42 什么是基于乘积项的可编程逻辑结构?答:GAL、CPLD之类都是基于乘积项的可编程结构;即包含有可编程与阵列和固定的或阵列的PAL(可编程阵列逻辑)器件构成。 什么是基于查找表的可编程逻辑结构?答:FPGA(现场可编程门阵列)是基于查找表的可编程逻辑结构。 2-3 FPGA系列器件中的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,xx0,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译码器设计(条件赋值语句实现) 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 WITH CONV_INTEGER(DIN) SELECT 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 PROCESS; END behave; 解(3):if_else语句 --3-5 3到8译码器设计(if_else语句实现) 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 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; 3-8 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 --解:3-8 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY org_patch IS PORT( org_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--原码输入 patch_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--补码输出 END CASE; END PROCESS; END behave; 3-10 利用if语句设计一个3位二进制数A[2..0]、B[2..0]的比较器电路。对于比较(AB)、(A=B)的结果分别给出输出信号LT=1、GT=1、EQ=1。 --3-10 利用if语句设计一个3位二进制数A[2..0]、B[2..0]的比较器电路。 --对于比较(AB)、(A=B)的结果分别给出输出信号LT=1、GT=1、EQ=1。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COMP IS PORT( A,B: IN STD_LOGIC_VECTOR(2 DOWNTO 0); --两个3位输入 LT: OUT STD_LOGIC; --小于输出 GT: OUT STD_LOGIC; --大于输出 EQ: OUT STD_LOGIC); --等于输出 END ENTITY COMP; ARCHITECTURE ONE OF COMP IS BEGIN PROCESS(A,B) BEGIN IF (AB) THEN GT<='1';ELSE GT<='0';END IF; IF (A=B) THEN EQ<='1';ELSE EQ<='0';END IF; END PROCESS; -- LT <= (AB); --大于 -- EQ <= (A=B); --等于 END ARCHITECTURE ONE; 3-11 利用8个全加器,可以构成一个8位加法器。利用循环语句来实现这项设计。并以此项设计为例,使用GENERIC参数传递的功能,设计一个32位加法器。 --3-11 利用GENERIC参数和循环语句将8个全加器构成成8位加法器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY ADDER8B IS GENERIC(S: INTEGER:=8); --定义参数S为整数类型,且等于4 PORT(A,B: IN STD_LOGIC_VECTOR(S-1 DOWNTO 0); CIN: IN STD_LOGIC; SUM: OUT STD_LOGIC_VECTOR(S-1 DOWNTO 0); COUT: OUT STD_LOGIC); END ENTITY ADDER8B; ARCHITECTURE ONE OF ADDER8B IS BEGIN PROCESS(A,B,CIN) VARIABLE S1: STD_LOGIC_VECTOR(S-1 DOWNTO 0); VARIABLE C1: STD_LOGIC;--_VECTOR(S DOWNTO 0); BEGIN C1:=CIN; --C1(0):=CIN; FOR i IN 1 TO S LOOP IF A(i-1)='1' XOR B(i-1)='1' XOR C1='1' THEN S1(i-1):='1'; ELSE S1(i-1):='0'; END IF; IF (A(i-1)='1' AND B(i-1)='1')OR(A(i-1)='1' AND C1='1')OR(B(i-1)='1' AND C1='1')OR(A(i-1)='1' AND B(i-1)='1' AND C1='1') THEN C1:='1'; ELSE C1:='0'; END IF; END LOOP; SUM<=S1;COUT<=C1; END PROCESS; END ARCHITECTURE ONE; 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]补码) LIBRARY IEEE; --待例化元件 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_arith.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY SUB2BCD IS PORT(a,b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); diff: out STD_LOGIC_VECTOR(7 DOWNTO 0); sout: OUT STD_LOGIC); END SUB2BCD; ARCHITECTURE behave OF SUB2BCD IS BEGIN PROCESS(a,b) VARIABLE cc: STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF a "1001" THEN cc:=cc+"00000110";END IF; IF cc(7 DOWNTO 4) > "1001" THEN cc:=cc+"01100000";END IF; cc:=a+cc; IF cc(3 DOWNTO 0) > "1001" THEN cc:=cc+"00000110";END IF; IF cc(7 DOWNTO 4) > "1001" THEN cc:=cc+"01100000";END IF; IF a "1001" THEN cc:=cc+"00000110";END IF; IF cc(7 DOWNTO 4) > "1001" THEN cc:=cc+"01100000";END IF; END IF; diff<=cc; END PROCESS; END behave; 3-13 设计一个4位乘法器,为此首先设计一个加法器,用例化语句调用这个加法器,用移位相加的方式完成乘法。并以此项设计为基础,使用GENERIC参数传递的功能,设计一个16位乘法器。 --3-13 4位移位相加型乘法器设计(例化调用加法器) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MULT4B IS GENERIC( S: INTEGER:=4); --定义参数S为整数类型,且等于4 PORT( R: OUT STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); A,B: IN STD_LOGIC_VECTOR(S-1 DOWNTO 0)); END ENTITY MULT4B; ARCHITECTURE ONE OF MULT4B IS COMPONENT addern IS PORT(a,b: IN STD_LOGIC_VECTOR; result: out STD_LOGIC_VECTOR); END COMPONENT; SIGNAL A0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); SIGNAL RR3,RR2,RR1,RR0,ZZ1,ZZ0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); BEGIN A0<=CONV_STD_LOGIC_VECTOR(0,S) & A; PROCESS(A,B) BEGIN IF(B(0)='1')THEN RR0<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 0);ELSE RR0<=(OTHERS=>'0');END IF; IF(B(1)='1')THEN RR1<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 1);ELSE RR1<=(OTHERS=>'0');END IF; IF(B(2)='1')THEN RR2<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 2);ELSE RR2<=(OTHERS=>'0');END IF; IF(B(3)='1')THEN RR3<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 3);ELSE RR3<=(OTHERS=>'0');END IF; END PROCESS; u0: addern PORT MAP(a=>RR0,b=>RR1,result=>ZZ0); u1: addern PORT MAP(a=>ZZ0,b=>RR2,result=>ZZ1); u2: addern PORT MAP(a=>ZZ1,b=>RR3,result=>R); END ARCHITECTURE ONE; --3-13a 16位乘法器(通过底层3-13_MULTSB和顶层GENERIC参数和传递例化语句实现) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MULT16B IS PORT(D1,D2: IN STD_LOGIC_VECTOR(15 DOWNTO 0); Q: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); ARCHITECTURE BHV OF MULT16B IS COMPONENT MULTSB --MULTS8模块的调用声明 GENERIC(S: integer); --照抄MULTSB实体中关于参数“端口”定义的语句 PORT(R: OUT std_logic_vector(2*S-1 DOWNTO 0); A,B: IN std_logic_vector(S-1 DOWNTO 0)); END COMPONENT ; BEGIN u1: MULTSB GENERIC MAP(S=>16) PORT MAP(R=>Q,A=>D1,B=>D2); 3-14 用循环语句设计一个7人投票表决器。 --解:3-14 用循环语句设计一个7人投票表决器,及一个4位4输出最大数值检测电路。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY vote_7 IS PORT( DIN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);--7位表决输入(1:同意,0:不同意) G_4: OUT STD_LOGIC; --超过半数指示 CNTH: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--表决结果统计数 END vote_7; ARCHITECTURE BHV OF vote_7 IS BEGIN PROCESS(DIN) VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN Q:="000"; FOR n IN 0 TO 6 LOOP -- n是LOOP的循环变量 IF(DIN(n)='1') THEN Q:=Q+1; END IF; END LOOP; CNTH<=Q; IF Q>=4 THEN G_4<='1'; ELSE G_4<='0'; END IF; END PROCESS; END BHV; 3-15 设计一个4位4输入最大数值检测电路。 C1='1')OR(A(i-1)='1' AND B(i-1)='1' AND C1='1') THEN C1:='1'; ELSE C1:='0'; END IF; END LOOP; SUM<=S1;COUT<=C1; AA<=TO_STDLOGICVECTOR(TO_BITVECTOR("0000"&S1) SLL 4); BB<=TO_STDLOGICVECTOR(TO_BITVECTOR("0000"&S1) SRL 4); END PROCESS; END ARCHITECTURE ONE; 3-17 举例说明GENERIC说明语句(在实体定义语句中定义类属常数)和GENERIC映射语句(在例化语句中将类属常数赋予新值)有何用处。P82 3-18 表达式C<=A+B中,A、B和C的数据类型都是STD_LOGIC_VECTOR,是否能直接进行加法运算?说明原因和解决方法。能(第一种将A、B转换成整型数相加结果再转换成逻辑位矢后送C P89;第二种使用USE IEEE.SDT_LOGIC_UNSIGNED.ALL语句打开重载运算符程序包。 P70,P130) 3-19 VHDL中有哪三种数据对象?详细说明它们的功能特点以及使用方法,举例说明数据对象与数据类型的关系。信号,变量,常量 P71 3-20 能把任意一种进制的值向一整数类型的数据对象赋值吗?如果能,怎样做? 能(若A,B,C,D是信号整数类型,A<=16#df#;B<=8#23#;C<=2#01#;D<=10)P83 3-21 回答有关BIT和BOOLEAN数据类型的问题:P59 (1)解释BIT(?0?;?1?)和BOOLEAN(“TRUE”,“FALSE”)类型的区别。 (2)对于逻辑操作应使用哪种类型?BIT (3)关系操作的结果为哪种类型? BOOLEAN (4)IF语句测试的表达式是哪种类型? BOOLEAN 3-22 用两种方法设计8位比较器,比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是D、E、F。当A=B时D=1;当A>B时E=1;当A方案
是常规的比较器设计方法,即直接利用关系操作符进行编程设计;第二种设计方案是利用减法器来完成,通过减法运算后的符号和结果来判别两个被比较值的大小。对两种设计方案的资源耗用情况进行比较,并给以解释。 --3-22 比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是EQ、GT、F。当A=B时EQ=1;当A>B时GT=1;当AB) THEN GT<='1';ELSE GT<='0';END IF; IF (A=B) THEN EQ<='1';ELSE EQ<='0';END IF; END PROCESS; END ARCHITECTURE ONE; --3-22 比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是EQ、GT、F。当A=B时EQ=1;当A>B时GT=1;当AX0,b=>X1,s=>S0,y=>N0); u2: mux21a PORT MAP(a=>X2,b=>X3,s=>S0,y=>N1); u3: mux21a PORT MAP(a=>N0,b=>N1,s=>S1,y=>OUTY); --解2:单层结构mux41a.vhd程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41a IS PORT(x1,x2,x3,x4,s0,s1: IN STD_LOGIC; y: OUT STD_LOGIC); END ENTITY mux41a; ARCHITECTURE one OF mux41a IS signal N0,N1: STD_LOGIC; BEGIN com1: PROCESS(x1,x2,s0) BEGIN IF s0='0' THEN N0<=x1; N0<=x2; END IF; END PROCESS; com2: PROCESS(x3,x4,s0) BEGIN IF s0='0' THEN N1<=x3; N1<=x4; END IF; END PROCESS; com3: PROCESS(N0,N1,s1) BEGIN IF s1='0' THEN y<=N0; y<=N1; END IF; END PROCESS; END ARCHITECTURE one; 4 习 题 4-1 归纳利用Quartus II进行VHDL文本输入设计的流程:从文件输入一直到硬件功能测试。P96~P110 答:1 建立工作库文件夹和编辑设计文件;2 创建工程;3 编译前设置;4 全程编译;5 时序仿真;6 引脚锁定;7 配置文件下载;8 打开SignalTap II编辑窗口;9 调入SignalTap II的待测信号;10 SignalTap II参数设置;11 SignalTap II参数设置文件存盘;12 带有SignalTap II测试信息的编译下载;13 启动SignalTap II进行采样与分析;14 SignalTap II的其他设置和控制方法。 Double-click the To cell, click the arrow that appears on the right side of the cell, and click Select Assignment Group to enter an existing assignment group name. 4. To specify an assignment source, repeat step 3 to specify the source name in the From cell. 5. In the spreadsheet, double-click the Assignment Name cell and select the timing assignment you wish to make. 6. For assignments that require a value, double-click the Value cell and type or select the appropriate assignment value. 1. On the Assignments menu, click Settings. 2. In the Category list, double-click Timing Analysis Settings. 3. Click Timing Analyzer Reporting. 4. To specify the range of timing analysis information reported, specify one or more options in the Timing Analyzer Reporting page. 5. Click OK. (2)说明其中的Compilation Process的功能和使用方法。 Compilation Process Settings Page (Settings Dialog Box) Allows you to direct the Compiler to use smart compilation, save synthesis results for the current design's top-level entity, disable the OpenCore Plus hardware evaluation feature, or export version-compatible database files. You can also control the amount of disk space used for compilation. Use Smart compilation: Preserve fewer node names to save disk space: Run Assembler during compilation: Save a node-level netlist of the entire design into a persistent source file: Export version-compatible database: Display entity name for node name: Disable OpenCore Plus hardware evaluation feature: (3)说明Analysis&Synthesis Setting的功能和使用方法,以及其中的Synthesis Netlist Optimization的功能和使用方法。 Analysis & Synthesis Settings Page (Settings Dialog Box) Allows you to specify options for logic synthesis. Create debugging nodes for IP cores: More Settings: Other options: Message Level: Advanced: Synthesis Netlist Optimizations Page (Settings Dialog Box) Specifies the following options for optimizing netlists during synthesis: Perform WYSIWYG primitive resynthesis: Perform gate-level register retiming: Allow register retiming to trade off Tsu/Tco with Fmax: 4-3 概述Assignments菜单中Assignment Editor的功能,举例说明。 About the Assignment Editor User Interface and Functionality: Customizing the User Interface: Pin Information: LogicLock Assignments: Assignment Validation and Output: Integration with the Pin Planner: 4-4 全程编译主要包括哪几个功能模块?这些功能模块各有什么作用?P99~101 4-5 有哪三种引脚锁定的方法?详细说明这三种方法的使用流程和注意事项,并说明它们各自的特点。提示,第三种方法是选择Assignments中的Pins对话框,进行引脚设置。P103~105 4-6 详细说明通过JTAG口对FPGA的配置Flash EPCS器件的间接编程方法和流程。P106~107 4-7 对第3章的习题3-13和习题3-14的设计结果,用本章介绍的方法,分别在QuartusⅡ上进行仿真,验证其正确性;然后在EP3C55芯片中进行硬件测试和验证。 --3-13 4位移位相加型乘法器设计(例化调用加法器) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MULT4B IS GENERIC( S: INTEGER:=4); --定义参数S为整数类型,且等于4 PORT( R: OUT STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); A,B: IN STD_LOGIC_VECTOR(S-1 DOWNTO 0)); END ENTITY MULT4B; ARCHITECTURE ONE OF MULT4B IS COMPONENT addern IS PORT(a,b: IN STD_LOGIC_VECTOR; result: out STD_LOGIC_VECTOR); END COMPONENT; SIGNAL A0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); SIGNAL RR3,RR2,RR1,RR0,ZZ1,ZZ0: STD_LOGIC_VECTOR(2*S-1 DOWNTO 0); BEGIN A0<=CONV_STD_LOGIC_VECTOR(0,S) & A; PROCESS(A,B) BEGIN IF(B(0)='1')THEN RR0<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 0);ELSE RR0<=(OTHERS=>'0');END IF; IF(B(1)='1')THEN RR1<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 1);ELSE RR1<=(OTHERS=>'0');END IF; IF(B(2)='1')THEN RR2<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 2);ELSE RR2<=(OTHERS=>'0');END IF; IF(B(3)='1')THEN RR3<=TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL 3);ELSE RR3<=(OTHERS=>'0');END IF; END PROCESS; u0: addern PORT MAP(a=>RR0,b=>RR1,result=>ZZ0); u1: addern PORT MAP(a=>ZZ0,b=>RR2,result=>ZZ1); u2: addern PORT MAP(a=>ZZ1,b=>RR3,result=>R); END ARCHITECTURE ONE; --解:3-14 用循环语句设计一个7人投票表决器,及一个4位4输出最大数值检测电路。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY vote_7 IS PORT( DIN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);--7位表决输入(1:同意,0:不同意) G_4: OUT STD_LOGIC; --超过半数指示 CNTH: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--表决结果统计数 END vote_7; ARCHITECTURE BHV OF vote_7 IS BEGIN PROCESS(DIN) VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN Q:="000"; FOR n IN 0 TO 6 LOOP -- n是LOOP的循环变量 IF(DIN(n)='1') THEN Q:=Q+1; END IF; END LOOP; CNTH<=Q; IF Q>=4 THEN G_4<='1'; ELSE G_4<='0'; END IF; END PROCESS; END BHV; 4-8 如果对于一个设计项目,如全加器进行全程编译,假设已将信号端口cout和sum分别锁定于引脚Dl和K22,编译后发现Quartus II给出编译报错:“Can't place multiple pins assigned to pin Location Pin D1(或K22)”,试问,问题出在哪里?如何解决?P99 提示:考虑可能这些引脚具有双功能。选择图4-5所示窗口中的双目标端口设置页,如将nCEO原来的“Use as programming pin”改为“Use as regular I/O”。这样可以将此端口也作普通I/O口来用。 4-9 用74148(8-3线八进位优先编码器)和与非门实现8421BCD优先编码器。用3片74139(2线-4线译码器)组成一个5-24线译码器。 解:用74148(8-3线八进位优先编码器)和与非门实现8421BCD优先编码器。 解:用3片74139(2线-4线译码器)组成一个5-24线译码器。 4-10 用74283(4位二进制全加器)加法器和逻辑门设计实现一位8421BCD码加法器电路,输入输出均是BCD码,CI为低位的进位信号,CO为高位的进位信号,输入为两个1位十进制数A,输出用S表示。(化简) 解:用74283(4位二进制全加器)加法器和逻辑门设计实现一位8421BCD码加法器电路。 解:用74283(4位二进制全加器)加法器和逻辑门设计实现一位8421BCD码加法器电路(化简)。 4-11 用原理图输入方式设计一个7人表决电路(用4位二进制全加器),参加表决者7人,同意为1,不同意为0,同意者过半则表决通过,绿指示灯亮;表决不通过则红指示灯亮。 解:用原理图输入方式设计一个7人表决电路 4-12 在本章示例中,或自主选择一个示例,使用keep属性,说明keep属性应用的好处。P112 --解1:5-1【例5-4】含异步复位和时钟使能的D触发器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF1 IS PORT(CLK,RST,EN,D: IN STD_LOGIC; Q: OUT STD_LOGIC); ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS (CLK,Q1,RST,EN) BEGIN IF RST='1' THEN Q1<='0'; ELSIF CLK'EVENT AND CLK='1' THEN IF EN='1' THEN Q1<=D; END IF; END IF; END PROCESS; Q<=Q1; --将内部的暂存数据向端口输出 END bhv; --解2:5-1【5-5】含同步复位控制的D触发器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF1 IS PORT(CLK,RST,D: IN STD_LOGIC; Q: OUT STD_LOGIC); ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS(CLK,Q1,RST) BEGIN IF CLK'EVENT AND CLK='1' THEN IF RST='1' THEN Q1<='0';ELSE Q1<=D;END IF; END IF; END PROCESS; Q<=Q1; --将内部的暂存数据向端口输出 END bhv; 5-2 举例(【例5-1】)说明,为什么使用条件叙述不完整的条件句能导致产生时序模块的综合结果。 由于不完整条件句具有对输出信号不做处理(即保持现状)的行为,而导致时序电路综合结果。(P121) --解:5-2【例5-1】D触发器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF1 IS PORT(CLK: IN STD_LOGIC; D: IN STD_LOGIC; Q:OUT STD_LOGIC); ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS(CLK,Q1) BEGIN IF CLK'EVENT AND CLK='1' --上升沿触发锁存 THEN Q1<=D; END IF; END PROCESS; Q<=Q1; --将内部的暂存数据向端口输出 END bhv; 5-3 设计一个具有同步置1,异步清0的D触发器。 --5-3 设计一个具有同步置1,异步清0的D触发器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF1 IS PORT(CLK,RST,SET,D: IN STD_LOGIC; Q: OUT STD_LOGIC); ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS (CLK,Q1,RST,SET) BEGIN IF RST='1' THEN Q1<='0'; ELSIF CLK'EVENT AND CLK='1' THEN IF SET='1' THEN Q1<='1'; ELSE Q1<=D; END IF; END IF; END PROCESS; Q<=Q1; --将内部的暂存数据向端口输出 END bhv; 5-4 把例5-15(异步复位和同步加载十进制加法计数器)改写成一异步清0,同步时钟使能和异步数据加载型8位二进制加法计数器。 --5-4 异步清0,同步时钟使能和异步数据加载型8位二进制加法计数器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT(CLK,RST,EN,LOAD : IN STD_LOGIC; DATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数 DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出 COUT : OUT STD_LOGIC); --计数进位输出 END CNT10; ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK,RST,EN,LOAD) VARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST='0' THEN Q:=(OTHERS =>'0'); --计数器异步复位 ELSIF LOAD='0' THEN Q:=DATA; --允许加载 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN='1' THEN --检测是否允许计数或加载(同步使能) IF Q<9 THEN Q:=Q+1; --允许计数,检测是否小于9 ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零 END IF; END IF; END IF; IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT<='0'; END IF; DOUT<=Q; --将计数值向端口输出 END PROCESS; END behav; 5-5 试对习题5-4的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16(4)位二进制数计数器,即一个l6(4)位可控的分频器,并说明工作原理。设输入频率fi=4MHz,输出频率f0=(516.5±1)Hz(允许误差±0.1Hz),求16位加载数值。 --5-5 试对习题5-4的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起, --构成一个自动加载型16(4)位二进制数计数器,即一个l6(4)位可控的分频器,并说明工作原理。 --设输入频率fi=4MHz,输出频率f0=(516.5±1)Hz(允许误差±0.1Hz),求16位加载数值。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT(CLK,RST,EN : IN STD_LOGIC; DATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数 DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出 COUT : BUFFER STD_LOGIC); --计数进位输出 END CNT10; ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK,RST,EN,COUT) VARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0); --SIGNAL BEGIN IF RST='0' THEN Q:=(OTHERS =>'0'); --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN='1' THEN --检测是否允许计数或加载(同步使能) IF COUT='1' THEN Q:=DATA; --允许加载 IF Q<9 THEN Q:=Q+1; --允许计数,检测是否小于9 ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零 END IF; END IF; END IF; END IF; IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT<='0'; END IF; DOUT<=Q; --将计数值向端口输出 END PROCESS; END behav; 5-6 分别给出RTL图(图5-19和图5-19)的VHDL描述,注意其中的D触发器和锁存器的表述。 图5-18 RTL图1 --解1:图5-18 RTL图的VHDL程序mux21a.vhd底层设计描述。 -- 用WHEN_ELSE实现2选1多路选择器程序(mux21a.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21a IS PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN 图5-19 RTL图2 --解1:实现图5-19 RTL图的VHDL程序mux21a.vhd底层设计描述 -- 用WHEN_ELSE实现2选1多路选择器程序(mux21a.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21a IS PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN y<=a WHEN s='0' ELSE b; END ARCHITECTURE one; --解2:实现图5-19 RTL图的VHDL程序DFF_PRE_CLR.vhd顶层设计描述 -- 带预置、清零和输出使能的上升沿D触发器程序(DFF_PRE_CLR.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF_PRE_CLR_ENA IS PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); ARCHITECTURE bhv OF DFF_PRE_CLR_ENA IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS(CLK,D,Q1,ENA,PRE,CLR) BEGIN IF CLR='1' THEN Q1<='0'; ELSIF PRE='1' THEN Q1<='1'; ELSIF CLK'EVENT AND CLK='1' AND ENA='1' THEN Q1<=D; END IF; --IF EN='1' THEN Q<=Q1; --将内部的暂存数据向端口输出 --END IF; Q<=Q1; --将内部的暂存数据向端口输出 END PROCESS; END bhv; -- 5-6 给出图5-19 RTL图的VHDL描述。 --解3:实现图5-19 RTL图的VHDL程序T5_19.vhd顶层设计描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY T5_19 IS PORT(RST,D,CLK : IN STD_LOGIC; Q,DOUT : OUT STD_LOGIC); END ENTITY T5_19; ARCHITECTURE one OF T5_19 IS COMPONENT DFF_PRE_CLR_ENA --调用D触发器声明语句 PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END COMPONENT; COMPONENT mux21a --调用D触发器声明语句 PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END COMPONENT; SIGNAL DD,DDD: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN u1: mux21a PORT MAP(D,'0',RST,DD); DDD<=D XOR DD; u2: DFF_PRE_CLR_ENA PORT MAP(CLK,DDD,DOUT,'1','0','0'); u3: DFF_PRE_CLR_ENA PORT MAP(CLK,DD,Q,'1','0','0'); END ARCHITECTURE one; 5-7 用VHDL设计一个功能类似74LS160(异步复位和同步使能加载的十进制加法计数器)的计数器。 --5-7 用VHDL设计一个功能类似74LS160(异步复位和同步使能加载、计数的十进制加法计数器)的计数器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT(CLK,RST,EN,LOAD : IN STD_LOGIC; DATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数 DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出 COUT : OUT STD_LOGIC); --计数进位输出 END CNT10; ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK,RST,EN,LOAD) VARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST='0' THEN Q:=(OTHERS =>'0'); --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN='1' THEN --检测是否允许计数或加载(同步使能) IF LOAD='0' THEN Q:=DATA; --允许加载 IF Q<9 THEN Q:=Q+1; --允许计数,检测是否小于9 ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零 END IF; END IF; END IF; END IF; IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT<='0'; END IF; DOUT<=Q; --将计数值向端口输出 END PROCESS; END behav; 5-8 给出含有异步清0和计数使能的16位二进制加减可控计数器的VHDL描述。 --解:5-8 给出含有异步清零和计数使能的16位二进制加减可控计数器(带预置数)的VHDL描述。 -- 用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADD_SUB_LOAD_16 IS PORT (CLK,RST,ADD_EN,SUB_EN,LOAD : IN STD_LOGIC; DATA : IN STD_LOGIC_VECTOR(15 DOWNTO 0) ; CQ : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) ; COUT : OUT STD_LOGIC); END ENTITY ADD_SUB_LOAD_16; ARCHITECTURE A_S_16 OF ADD_SUB_LOAD_16 IS BEGIN PROCESS(CLK,RST,ADD_EN,SUB_EN,LOAD) VARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0); --VARIABLE LS_LOAD : STD_LOGIC; BEGIN --LS_LOAD:=LOAD; IF RST = '1' THEN CQI:=(OTHERS => '0');--计数器异步复位 ELSIF LOAD = '1' THEN CQI:=DATA; --LS_LOAD:='0'; --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF ADD_EN='1'THEN --检测是否允许计数(同步他能) IF CQI<16#FFFF# THEN CQI:=CQI+1; --允许计数,检测是否小于65535 ELSE CQI:=(OTHERS => '0'); --大于65535,计数值清零 END IF; IF CQI=16#FFFF# THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT <= '0'; END IF; END IF; IF SUB_EN='1'THEN --检测是否允许计数(同步他能) IF CQI>0 THEN CQI:=CQI-1; --允许计数,检测是否小于65535 ELSE CQI:=(OTHERS => '1'); --大于65535,计数值清零 END IF; IF CQI=0 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT <= '0'; END IF; END IF; END IF; CQ<=CQI; --将计数值向端口输出 END PROCESS; END ARCHITECTURE A_S_16; 5-9 基于原理图输入方式,用D触发器构成按循环码(000->001->011->111->101->100->000)规律工作的六进制同步计数器。 5-10 基于原理图输入方式,应用4位全加器(74283)和74374(8D触发器)构成4位二进制 5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。当5位输入中1的数目为奇数时,在最后一位的时刻输出1。(同步复位) (异步复位) --解1(同步复位):5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。 -- 当5位输入中1的数目为奇数时,在最后一位的时刻输出1。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY odd_even_p_RXD_5 IS PORT (CLK,RST,S_in: IN STD_LOGIC;--CLK、RST、S_in:时钟、复位、串行输入数据 P_out: OUT STD_LOGIC_VECTOR(4 DOWNTO 0);--P_out:并行输出数据 o_e_out: OUT STD_LOGIC); --o_e_out:奇校验输出位 END ENTITY odd_even_p_RXD_5; ARCHITECTURE one OF odd_even_p_RXD_5 IS BEGIN PROCESS(CLK,RST) VARIABLE shift_Q : STD_LOGIC_VECTOR(4 DOWNTO 0);--shift_Q:移位寄存器 VARIABLE shift_cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);--shift_cnt:移位计数器 BEGIN IF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF RST = '1' THEN shift_cnt:="100"; --移位寄存器和计数器复位 IF shift_cnt=4 THEN --检测到接收5位串行输入数据 shift_cnt:="000"; --移位计数器清零,为接收下一组数据做准备。 P_out<=shift_Q;--接收数据并行输出 o_e_out<=shift_Q(4) XOR shift_Q(3) XOR shift_Q(2) XOR shift_Q(1) XOR shift_Q(0);--奇校验输出 shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入 shift_cnt:=shift_cnt+1;--移位计数 shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入 END IF; END IF; END IF; END PROCESS; END ARCHITECTURE one; --解2(异步复位):5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。 -- 当5位输入中1的数目为奇数时,在最后一位的时刻输出1。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY odd_even_p_RXD_5 IS PORT (CLK,RST,S_in: IN STD_LOGIC;--CLK、RST、S_in:时钟、复位、串行输入数据 P_out : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);--P_out:并行输出数据 o_e_out : OUT STD_LOGIC); --o_e_out:奇校验输出位 END ENTITY odd_even_p_RXD_5; ARCHITECTURE one OF odd_even_p_RXD_5 IS BEGIN PROCESS(CLK,RST) VARIABLE shift_Q : STD_LOGIC_VECTOR(4 DOWNTO 0);--shift_Q:移位寄存器 VARIABLE shift_cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);--shift_cnt:移位计数器 BEGIN IF RST = '1' THEN shift_cnt:="011"; --移位寄存器和计数器复位 IF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF shift_cnt=4 THEN --检测到接收5位串行输入数据 shift_cnt:="000"; --移位计数器清零,为接收下一组数据做准备。 P_out<=shift_Q;--接收数据并行输出 o_e_out<=shift_Q(4) XOR shift_Q(3) XOR shift_Q(2) XOR shift_Q(1) XOR shift_Q(0);--奇校验输出 shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入 shift_cnt:=shift_cnt+1;--移位计数 shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入 END IF; END IF; END IF; END PROCESS; END ARCHITECTURE one; 5-13 基于原理图输入方式,用7490(十进制计数器)设计模为872的计数器,且输出个位、十位、百位都应符合8421码权重。 5-14 基于原理图输入方式,用74194、74273、D触发器等器件组成8位串入并出的转换电路,要求在转换过程中数据不变,只有当8位一组数据全部转换结束后,输出才变化一次。(QII下波形仿真 6 习 题 6-1 归纳利用QuartusII进行VHDL文本输入设计的流程:从文件输入一直到SignalTap II测试。P146~P152 6-2 如何为设计中的SignalTap II加入独立采用时钟?试给出完整的程序和对它的实测结果。 P151~P152 ARCHITECTURE ONE OF xxx IS attribute chip_pin of CLK0:signal is”G2 1”; --逻辑分析仪采样时钟 6-3 根据6.6.2节的内容完成Quartus II与Synplify的接口,并通过实测证实在编译中 Quartus II调用了Synplify综合器。 P159~P161 7 习 题 7-1. 如果不使用MegaWizard Plug-In Manager工具,如何在自己的设计中调用LPM模块?以计数器lpm_counter为例,写出调用该模块的程序,其中参数自定。 (提示:参考例7-1)P171 --7-1 如果不使用Megawizard Plug_In Manager工具,如何在自已的设计中调用LPM模块? -- 以计数器lpm_counter为例,写出调用该模块的程序,其中参数自定。 -- 答:1.在程序开始部分增加打开"lpm"库和使用"lpm"所有程序包。 -- 答:2.在结构说明描述部分增加调用"lpm"传递参数和端口的申明。 -- 答:3.在结构行为描述部分增加调用"lpm"传递参数和端口的例化。示例如下: -- 答:4.调用计数器lpm_counter(LPM模块)的VHDL程序如下:(SINGT_counter.vhd) LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY lpm; IF RISING_EDGE(CLK) THEN IF WREN='1' THEN --如果时钟有上升沿出现,且写使能为高电平,则 MEM(CONV_INTEGER(A))<=DIN;--RAM数据口的数据被写入指定地址的单元 END IF; END IF; IF(FALLING_EDGE(CLK))THEN --如果时钟有下降沿出现,则 Q<=MEM(CONV_INTEGER(A));--读出存储器中的数据 END IF; END PROCESS; END BHV; --解2:以图7-18代码形式设计 7-3 修改例7-6,用GENERIC语句定义例7-6中的数据线宽和存储单元的深度的参数,再设计一个顶层文件例化例7-6。此顶层文件能将参数传入底层模块例7-6。顶层文件的参数设数据宽度=16,存储深度msize=1024。 --解1:用GENERIC定义DB和AB修改【例7-6】设计双边沿控制读写RAM的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;--此程序包括含转换函数CONV_INTEGERlA) USE IEEE.STD_LOGIC_UNSIGNED.ALL;--此程序包包含算符重载函数 ENTITY RAM7x8 IS GENERIC(D_Bus: integer:=8;A_Bus: integer:=7;MEM_Num: integer:=128;init_file: string:="data7x8.mif"); PORT( CLK: IN STD_LOGIC;--定义时钟 WREN: IN STD_LOGIC;--定义写允许控制 A: IN STD_LOGIC_VECTOR(A_Bus-1 DOWNTO 0);--定义RAM的7位地址输入端口 DIN: IN STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0);--定义RAM的8位数据输入端口 Q:OUT STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0));--定义RAM的8位数据输出端口 END; ARCHITECTURE bhv OF RAM7x8 IS TYPE G_ARRAY IS ARRAY(0 TO MEM_Num-1) OF STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0); SIGNAL MEM: G_ARRAY;--定义信号MEM的数据类型为用户新定义的类型G_ARRAY attribute ram_init_file: string; --定义字符串属性的标识符ram_init_file。 attribute ram_init_file of MEM: SIGNAL IS init_file; --定义标识符ram_init_file是MEM的属性, --并将字符串"data7x8.mif"初始化赋给ram_init_file。 BEGIN PROCESS(CLK) BEGIN IF RISING_EDGE(CLK) THEN IF WREN='1' THEN --如果时钟有上升沿出现,且写使能为高电平,则 MEM(CONV_INTEGER(A))<=DIN;--RAM数据口的数据被写入指定地址的单元 END IF; END IF; IF(FALLING_EDGE(CLK))THEN --如果时钟有下降沿出现,则 Q<=MEM(CONV_INTEGER(A));--读出存储器中的数据 END IF; END PROCESS --解2:用例化调用修改后例7-6生成10位AB和8位DB的RAM LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;--此程序包括含转换函数CONV_INTEGERlA) USE IEEE.STD_LOGIC_UNSIGNED.ALL;--此程序包包含算符重载函数 ENTITY RAM10x8 IS PORT( CLK: IN STD_LOGIC;--定义时钟 WREN: IN STD_LOGIC;--定义写允许控制 A: IN STD_LOGIC_VECTOR(9 DOWNTO 0);--定义RAM的10位地址输入端口 DIN: IN STD_LOGIC_VECTOR(7 DOWNTO 0);--定义RAM的8位数据输入端口 Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--定义RAM的8位数据输出端口 ARCHITECTURE bhv OF RAM10x8 IS COMPONENT RAM7x8 --RAM7x8模块的调用声明 GENERIC(D_Bus: integer;A_Bus: integer;MEM_Num: integer;init_file: string); PORT( CLK: IN STD_LOGIC;--定义时钟 WREN: IN STD_LOGIC;--定义写允许控制 A: IN STD_LOGIC_VECTOR(A_Bus-1 DOWNTO 0);--定义RAM的7位地址输入端口 DIN: IN STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0);--定义RAM的8位数据输入端口 Q:OUT STD_LOGIC_VECTOR(D_Bus-1 DOWNTO 0));--定义RAM的8位数据输出端口 END COMPONENT; BEGIN u1: RAM7x8 GENERIC MAP(D_Bus=>8,A_Bus=>10,MEM_Num=>1024,init_file=>"SIND10X8.mif") PORT MAP(CLK,WREN,A,DIN,Q); END BHV; 7-4 建立一个原理图顶层设计工程,调用LPM_RAM,结构参数与习题7-3相同,初始化文件是hex格式的正弦波数据文件。给出设计的仿真波形。 解:7-4 顶层设计用原理图调用LPM_RAM(结构参数与习题7-3相同 7-5(略)参考Quartus II的Help(Contents),详细说明LPM元件altcam、altsyncram、 LPM_fifo、LPM_shiftreg的使用方法,以及其中各参量的含义和设置方法。 8 习 题 8-1(5-1)什么是固有延时?什么是惯性延时?P225~226 答:固有延时(Inertial Delay)也称为惯性延时,固有延时的主要物理机制是分布电容效应。 8-2(5-4)说明信号和变量的功能特点,以及应用上的异同点。P208~P210 答:变量:变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它做出定义的当前结构。变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时行为。变量的主要作用是在进程中作为临时的数据存储单元。 信号:信号是描述硬件系统的基本数据对象,其性质类似于连接线;可作为设计实体中并行语句模块间的信息交流通道。信号不但可以容纳当前值,也可以保持历史值;与触发器的记忆功能有很好的对应关系。 8-3 从不完整的条件语句产生时序模块的原理看,例8-7和从表面上看都包含不完整条件语句,试说明,为什么它们的综合结果都是组合电路。 P214~P216 答:根据变量具有顺序立即赋值传送特性,例8-7中的不完整条件语句对变量赋值前对变量进行初始值设置;每次敏感信号触发,对变量的赋值,总能产生结果,无保持状态——即输出是输入的函数;因此,只能产生组合逻辑电路;不可能产生时序逻辑电路。 --【例8-7】预设计4选1多路器(通过变量测选择条件,将产生正确结果。) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(i0,i1,i2,i3,a,b: IN STD_LOGIC; q: OUT STD_LOGIC); END mux4; ARCHITECTURE body_mux4 OF mux4 IS BEGIN process(i0,i1,i2,i3,a,b) variable muxval: integer range 7 DOWNTO 0; begin muxval:=0; if (a= '1') then muxval := muxval+1; end if; if (b= '1') then muxval := muxval+2; end if; case muxval is when 0=> q<=i0; when 1=> q<=i1; when 2=> q<=i2; when 3=> q<=i3; when others=>q<='X'; --null; end case; end process; END body_mux4; 8-4 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 --解:8-4 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY org_patch IS PORT( org_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--原码输入 patch_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--补码输出 END org_patch; ARCHITECTURE BHV OF org_patch IS BEGIN PROCESS(org_data) BEGIN IF(org_data(7)='0') THEN patch_data<=org_data; --org_data>=0,补码=原码。 patch_data<=org_data(7)&(not org_data(6 DOWNTO 0))+1;--org_data<0,补码=|原码|取反+1。 END IF; END PROCESS; END BHV; 8-5 设计一个比较电路,当输入的8421BCD码大于5时输出1,否则输出0。 --解:8-5 设计一个比较电路,当输入的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。 cmp_out<='0'; --输入数据小于等于5,比较输出0。 END IF; END PROCESS; END BHV; 8-6 用原理图或VHDL输入方式分别设计一个周期性产生二进制序列01001011001的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。(可预置数11位序列发生器) 解(1):用原理图设计产生01001011001序列 8-7 将例8-11(欲设计4选1三态总线)中的四个IF语句分别用四个并列进程语句表达出来。 --8-7 修改【例8-11】(欲设计4选1三态总线),用4个进程设计4选1通道三态总线(8位)电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY tristate2 IS port(input3,input2,input1,input0 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); enable : IN STD_LOGIC_VECTOR(1 DOWNTO 0); output : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ENTITY tristate2 ; ARCHITECTURE multiple_drivers OF tristate2 IS BEGIN COM3: PROCESS(enable,input3) BEGIN IF enable="00" THEN output<=input3;ELSE output<=(OTHERS=>'Z');END IF; END PROCESS; COM2: PROCESS(enable,input2) BEGIN IF enable="01" THEN output<=input2;ELSE output<=(OTHERS=>'Z');END IF; END PROCESS; COM1: PROCESS(enable,input1) BEGIN IF enable="10" THEN output<=input1;ELSE output<=(OTHERS=>'Z');END IF; END PROCESS; COM0: PROCESS(enable,input0) BEGIN IF enable="11" THEN output<=input0;ELSE output<=(OTHERS=>'Z');END IF; END PROCESS; END ARCHITECTURE multiple_drivers; 10 习 题 10-1 举二例说明,有哪些常用时序电路是状态机比较典型的特殊形式,并说明它们属于什么类型的状态机(编码类型、时序类型和结构类型)。(提示:二进制计数器、“00000001”左循环移位寄存器) 解:1)二进制计数器、循环移位寄存器。 2)二进制计数器:Moore型状态机;顺序编码;状态编码直接输出。 3)“00000001”左循环移位寄存器:Moore型状态机;一位热码;状态编码直接输出。 --(1)计数器:Moore型状态机;顺序编码;状态编码直接输出。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNT IS PORT(CLK: IN STD_LOGIC; Q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT: OUT STD_LOGIC); END COUNT; ARCHITECTURE behav OF COUNT IS type STATE is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15); type arr_STATE is array(STATE) of STD_LOGIC_VECTOR(3 DOWNTO 0); constant val_arr_STATE: arr_STATE:=("0000","0001","0010","0011","0100","0101","0110","0111", "1000","1001","1010","1011","1100","1101","1110","1111"); SIGNAL cs: STATE; BEGIN PROCESS(cs) BEGIN --时序组合主控进程,次态转换 IF CLK'EVENT AND CLK='1' THEN CASE cs IS WHEN s0 => cs<=s1; WHEN s1 => cs<=s2; WHEN s2 => cs<=s3; WHEN s3 => cs<=s4; WHEN s4 => cs<=s5; WHEN s5 => cs<=s6; WHEN s6 => cs<=s7; WHEN s7 => cs<=s8; WHEN s8 => cs<=s9; WHEN s9 => cs<=s10; WHEN s10=> cs<=s11; WHEN s11=> cs<=s12; WHEN s12=> cs<=s13; WHEN s13=> cs<=s14; WHEN s14=> cs<=s15; WHEN s15=> cs<=s0; WHEN OTHERS=> cs<=s0; END CASE; END IF; IF cs=s15 then COUT<='1'; else COUT<='0'; END IF; END PROCESS; Q<=val_arr_STATE(cs); END behav; --(2)"00000001"左循环移位寄存器:Moore型状态机;一位热码;状态编码直接输出。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY LEFT_SHIFT IS PORT(CLK: IN STD_LOGIC; Q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); Cy: OUT STD_LOGIC); END LEFT_SHIFT; ARCHITECTURE behav OF LEFT_SHIFT IS type STATE is(s0,s1,s2,s3,s4,s5,s6,s7); type arr_STATE is array(STATE) of STD_LOGIC_VECTOR(7 DOWNTO 0); constant val_arr_STATE: arr_STATE:=("00000001","00000010","00000100","00001000", "00010000","00100000","01000000","10000000"); SIGNAL cs: STATE; BEGIN PROCESS(cs) BEGIN --时序组合主控进程,次态转换 IF CLK'EVENT AND CLK='1' THEN CASE cs IS WHEN s0 => cs<=s1; WHEN s1 => cs<=s2; WHEN s2 => cs<=s3; WHEN s3 => cs<=s4; WHEN s4 => cs<=s5; WHEN s5 => cs<=s6; WHEN s6 => cs<=s7; WHEN s7 => cs<=s0; WHEN OTHERS=> cs<=s0; END CASE; END IF; END PROCESS; Q<=val_arr_STATE(cs); Cy<=val_arr_STATE(cs)(7); END behav; 10-2 修改例10-1,将其主控组合进程分解为两个进程,一个负责状态转换,另一个负责输出控制信号。 --10-2 修改例10-1,将其主控组合进程分解为两个进程,一个负责状态转换,另一个负责输出控制信号。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY s_machine IS PORT(clk,reset : IN STD_LOGIC;--主控时序进程时钟驱动和复位信号 state_inputs : IN STD_LOGIC_VECTOR (0 TO 1);--外部输入信号 comb_outputs :OUT INTEGER RANGE 0 TO 15 ); --对外输出信号 END s_machine; ARCHITECTURE behv OF s_machine IS TYPE FSM_ST IS (s0, s1, s2, s3); --数据类型定义,状态符号化 SIGNAL c_st, next_state: FSM_ST;--将现态和次态定义为新的数据类型 BEGIN REG: PROCESS (reset,clk) BEGIN IF reset ='0' THEN c_st <= s0;--检测异步复位信号 ELSIF clk='1' AND clk'EVENT THEN c_st <= next_state; END IF; END PROCESS; COM1: PROCESS(c_st, state_Inputs)--主控组合进程(现态和外部输入为敏感信号) BEGIN CASE c_st IS WHEN s0 => IF state_inputs = "00" THEN next_state<=s0; --输入为“00”,在s0踏步 ELSE next_state<=s1;END IF;--否则进入s1 WHEN s1 => IF state_inputs = "00" THEN next_state<=s1; --输入为“00”,在s1踏步 ELSE next_state<=s2;END IF; --否则进入s2 WHEN s2 => IF state_inputs = "11" THEN next_state<=s0; --输入为“11”,进入s0 ELSE next_state<=s3;END IF; --否则进入s3 WHEN s3 => IF state_inputs = "11" THEN next_state<=s3; --输入为“11”,在s3踏步 ELSE next_state<=s0;END IF; --否则返回s0 END case; END PROCESS; COM2: PROCESS(c_st, state_Inputs)--主控组合进程(现态和外部输入为敏感信号) BEGIN CASE c_st IS WHEN s0 => comb_outputs<= 5; --现态为s0时,对外输出命令信号5编码 WHEN s1 => comb_outputs<= 8; --现态为s1时,对外输出命令信号8编码 WHEN s2 => comb_outputs<= 12; --现态为s2时,对外输出命令信号12编码 WHEN s3 => comb_outputs<= 14; --现态为s3时,对外输出命令信号14编码 END case; END PROCESS; END behv; 10-3 改写例10-1,用宏定义语句定义状态变量,给出仿真波形(含状态变量),与图10-3作比较。注意设置适当的状态机约束条件。 --10-3 改写例10-1,用宏定义语句定义状态变量,给出仿真波形(含状态变量),与图10-3作比较。注意设置适当的状态机约束条件。 LIBRARY IEEE; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADC0809 IS PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据 CLK: IN STD_LOGIC; --状态机工作时钟 RST: IN STD_LOGIC; --系统复位控制 EOC: IN STD_LOGIC; --转换状态指示,低电平表示正在转换 ALE:OUT STD_LOGIC; --8个模拟信号通道地址锁存信号 START:OUT STD_LOGIC; --转换开始信号 OE:OUT STD_LOGIC; --数据输出三态控制信号 ADDA:OUT STD_LOGIC; --信号通道最低位控制信号 --LOCK_T:OUT STD_LOGIC; --观察数据锁存时钟 Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --8位数据输出 END ADC0809; ARCHITECTURE behav OF ADC0809 IS TYPE states IS(s0,s1,s2,s3,s4); --定义各状态子类型 SIGNAL cs,next_state: states:=s0; SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK: STD_LOGIC;--转换后数据输出锁存时钟信号 attribute keep : boolean; attribute keep of LOCK : signal is true; BEGIN ADDA<='0';--当ADDA<='0',选择模拟信号通道IN0;当ADDA<='1',则选择通道IN1 --LOCK_T<=LOCK; COM: PROCESS(cs,EOC) BEGIN --规定各状态转换方式 CASE cs IS WHEN s0=> ALE<='0';START<='0';OE<='0';LOCK<='0';next_state<=s1; --0809初始化 WHEN s1=> ALE<='1';START<='1';OE<='0';LOCK<='0';next_state<=s2 ;--启动采样 WHEN s2=> ALE<='0';START<='0';OE<='0';LOCK<='0'; IF(EOC='1') THEN next_state<=s3; --EOC=1表明转换结束 ELSE next_state<=s2; END IF; --转换未结束,继续等待 WHEN s3=> ALE<='0';START<='0';OE<='1';LOCK<='0';next_state<=s4;--开启OE,输出转换好的数据 WHEN s4=> ALE<='0';START<='0';OE<='1';LOCK<='1';next_state<=s0; WHEN OTHERS=> ALE<='0';START<='0';OE<='0';LOCK<='0';next_state<=s0; END CASE; END PROCESS COM; REG:PROCESS(CLK,RST) BEGIN IF(RST='1') THEN cs<=s0; ELSIF(CLK'EVENT AND CLK='1') THEN cs<=next_state;END IF; END PROCESS REG; --由信号cs将当前状态值带出此进程:REG LATCH1: PROCESS(LOCK) --此进程中,在LOCK的上升沿,将转换好的数据锁入 BEGIN IF LOCK='1' AND LOCK'EVENT THEN REGL<=D;END IF; END PROCESS LATCH1; Q<=REGL; END behav; 10-5 给出例10-3的完整程序。 --10-5 给出例10-3(COM1产生次态和COM2输出命令的3进程状态机)完整程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADC0809 IS PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据 CLK: IN STD_LOGIC; --状态机工作时钟 RST: IN STD_LOGIC; --系统复位控制 EOC: IN STD_LOGIC; --转换状态指示,低电平表示正在转换 ALE:OUT STD_LOGIC; --8个模拟信号通道地址锁存信号 START:OUT STD_LOGIC; --转换开始信号 OE:OUT STD_LOGIC; --数据输出三态控制信号 ADDA:OUT STD_LOGIC; --信号通道最低位控制信号 LOCK_T:OUT STD_LOGIC; --观察数据锁存时钟 Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --8位数据输出 END ADC0809; ARCHITECTURE behav OF ADC0809 IS TYPE states IS(st0,st1,St2,st3,st4); --定义各状态子类型 SIGNAL cs,next_state: states:=st0; SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK: STD_LOGIC;--转换后数据输出锁存时钟信号 BEGIN ADDA<='1';--当ADDA<='0',选择模拟信号通道IN0;当ADDA<='1',则选择通道IN1 LOCK_T<=LOCK; COM1: PROCESS(cs,EOC) BEGIN --译码产生次态 CASE cs IS WHEN st0=> next_state<=st1; --0809初始化 WHEN st1=> next_state<=st2 ;--启动采样 WHEN st2=> IF(EOC='1') THEN next_state<=st3;--EOC=1表明转换结束 ELSE next_state<=st2; END IF; --转换未结束,继续等待 WHEN st3=> next_state<=st4;--开启OE,输出转换好的数据 WHEN st4=> next_state<=st0; WHEN OTHERS=>next_state<=st0; END CASE; END PROCESS COM1; COM2: PROCESS(cs) BEGIN --产生输出命令 CASE cs IS WHEN st0=> ALE<='0';START<='0';LOCK<='0';OE<='0'; WHEN st1=> ALE<='1';START<='1';LOCK<='0';OE<='0'; WHEN st2=> ALE<='0';START<='0';LOCK<='0'; OE<='0'; WHEN st3=> ALE<='0';START<='0';LOCK<='0';OE<='1'; WHEN st4=> ALE<='0';START<='0';LOCK<='1';OE<='1'; WHEN OTHERS=> ALE<='0';START<='0';LOCK<='0'; END CASE; END PROCESS COM2; REG:PROCESS(CLK,RST) BEGIN IF(RST='1') THEN cs<=next_state; ELSIF(CLK'EVENT AND CLK='1') THEN cs<=next_state; END IF; END PROCESS REG; --由信号cs将当前状态值带出此进程:REG LATCH1: PROCESS(LOCK) --此进程中,在LOCK的上升沿,将转换好的数据锁入 BEGIN IF LOCK='1' AND LOCK'EVENT THEN REGL<=D; END IF; END PROCESS LATCH1; Q<=REGL; END behav; 10-6 用Mealy机类型,写出控制ADC0809采样的状态机。 --10-6 用Mealy机类型,写出控制ADC0809采样的状态机。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADC0809 IS PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据 CLK: IN STD_LOGIC; --状态机工作时钟 RST: IN STD_LOGIC; --系统复位控制 EOC: IN STD_LOGIC; --转换状态指示,低电平表示正在转换 ALE:OUT STD_LOGIC; --8个模拟信号通道地址锁存信号 START:OUT STD_LOGIC; --转换开始信号 OE:OUT STD_LOGIC; --数据输出三态控制信号 ADDA:OUT STD_LOGIC; --信号通道最低位控制信号 LOCK_T:OUT STD_LOGIC; --观察数据锁存时钟 Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --8位数据输出 END ADC0809; ARCHITECTURE behav OF ADC0809 IS TYPE states IS(s0,s1,S2,s3,s4); --定义各状态子类型 SIGNAL cs,next_state: states:=s0; SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK: STD_LOGIC;--转换后数据输出锁存时钟信号 BEGIN ADDA<='1';--当ADDA<='0',选择模拟信号通道IN0;当ADDA<='1',则选择通道IN1 LOCK_T<=LOCK; COM: PROCESS(cs,EOC) BEGIN --规定各状态转换方式 CASE cs IS WHEN s0=> ALE<='0';START<='0';LOCK<='0';OE<='0'; next_state<=s1; --0809初始化 WHEN s1=> ALE<='1';START<='1';LOCK<='0';OE<='0'; next_state<=s2 ;--启动采样 WHEN s2=> ALE<='0';START<='0';LOCK<='0'; IF(EOC='1') THEN next_state<=s3;OE<='1';--EOC=1转换结束,OE=1(Mealy型) ELSE next_state<=s2;OE<='0'; END IF; --未结束等待,OE=0(Mealy型) WHEN s3=> ALE<='0';START<='0';LOCK<='0';OE<='1'; next_state<=s4;--开启OE,输出转换好的数据 WHEN s4=> ALE<='0';START<='0';LOCK<='1';OE<='1';next_state<=s0; WHEN OTHERS=>next_state<=s0; END CASE; END PROCESS COM; REG:PROCESS(CLK,RST) BEGIN IF(RST='1') THEN cs<=next_state; ELSIF(CLK'EVENT AND CLK='1') THEN cs<=next_state; END IF; END PROCESS REG; --由信号cs将当前状态值带出此进程:REG LATCH1: PROCESS(LOCK) --此进程中,在LOCK的上升沿,将转换好的数据锁入 BEGIN IF LOCK='1' AND LOCK'EVENT THEN REGL<=D; END IF; END PROCESS LATCH1; Q<=REGL; END behav; 10-7 以例10-6作为考察示例,按照表10-3,分别对此例设置不同的编码形式和安全状态机设置。给出不同约束条件下的资源利用情况(如LC、REG等),详细讨论比较不同情况下的状态机资源利用、可靠性等方面的问题。 --(1)以例10-6为例参照表10-3的顺序编码单进程MEALY状态机。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MEALY2 IS PORT(CLK,DIN1,DIN2,RST: IN STD_LOGIC;--时钟/串行数据/复位 Q: OUT STD_LOGIC_VECTOR(4 DOWNTO 0));--检测结果输出 END MEALY2; ARCHITECTURE behav OF MEALY2 IS TYPE states IS (st0,st1,st2,st3,st4);--定义各状态 attribute syn_encoding : string; attribute syn_encoding of states : type is "sequential"; SIGNAL PST : states; BEGIN PROCESS(CLK,RST,PST,DIN1,DIN2) WHEN st3=> IF DIN1='1' THEN PST<=st4; ELSE PST<=st3; END IF; IF DIN2='0' THEN Q<="11011";ELSE Q<="01001";END IF; WHEN st4=> IF DIN1='0' THEN PST<=st0; ELSE PST<=st4; END IF; IF DIN2='1' THEN Q<="11101";ELSE Q<="01101";END IF; WHEN OTHERS=> PST<=st0;Q<="00000"; END CASE; END IF; END PROCESS REGCOM; END behav; --(3)以例10-6为例参照表10-3的约翰逊编码单进程MEALY状态机。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MEALY2 IS PORT(CLK,DIN1,DIN2,RST: IN STD_LOGIC;--时钟/串行数据/复位 Q: OUT STD_LOGIC_VECTOR(4 DOWNTO 0));--检测结果输出 END MEALY2; ARCHITECTURE behav OF MEALY2 IS TYPE states IS (st0,st1,st2,st3,st4);--定义各状态 attribute syn_encoding : string; attribute syn_encoding of states : type is "johnson"; SIGNAL PST : states; BEGIN PROCESS(CLK,RST,PST,DIN1,DIN2) BEGIN --决定转换状态的进程 IF RST='1' THEN PST <= ST0;--复位 ELSIF CLK'EVENT AND CLK='1' THEN CASE PST IS --DIN1影响状态切换 WHEN st0=> IF DIN1='1' THEN PST<=st1; ELSE PST<=st0; END IF; IF DIN2='1' THEN Q<="10000";ELSE Q<="01010";END IF; WHEN st1=> IF DIN1='1' THEN PST<=st2; ELSE PST<=st1; END IF; IF DIN2='0' THEN Q<="10111";ELSE Q<="10100";END IF; WHEN st2=> IF DIN1='1' THEN PST<=st3; ELSE PST<=st2; END IF; IF DIN2='1' THEN Q<="10101";ELSE Q<="10011";END IF; WHEN st3=> IF DIN1='1' THEN PST<=st4; ELSE PST<=st3; END IF; IF DIN2='0' THEN Q<="11011";ELSE Q<="01001";END IF; WHEN st4=> IF DIN1='0' THEN PST<=st0; ELSE PST<=st4; END IF; IF DIN2='1' THEN Q<="11101";ELSE Q<="01101";END IF; WHEN OTHERS=> PST<=st0;Q<="00000"; END CASE; END IF; END PROCESS REGCOM; END behav; 《EDA技术实用教程(第五版)》习题 1 习 题 1-1 EDA技术与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.时序仿真(EDA时序仿真器就是接近真实器件运行特性的仿真,仿真文件中已包含了器件硬件特性参数,因而,仿真精度高。)与功能仿真(EDA功能仿真器直接对VHDL、原理图描述或其他描述形式的逻辑功能进行测试模拟,以了解其实现的功能是否满足原设计的要求,仿真过程不涉及任何具体器件的硬件特性。);5.编程下载(EDA编程下载把适配后生成的下载或配置文件,通过编程器或编程电缆向FPGA或CPLD下载,以便进行硬件调试和验证(Hardware Debugging)。);6.硬件测试(最后是将含有载入了设计的FPGA或CPLD的硬件系统进行统一测试,以便最终验证设计项目在目标系统上的实际工作情况,以排除错误,改进设计。其中EDA的嵌入式逻辑分析仪是将含有载入了设计的FPGA的硬件系统进行统一测试,并将测试波形在PC机上显示、观察和分析。)。 2 习 题 2-1 OLMC(输出逻辑宏单元)有何功能?说明GAL是怎样实现可编程组合电路与时序电路的。 P34~36 OLMC有何功能? 答:OLMC单元设有多种组态,可配置成专用组合输出、专用输入、组合输出双向口、寄存器输出、寄存器输出双向口等。 说明GAL是怎样实现可编程组合电路与时序电路的? 答:GAL(通用阵列逻辑器件)是通过对其中的OLMC(逻辑宏单元)的编程和三种模式配置(寄存器模式、复合模式、简单模式),实现组合电路与时序电路设计的。 2-2 什么是基于乘积项的可编程逻辑结构? P33~34,40 什么是基于查找表的可编程逻辑结构? P40~42 什么是基于乘积项的可编程逻辑结构?答:GAL、CPLD之类都是基于乘积项的可编程结构;即包含有可编程与阵列和固定的或阵列的PAL(可编程阵列逻辑)器件构成。 什么是基于查找表的可编程逻辑结构?答:FPGA(现场可编程门阵列)是基于查找表的可编程逻辑结构。 2-3 FPGA系列器件中的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
/
本文档为【《EDA技术实用教程(第五版)》习题答案(第110章)--潘】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索