《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 ;

buf3s input output enable ENTITY mux21 IS --实体2: 2选1多路选择器 PORT(in0, in1,sel: IN STD_LOGIC; output:OUT STD_LOGIC);

mux21 in0 output in1 sel 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 = \ THEN y <= a; ELSIF s0s1 = \ THEN y <= b; ELSIF s0s1 = \ 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 \ => y <= a; WHEN \ => y <= b; WHEN \ => y <= c; WHEN \ => 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

xin yin

a

c

b

diff_out

图3-18 全减器结构图

--解(1.1):实现1位半减器h_suber(diff=x-y;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)。

x7 y7 a6 x1 y1 xin sub_out yin u7 sub_in diff_out ………………. ………………. xin sub_out yin u1 sub_in diff_out xin sub_out yin u0 sub_in diff_out 串行借位的8位减法器

a1 sout diff7

a0 diff1 diff0

x0 y0 sin

--解(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译码器设计(条件赋值语句实现)

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<=\ \ \ \ \ \ \ \

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<=\ WHEN 1 => DOUT<=\ WHEN 2 => DOUT<=\ WHEN 3 => DOUT<=\ WHEN 4 => DOUT<=\ WHEN 5 => DOUT<=\ WHEN 6 => DOUT<=\ WHEN 7 => DOUT<=\ 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<=\ ELSIF CONV_INTEGER(DIN)=1 THEN DOUT<=\ ELSIF CONV_INTEGER(DIN)=2 THEN DOUT<=\ ELSIF CONV_INTEGER(DIN)=3 THEN DOUT<=\ ELSIF CONV_INTEGER(DIN)=4 THEN DOUT<=\ ELSIF CONV_INTEGER(DIN)=5 THEN DOUT<=\ ELSIF CONV_INTEGER(DIN)=6 THEN DOUT<=\ ELSIF CONV_INTEGER(DIN)=7 THEN DOUT<=\ 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<=\被移位部分是常数 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>\

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 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,补码=原码。 else

patch_data<=org_data(7)&(not org_data(6 DOWNTO 0))+1;--org_data<0,补码=|原码|取反+1。 END IF;

END PROCESS; END BHV;

3-9 设计一个格雷码至二进制数的转换器。 --3-9 设计一个格雷码至二进制数的转换器。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; --为使用类型转换函数,打开此程序包。 ENTITY grayTObinary IS

port( DIN: IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT: OUT BIT_VECTOR(3 DOWNTO 0)); END grayTObinary;

ARCHITECTURE behave OF grayTObinary IS BEGIN

PROCESS (DIN) BEGIN

CASE DIN IS

WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN \ WHEN OTHERS => NULL;

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

IF cc(3 DOWNTO 0) > \ IF cc(7 DOWNTO 4) > \

cc:=a+cc;

IF cc(3 DOWNTO 0) > \ IF cc(7 DOWNTO 4) > \

IF a

cc:=\

IF cc(3 DOWNTO 0) > \ IF cc(7 DOWNTO 4) > \ 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)); END;

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); END;

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:=\

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输入最大数值检测电路。

--3-15 设计一个4位4输入最大数值检测电路。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY MAXDATA IS

PORT(A: IN STD_LOGIC_VECTOR(3 DOWNTO 0); MAXOUT: OUT STD_LOGIC); END ENTITY MAXDATA;

ARCHITECTURE ONE OF MAXDATA IS BEGIN

PROCESS(A) BEGIN

IF A=\ END PROCESS;

END ARCHITECTURE ONE;

3-16 设计VHDL程序,实现两个8位二进制数相加,然后将和左移或右移4位,并分别将移位后的值存入变量AA和BB中。

--3-16 设计VHDL程序,实现两个8位二进制数相加,然后将和左移或右移4位,并分别将移位后的值存入变量A和B中。 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;

AA,BB: OUT STD_LOGIC_VECTOR(S-1+4 DOWNTO 0)); 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;

VARIABLE AB: STD_LOGIC_VECTOR(S-1+4 DOWNTO 0); BEGIN C1:=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;

AA<=TO_STDLOGICVECTOR(TO_BITVECTOR(\ BB<=TO_STDLOGICVECTOR(TO_BITVECTOR(\ 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;当A

--第一种设计方案是常规的比较器设计方法,即直接利用关系操作符进行编程设计。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COMP IS

PORT( A,B: IN STD_LOGIC_VECTOR(7 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;

END ARCHITECTURE ONE;

--3-22 比较器的输入是两个待比较的8位数A=[A7..A0]和B=[B7..80],输出是EQ、GT、F。当A=B时EQ=1;当A>B时GT=1;当A

--第二种设计方案是利用减法器来完成,通过减法运算后的符号和结果来判别两个被比较值的大小。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COMP IS

PORT( A,B: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --两个3位输入 LT: OUT STD_LOGIC; --小于输出 GT: OUT STD_LOGIC; --大于输出 EQ: OUT STD_LOGIC); --等于输出 END ENTITY COMP;

ARCHITECTURE ONE OF COMP IS

SIGNAL C: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL D,E,F,G: INTEGER RANGE 255 DOWNTO 0; BEGIN C<=A-B;

D<=10;

E<=16#D9#; F<=8#72#;

G<=2#11010010#; PROCESS(A,B) BEGIN

IF (C(7)='1') THEN LT<='1';ELSE LT<='0';END IF; IF (C=0) THEN EQ<='1'; ELSE EQ<='0';

IF(C(7)='0')THEN GT<='1';ELSE GT<='0';END IF; END IF;

END PROCESS;

END ARCHITECTURE ONE;

3-23 根据图3-19,用两种不同描述方式设计一4选1多路选择器。在设计中需要体现此电路由三个2选l多路选择器构成。解1:层次例化;解2:单层3进程。

--解1:层次例化。底层元件mux21a.vhd程序如下: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21a IS

PORT(a,b,s: IN STD_LOGIC; y: OUT STD_LOGIC); END ENTITY mux21a;

ARCHITECTURE one OF mux21a IS BEGIN

PROCESS(a,b,s) BEGIN

IF s='0' THEN y<=a; ELSE y<=b; END IF;

END PROCESS;

END ARCHITECTURE one;

--解1:层次例化。顶层mux41b.vhd程序如下: LIBRARY ieee;

USE ieee.std_logic_1164.all; ENTITY mux41b IS

port(X0,X1,X2,X3: IN STD_LOGIC; S0,S1: IN STD_LOGIC; OUTY: OUT STD_LOGIC); END mux41b;

ARCHITECTURE bdf_type OF mux41b IS component mux21a

PORT(a,b,s: IN STD_LOGIC; y: OUT STD_LOGIC); end component;

signal N0,N1: STD_LOGIC; BEGIN

u1: mux21a PORT MAP(a=>X0,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); END;

--解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; ELSE

N0<=x2; END IF;

END PROCESS;

com2: PROCESS(x3,x4,s0) BEGIN

IF s0='0' THEN N1<=x3; ELSE

N1<=x4; END IF;

END PROCESS;

com3: PROCESS(N0,N1,s1) BEGIN

IF s1='0' THEN y<=N0; ELSE 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的其他设置和控制方法。

4-2 参考Quartus II的Help,详细说明Assignments菜单中Settings对话框的功能。 (1)说明其中的Timing Requirements & Qptions的功能、使用方法和检测途径。 (2)说明其中的Compilation Process的功能和使用方法。

(3)说明Analysis & Synthesis Setting的功能和使用方法,以及其中的Synthesis Netlist Optimization的功能和使用方法。

(1)说明其中的Timing Requirements&Qptions的功能、他用方法和检测途经。 Specifying Timing Requirements and Options (Classic Timing Analyzer)

You can specify timing requirements for Classic timing analysis that help you achieve the desired speed performance and other timing characteristics for the entire project, for specific design entities, or for individual clocks, nodes, and pins.

When you specify either project-wide or individual timing requirements, the Fitter optimizes the placement of logic in the device in order to meet your timing goals.

You can use the Timing wizard or the Timing Analysis Settings command to easily specify all project-wide timing requirements, or you can use the Assignment Editor to assign individual clock or I/O timing requirements to specific entities, nodes, and pins, or to all valid nodes included in a wildcard or assignment group assignment. To specify project-wide timing requirements:

1. On the Assignments menu, click Settings.

2. In the Category list, select Timing Analysis Settings.

3. To specify project-wide tSU, tH, tCO, and/or tPD timing requirements, specify values

under Delay requirements.

4. To specify project-wide minimum delay requirements, specify options under

Minimum delay requirements.

5. Under Clock Settings, select Default required fmax.

6. In the Default required fmax box, type the value of the required fMAX and select a time

unit from the list.

7. If you want to specify options for cutting or reporting certain types of timing paths

globally, enabling recovery/removal analysis, enabling clock latency, and reporting unconstrained timing paths, follow these steps: 8. Click OK.

To specify clock settings:

1. On the Assignments menu, click Settings.

2. In the Category list, select Timing Analysis Settings. 3. Under Clock Settings, click Individual Clocks. 4. Click New.

5. In the New Clock Settings dialog box, type a name for the new clock settings in the

Clock settings name box.

6. To assign the clock settings to a clock signal in the design, type a clock node name in

the Applies to node box, or click Browse... to select a node name using the Node Finder.

7. If you want to specify timing requirements for an absolute clock, follow these steps: 8. If you have already specified timing requirements for an absolute clock, and you want

to specify timing requirements for a derived clock, follow these steps: 9. In the New Clock Settings dialog box, click OK. 10. In the Individual Clocks dialog box, click OK. 11. In the Settings dialog box, click OK. To specify individual timing requirements:

1. On the Assignments menu, click Assignment Editor.

2. In the Category bar, select Timing to indicate the category of assignment you wish to

make.

3. In the spreadsheet, select the To cell and perform one of the following steps:

? Type a node name and/or wildcard that identifies the destination node(s) you

want to assign.

? Double-click the To cell and click Node Finder to use the Node Finder to enter

a node name.

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.

To specify timing analysis reporting restrictions: 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:=\

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

4-13 在本章示例中,或自主选择一个示例,使用SignalProbe在EP3C55上进行硬件测试,

并说明这一功能的特点及优势。P113~114

4-14 对例3-23和例3-24进行仿真,验证其功能,并详细说明程序结构和各语句功能。试用进程语句完成相同功能。

--解1:4-14【例3-23】0~255范围内的自然数转换成8位二进制数。 LIBRARY IEEE; --主程序,用户定义转换函数应用实例 USE IEEE.STD_LOGIC_1164.ALL; USE WORK.n_pack.ALL; ENTITY axamp IS

PORT(dat: IN nat; --注意数据类型的定义 ou: OUT Bit8); --注意数据类型的定义 END;

ARCHITECTURE bhv OF axamp IS BEGIN

ou<=nat_to_Bit8(dat); END; --解2:4-14【例3-24】自然数转换成二进制数的程序包(不能独立综合仿真。被【例3-23】打开使用)

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; PACKAGE n_pack IS

SUBTYPE nat IS Integer range 0 to 255;--定义一个Integer的子类型 TYPE Bit8 IS array(7 downto 0)OF std_logic;--定义一个数据类型 FUNCTION nat_to_Bit8(s:nat)RETURN Bit8; END n_pack;

PACKAGE BODY n_pack IS

FUNCTION nat_to_Bit8(s:nat)RETURN Bit8 IS VARIABLE Din: Integer range 255 downto 0; VARIABLE Rut: Bit8;

VARIABLE Rig: Integer:=2**7; BEGIN Din:=S;

FOR I in 7 downto 0 LOOP

IF Din/Rig > 0 THEN Rut(i):='1';Din:=Din-Rig; ELSE Rut(i):='0'; END IF; Rig:=Rig/2; END LOOP; RETURN Rut; END nat_to_Bit8; END n_pack;

5 习 题

5-1 在VHDL设计中,给时序电路清0(复位)有两种不同方法,它们是什么?如何实现?同步和异步复位。P122~124

--解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); END;

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); END;

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); END;

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); END;

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; --允许加载 ELSE 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

y<=a WHEN s='0' ELSE b;

END ARCHITECTURE one;

--解2:实现图5-18 RTL图的VHDL程序DFF6.vhd底层设计描述。 -- 电平触发D型触发器程序(DFF6.vhd) LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF6 IS

PORT(CLK: IN STD_LOGIC; D: IN STD_LOGIC; Q:OUT STD_LOGIC); END;

ARCHITECTURE bhv OF DFF6 IS BEGIN

PROCESS(CLK,D) BEGIN

IF CLK='1'

THEN Q<=D; END IF; END PROCESS; END bhv;

-- 5-6 给出图5-18 RTL图的VHDL描述。

--解3:实现图5-18 RTL图的VHDL程序T5_18.vhd顶层设计描述。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY T5_18 IS

PORT(D1,D2,CLK : IN STD_LOGIC; Q : OUT STD_LOGIC); END ENTITY T5_18;

ARCHITECTURE one OF T5_18 IS

COMPONENT mux21a --调用2选1多路选择器声明语句 PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END COMPONENT;

COMPONENT DFF6 --调用电平型D触发器声明语句 PORT(CLK: IN STD_LOGIC; D: IN STD_LOGIC; Q:OUT STD_LOGIC); END COMPONENT;

SIGNAL DD: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN

u1: mux21a PORT MAP(CLK,D2,D1,DD); u2: DFF6 PORT MAP(CLK,DD,Q); END ARCHITECTURE one;

图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); END;

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; --允许加载 ELSE

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位二进制

加法计数器。如果使用74299(8位通用移位寄存器)、74373(8D锁存器)、D触发器和非门来完成上述功能,应该有怎样的电路?

5-11 (1) (2) 基于原理图输入方式,用一片74163(可预置4位二进制计数器)和两片74138(3线-8线译码器)构成一个具有12路脉冲输出的数据分配器。要求在原理图上标明第1路到第12路输出的位置。若改用一片74195(4位通用移位寄存器)代替以上的74163 (可预置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:=\ --移位寄存器和计数器复位 ELSE

IF shift_cnt=4 THEN --检测到接收5位串行输入数据

shift_cnt:=\ --移位计数器清零,为接收下一组数据做准备。 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);--采样移位串行输入 ELSE

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:=\ --移位寄存器和计数器复位 ELSE

IF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF shift_cnt=4 THEN --检测到接收5位串行输入数据

shift_cnt:=\ --移位计数器清零,为接收下一组数据做准备。 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);--采样移位串行输入 ELSE

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.在程序开始部分增加打开\库和使用\所有程序包。 -- 答:2.在结构说明描述部分增加调用\传递参数和端口的申明。

-- 答:3.在结构行为描述部分增加调用\传递参数和端口的例化。示例如下: -- 答:4.调用计数器lpm_counter(LPM模块)的VHDL程序如下:(SINGT_counter.vhd) LIBRARY ieee;

USE ieee.std_logic_1164.all; LIBRARY lpm;

USE lpm.all;

ENTITY SINGT_counter IS

PORT(clock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END SINGT_counter;

ARCHITECTURE SYN OF singt_counter IS

SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT lpm_counter

GENERIC(lpm_direction : STRING; lpm_port_updown : STRING; lpm_type : STRING; lpm_width : NATURAL);

PORT (clock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END COMPONENT; BEGIN

q <= sub_wire0(7 DOWNTO 0);

lpm_counter_component : lpm_counter

GENERIC MAP(lpm_direction => \ lpm_type => \ PORT MAP(clock => clock,q => sub_wire0); END SYN;

7-2 分别以图7-18(例7-1)和例7-7(6)的代码形式设计两个相同参数的RAM程序,它们是8(10)位数据线和10(8)位地址线。初始化文件是mif格式的正弦波数据文件,即合1024个点,每个点8位二进制数的一个周期的正弦波波形,设初相位是0。在Quartus II上进行仿真,验证设计的正确性,并比较它们的结构特点、资源利用情况及工作速度。 --解1:以例7-7代码形式设计RAM(8位数据和10位地址) 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位数据输出端口 END;

ARCHITECTURE bhv OF RAM10x8 IS

TYPE G_ARRAY IS ARRAY(0 TO 1024) OF STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL MEM: G_ARRAY;--定义信号MEM的数据类型为用户新定义的类型G_ARRAY

attribute ram_init_file: string;--定义字符串属性的标识符ram_init_file。 attribute ram_init_file of MEM: --定义标识符ram_init_file是MEM的属性, SIGNAL IS \ --并将字符串\初始化赋给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; END BHV;

--解2:以图7-18代码形式设计RAM

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:=\

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的属性,

--并将字符串\初始化赋给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位数据输出端口 END;

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=>\ 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,补码=原码。 else

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>\

cmp_out<='1'; --输入数据大于5,比较输出1。 else

cmp_out<='0'; --输入数据小于等于5,比较输出0。 END IF; END PROCESS; END BHV;

8-6 用原理图或VHDL输入方式分别设计一个周期性产生二进制序列01001011001的序列发生器,用移位寄存器或用同步时序电路实现,并用时序仿真器验证其功能。(可预置数11位序列发生器)

解(1):用原理图设计产生01001011001序列

解(2):用VHDL设计产生01001011001序列 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY S_generator IS

PORT(CLK,CLR: IN STD_LOGIC; --工作时钟/复位信号 S_out: OUT STD_LOGIC);--序列输出位 END S_generator;

ARCHITECTURE behav OF S_generator IS

SIGNAL D: STD_LOGIC_VECTOR(10 DOWNTO 0);--11位循环移位寄存器 BEGIN

PROCESS(CLK,CLR) BEGIN

IF CLK'EVENT AND CLK='1' THEN --时钟到来时,逐位左移循环输出序列位 IF CLR='1' THEN D<=\复位操作,产生11位待输出序列 ELSE

D(10 DOWNTO 1)<=D(9 DOWNTO 0); D(0)<=D(10); S_out<=D(10); END IF; END IF; END PROCESS; END behav;

解(3:)用原理图设计且可预置数的11位序列

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=\ END PROCESS;

COM2: PROCESS(enable,input2) BEGIN

IF enable=\ END PROCESS;

COM1: PROCESS(enable,input1) BEGIN

IF enable=\ END PROCESS;

COM0: PROCESS(enable,input0) BEGIN

IF enable=\ 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:=(\ \

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)\左循环移位寄存器: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:=(\ \

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”,在s0踏步 ELSE next_state<=s1;END IF;--否则进入s1 WHEN s1 => IF state_inputs = \输入为“00”,在s1踏步 ELSE next_state<=s2;END IF; --否则进入s2 WHEN s2 => IF state_inputs = \输入为“11”,进入s0 ELSE next_state<=s3;END IF; --否则进入s3 WHEN s3 => IF state_inputs = \输入为“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;

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); --数据类型定义,状态符号化 -- attribute syn_encoding

: string;

-- attribute syn_encoding of FSM_ST : type is \

SIGNAL c_st, next_state: STD_LOGIC_VECTOR(1 DOWNTO 0);--FSM_ST;--将现态和次态定义为新的数据类型

CONSTANT s0: STD_LOGIC_VECTOR(1 DOWNTO 0):=\状态符号编码定义 CONSTANT s1: STD_LOGIC_VECTOR(1 DOWNTO 0):=\ CONSTANT s2: STD_LOGIC_VECTOR(1 DOWNTO 0):=\ CONSTANT s3: STD_LOGIC_VECTOR(1 DOWNTO 0):=\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;

COM:PROCESS(c_st, state_Inputs)--主控组合进程(现态和外部输入为敏感信号) BEGIN

CASE c_st IS

WHEN s0 => comb_outputs<= 5; --现态为s0时,对外输出命令信号5编码 IF state_inputs = \输入为“00”,在s0踏步 ELSE next_state<=s1;END IF; --否则进入s1 WHEN s1 => comb_outputs<= 8; --现态为s1时,对外输出命令信号8编码 IF state_inputs = \输入为“00”,在s1踏步 ELSE next_state<=s2;END IF; --否则进入s2 WHEN s2 => comb_outputs<= 12; --现态为s2时,对外输出命令信号12编码 IF state_inputs = \输入为“11”,进入s0 ELSE next_state<=s3;END IF; --否则进入s3 WHEN s3 => comb_outputs<= 14; --现态为s3时,对外输出命令信号14编码 IF state_inputs = \输入为“11”,在s3踏步 ELSE next_state<=s0;END IF; --否则返回s0 END case; END PROCESS; END behv;

10-4 为例10-2的LOCK信号增加keep属性,再给出此设计的仿真波形(注意删去LOCK_T)。

--10-4 为例10-2(Moore型ADC0809采样)的LOCK信号增加keep属性。