5-5 分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计
数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。
试对例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;
5-6 分别给出图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;
ARCHITECTURE sxdl OF t3_12_a IS ----时序电路sxdl SIGNAL Q : STD_LOGIC; BEGIN
PROCESS(CLK0) BEGIN
IF CLK0'EVENT AND CLK0='1' THEN --检测时钟上升沿 Q <= NOT(Q OR CL); END IF;
END PROCESS; OUT1 <= NOT Q;
END ARCHITECTURE sxdl;
图3-20 RTL图(b)
--解:实现图3-20(b)RTL图的VHDL程序t3_12_b.vhd LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_b IS
PORT (A,B,C,D: IN STD_LOGIC; Y: OUT STD_LOGIC); END ENTITY t3_12_b;
ARCHITECTURE sxdl OF t3_12_b IS ----时序电路sxdl SIGNAL AB,CD,ABCD : STD_LOGIC; BEGIN
PROCESS(A,B,C,D,AB,CD,ABCD) BEGIN
AB<=A OR B; CD<=C AND D;
ABCD<=AB XOR CD;
CASE AB IS --类似于真值表的case语句 WHEN '0' => Y <= A;
WHEN '1' => Y <= ABCD; WHEN OTHERS =>NULL ; END CASE; END PROCESS;
END ARCHITECTURE sxdl;
图3-20 RTL图(c)
--解1:实现图3-20(c) 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:实现图3-20(c)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;
--解3:实现图3-20(c)RTL图的VHDL程序t3_12_c.vhd顶层设计描述。 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_c IS
PORT(D1,D2,CLK : IN STD_LOGIC; Q : OUT STD_LOGIC); END ENTITY t3_12_c;
ARCHITECTURE one OF t3_12_c IS
COMPONENT mux21a --调用2选1多路选择器声明语句 PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC);
相关推荐: