第六章 时序逻辑电路设计
6.1 触发器
6.2 计数器
在时序电路中,是以时钟信号作为驱动信号的,也就是说时序电路是在时钟信号的边沿到来时,它的状态才会发生改变。因此,在时序电路中时钟信号是非常重要的,它是时序电路的执行条件和同步信号。
在用VHDL描述时序逻辑电路时,通常采用时钟进程的形式来描述,也就是说,时序逻辑电路中进程的敏感信号是时钟信号。时钟作为敏感信号的描述方式有两种:
1.时钟信号显示地出现在PROCESS语句后面的敏感信号表中。
2. 时钟信号没有显示地出现在PROCESS语句后面的敏感信号表中,而是出现在WAIT语句的后面。
在时序逻辑电路中,时钟是采用边沿来触发的,时钟边沿分为上升沿和下降沿。以下是这两种边沿的描述方式。
对于上升沿,其物理意义是指时钟信号的逻辑值是从‘0’跳变到‘1’。下面是时钟上升沿的几种描述形式:
上升沿描述:
描述1:
label1:PROCESS(clk)
BEGIN
IF(clk’EVENT AND clk = ‘1’)THEN
┇
AND PROCESS;
描述2:
label2:PROCESS()
BEGIN
WAIT UNTIL clk = ‘1’;
┇
AND PROCESS;
下降沿描述:
描述1:
label1:PROCESS(clk)
BEGIN
IF(clk’EVENT AND clk = ‘0’)THEN
┇
AND PROCESS;
描述2:
label2:PROCESS()
BEGIN
WAIT UNTIL clk = ‘0’;
┇
AND PROCESS;
6.1 JK触发器
例[]
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY JKff_v1 IS
PORT(J,K: IN STD_LOGIC;
clk: IN STD_LOGIC;
set: IN STD_LOGIC;
reset: IN STD_LOGIC;
Q,QB: OUT STD_LOGIC);
END JKff_v1;
ARCHITECTURE behave OF JKff_v1 IS
SIGNAL Q_temp,QB_temp: STD_LOGIC;
BEGIN
PROCESS (clk,set,reset)
BEGIN
IF (set ='0' AND reset ='1')THEN
Q_temp <= '1';
QB_temp <= '0';
ELSIF (set ='1' AND reset ='0')THEN
Q_temp <= '0';
QB_temp <= '1';
ELSIF (clk'EVENT AND clk = '1')THEN
IF(J='0' AND K='1')THEN
Q_temp <= '0';
QB_temp <= '1';
ELSIF(J='1' AND K='0')THEN
Q_temp <= '1';
QB_temp <= '0';
ELSIF(J='1' AND K='1')THEN
Q_temp <= NOT Q_temp ;
QB_temp <= NOT QB_temp;
END IF;
END IF;
Q <= Q_temp;
QB <= QB_temp;
END PROCESS;
END behave;
6.2 60进制递增计数器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY cntm60v IS
PORT( en : IN std_logic;
clear : IN std_logic;
load : IN std_logic;
dl,dh : IN std_logic_vector(3 downto 0);
clk : IN std_logic;
cout : out std_logic;
ql : buffer std_logic_vector(3 downto 0);
qh : buffer std_logic_vector(3 downto 0) );
END cntm60v;
ARCHITECTURE behave OF cntm60v IS
signal ent2 : std_logic; --信号
BEGIN
PROCESS (clk)
VARIABLE tmpl,tmph :std_logic_vector(3 downto 0);--变量只存在于进程之类中
BEGIN
IF(clear='0') THEN
tmpl:="0000";
tmph:=“0000”; - -异步清零
ELSIF(clk'EVENT AND clk = '1') THEN
IF load='0' THEN
tmpl:=dl;
tmph:=dh; - - 同步置数。利用时钟信号
elsif(en='1') then
if (tmpl="1001") then
tmpl:=“0000”; - -个位计数器9+1=0
if(tmph="0101") then
tmph:=“0000”; - -十位计数器5+1=0 59+1=0
else
tmph:=tmph+1;
end if;
else
tmpl:=tmpl+1;
end if;
end IF; --end lf (load)
END IF; --end if clear
ql <= tmpl;
ent2 <= tmpl(3) and tmpl(0) and en;
qh<=tmph;
- -计数器为59时进位信号 cout 输出‘1’。
cout<=tmph(2) and tmph(0) and ent2;
END PROCESS;
END behave ;
60进制计数器波形仿真
发表于 @ 2007年04月23日 08:53:00|评论(loading...)|编辑