VHDL语言基础-时序逻辑电路-触发器

目录

触发器:

D触发器:

触发器的VHDL描述:

触发器的仿真波形如下:​编辑

时钟边沿检测的三种方法:

方法一:

方法二:

方法三:

带有Q非的D触发器:

带有Q非的D触发器的描述:

JK触发器:

JK触发器:

JK触发器的VHDL描述:

T触发器:

真值表:

T触发器:

T触发器的VHDL描述:


触发器:

触发器是指边沿触发的寄存器,常见的有D型,JK型,T型。在描述触发器前要注意时钟上升沿的描述


D触发器:

D触发器是最常用的触发器,几乎所有的逻辑电路都可以描述成D触发器与组合逻辑电路

触发器的VHDL描述:

Library ieee;

Use ieee.std_logic_1164.all;

Entity D_FF1 is

    port ( D, clk: in std_logic;

              Q: out std_logic);

End D_FF1;

Architecture behav of D_FF1 is

Begin

--方法一

process(clk)

     begin

           if ( clk’s event and clk=‘1’)

           then Q<=D;

           end if;

     end process;

End behav;

--方法二

process

       begin

             wait until (clk=‘1’) ; 

--等同于 wait until clk’event and clk=‘1’

             Q<=D;

       end process;

End behav;

方法三

process(clk)

       begin

            if  (clk=‘1’) then

                 Q<=D;         

--利用进程启动特性产生对clk的边沿检测

            end if ;

       end process;

  end behav;

触发器的仿真波形如下:

当时钟上升沿到来时,把D的值赋给Q,之后保持不变。到下一个时钟上升沿到来时,再次把D的值赋给Q。


时钟边沿检测的三种方法:

方法一:

       上升沿:clock’  event and clock=‘1’

       下降沿:clock’  event and clock=‘0’;

注意:if clock’ event and clock=‘1’语句后面不存在else分支。当clock为std_logic类型时,也可以利用 if rising_edge(clk)或If falling_edge(clk)进行时钟边沿检测。

方法二:

       利用WAIT语句启动进程,检测colck的上升沿

方法三:

使用PROCESS语句和IF语句相结合实现。当colck发生跳变的时候启动PROCESS进程,而在执行IF语句时,满足clock=‘1’时才对Q进行赋值更新,所以相当于clock发生跳变且跳变为‘1’时,将D赋给Q,实际上就是D出发器的描述。


带有Q非的D触发器:

由下图可知,与D触发器相比,该触发器多了Qbar与低电平有效的异步复位信号

带有Q非的D触发器的描述:

Architecture sig of D_FF is

      signal state: std_logic ;

Begin

      process( clock, reset)

      begin

  if (reset=‘0’) then           state<=‘0’;

          else

           if rising_edge(clock)

          then state<=D;

          end if;

      end process;

     Q<=state;

     Qbar<=not state ;           

End sig;

 

Architecture var of D_FF is

Begin

     process(clock, reset)

         variable state: std_logic ;

     begin

         if (reset=‘0’) then  state:=‘0’;

         elsif rising_edge(clock)

         then state:=D;

         end if;

         Q<=state;

         Qbar<=not state;

      end process;

End var;

当state定义为变量时,其有效范围在process内。因此,Q和Q非的赋值语句只能放在process里面。 


JK触发器:

真值表:

JK触发器:

JK触发器的VHDL描述:

Entity JK_FF is

     port ( J, K: in std_logic;

               clock,reset:in  std_logic;

               Q, Qbar : out std_logic );

End JK_FF; 

Architecture  behav of  JK_FF  is

      signal state : std_logic ;

Begin

      process( clock, reset) is

     variable jk: std_logic_vector(1 downto 0);

      begin

           jk:=J&K;

           if  (reset=‘0’) then state<=‘0’;

elsif  rising_edge(clock) then

        case jk is

        when “11”=> state<=not state;

        when “10”=> state<=‘1’;

        when “01”=> state<=‘0’;

        when others  => null;

        end case;

   end if;

end process;

      Q<=state;

      Qbar<=not state ;

end  behav;

CASE语句要完整,所以在CASE JK的时候要加when others =>null;


T触发器:

真值表:

T触发器:

T触发器的VHDL描述:

Entity T_FF is

     port ( T, clock, reset : in  std_logic ;

               Q, Qbar : out  std_logic );

End T_FF;

Architecture  behav  of   T_FF  is

Begin

      process(clock, reset)

           variable  state:  std_logic ;    

      begin

          if  (reset =‘0’)  then state:=‘0’;

          elsif  rising_edge(clock) then

               if   T=‘1’then

                     state := not state;

                end if;

            end if ;

            Q<=state;

            Qbar<= not state;

       end process;

End  behav ;

猜你喜欢

转载自blog.csdn.net/weixin_50932441/article/details/128973348