原创 第六章 时序逻辑电路设计收藏

新一篇: 第五章 组合逻辑电路设计 | 旧一篇: 第五章 组合逻辑电路设计

第六章  时序逻辑电路设计

6.1 触发器

6.2 计数器

在时序电路中,是以时钟信号作为驱动信号的,也就是说时序电路是在时钟信号的边沿到来时,它的状态才会发生改变。因此,在时序电路中时钟信号是非常重要的,它是时序电路的执行条件和同步信号。

在用VHDL描述时序逻辑电路时,通常采用时钟进程的形式来描述,也就是说,时序逻辑电路中进程的敏感信号是时钟信号。时钟作为敏感信号的描述方式有两种:

1.时钟信号显示地出现在PROCESS语句后面的敏感信号表中。

2. 时钟信号没有显示地出现在PROCESS语句后面的敏感信号表中,而是出现在WAIT语句的后面。

在时序逻辑电路中,时钟是采用边沿来触发的,时钟边沿分为上升沿和下降沿。以下是这两种边沿的描述方式。

对于上升沿,其物理意义是指时钟信号的逻辑值是从‘0’跳变到‘1’。下面是时钟上升沿的几种描述形式:

上升沿描述:

描述1

label1PROCESSclk

BEGIN

IFclk’EVENT AND clk = ‘1’THEN

AND PROCESS

描述2

label2PROCESS()

BEGIN

WAIT UNTIL clk = ‘1’

AND PROCESS

下降沿描述:

描述1

label1PROCESSclk

BEGIN

IFclk’EVENT AND clk = ‘0’THEN

AND PROCESS

描述2

label2PROCESS()

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...)|编辑

新一篇: 第五章 组合逻辑电路设计 | 旧一篇: 第五章 组合逻辑电路设计

评论

#mafei 发表于2007-05-29 20:50:39  IP: 122.96.85.*
大恩不言谢
2007-05-30 10:39:54作者回复
:)
发表评论  


登录
Csdn Blog version 3.1a
Copyright © randy