《EDA技术实用教程(第五版)》习题答案(第1~10章)--潘 下载本文

并说明这一功能的特点及优势。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;