当前位置:首页 > 《EDA技术实用教程(第四版)》习题答案
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41a IS
PORT( A,B,C,D : IN STD_LOGIC; S0,S1,S2,S3 : IN STD_LOGIC; Y : OUT STD_LOGIC); END ENTITY mux41a;
ARCHITECTURE one OF mux41a IS
SIGNAL S0_3 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
S0_3<=S0&S1&S2&S3;
y<=A WHEN S0_3=\ B WHEN S0_3=\ C WHEN S0_3=\ D WHEN S0_3=\ 'Z';
END ARCHITECTURE one;
3-9 分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。
试对例3-20的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL表述,并说明工作原理。设输入频率fi=4MHz,输出频率fo=516.5±1Hz(允许误差±0.1Hz),16位加载数值是多少?
--解:3-9 16位数控分频器(可进行奇偶数分频) LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF16 IS
PORT(CLK : IN STD_LOGIC;
D : IN STD_LOGIC_VECTOR(15 DOWNTO 0); FOUT : OUT STD_LOGIC); END ENTITY DVF16;
ARCHITECTURE one OF DVF16 IS SIGNAL FULL : STD_LOGIC; BEGIN
P_REG: PROCESS(CLK)
VARIABLE CNT8 : STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN
IF CLK'EVENT AND CLK = '1' THEN IF CNT8 = \
CNT8 := D-1;--当CNT8计数归0时,预置CNT8=D-1;
--计数范围(D=n):n-1~n/2取整(n=10:9\\8\\7\\6\\5计数,前后半周期相同) FULL <= '1';--同时使溢出标志信号FULL输出为高电平
--(n=11:10\\9\\8\\7\\6\\5计数,前比后半周期多一个时钟)
ELSIF CNT8 = ('0' & D(15 DOWNTO 1)) THEN
CNT8 :=('0' & D(15 DOWNTO 1))-1;--当CNT8=n/2取整时,预置CNT8=D/2取整-1; --计数范围(D=n):n/2取整~0(n=10:4\\3\\2\\1\\0计数) FULL <= '1'; --同时使溢出标志信号FULL输出为高电平 (n=11:4\\3\\2\\1\\0计数) ELSE CNT8 := CNT8 - 1; --否则继续作加1计数
FULL <= '0'; --且输出溢出标志信号FULL为低电平 END IF; END IF;
END PROCESS P_REG ; P_DIV: PROCESS(FULL)
VARIABLE CNT2 : STD_LOGIC; BEGIN
IF FULL'EVENT AND FULL = '1' THEN
CNT2 := NOT CNT2;--如果溢出标志信号FULL为高电平,D触发器输出取反 IF CNT2 = '1' THEN FOUT <= '1'; ELSE FOUT <= '0'; END IF; END IF;
END PROCESS P_DIV; END ARCHITECTURE one;
3-10 用VHDL设计一个功能类似74LS160的计数器。 --解:3-10 用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;
3-11 给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。 --解:3-11 给出含有异步清零和计数使能的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;
3-12 分别给出图3-20所示的六个RTL图的VHDL描述,注意其中的D触发器和锁存器的表述。
图3-20 RTL图
图3-20 RTL图(a)
--解:实现图3-20(a)RTL图的VHDL程序t3_12_a.vhd LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_a IS
PORT (CL,CLK0: IN STD_LOGIC; OUT1: OUT STD_LOGIC); END ENTITY t3_12_a;
共分享92篇相关文档