5-1 在VHDL设计中,给时序电路清0(复位)有两种不同方法,它们是什么?如何实现?
5-1 答:两种不同的清零方法是同步清零和异步清零;
同步清零就是把清零信号和时钟信号与或者与非处理后输入到清零端,异步清零的清零信号直接输入到清零端。
同步清零可以保证状态在时钟的有效期内不会改变。
同步复位 D触发器:
IF clock‘event AND clock='1' THEN
IF reset_n='0' THEN q<=(others=>'0');
ELSE q<=d;
END IF;
END IF
异步复位触发器:
IF reset_n=’0‘ THEN q<=(OTHERS=>'0');
ELSIF clock'event AND clock ='1' THEN q<=d;
END IF;
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);
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;
ELSE Q:=(OTHERS=>'0');
END IF
END IF;
END IF;
END IF;
IF Q=9 THEN COUT<='1';
ELSE COUT<='0';
END IF;
DOUT<=Q;
END PROCESS;
END behav;
5-8 给出含有异步清0和计数使能的16位二进制加减可控计数器的VHDL描述。
解:
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; ;
ELSIF CLK'EVENT AND CLK='1' THEN
IF ADD_EN='1'THEN
IF CQI<16#FFFF# THEN CQI:=CQI+1;
ELSE CQI:=(OTHERS => '0');
END IF;
IF CQI=16#FFFF# THEN COUT<='1';
ELSE COUT <= '0';
END IF;
END IF;
IF SUB_EN='1'THEN
IF CQI>0 THEN CQI:=CQI-1;
ELSE CQI:=(OTHERS => '1');
END IF;
IF CQI=0 THEN COUT<='1';
ELSE COUT <= '0';
END IF;
END IF;
END IF;
CQ<=CQI;
END PROCESS;
END ARCHITECTURE A_S_16;