Dフリップフロップ


基本的な記憶回路であり,組合せ回路の構成要素となるDフリップフロップに ついて考えてみましょう.頻繁に用いられる回路ですから,この回路の記述例 は是非覚えて下さい.<表:Dフリップフ ップの動作>は,クロックの立ち上が りで動作するDフリップフロップの動作表です.

表:Dフリップフロップの動作
CLK
D
Q^{n+1}
0/1
0/1
Q^n
0
0
1
1

次にDフリップフロップの記述を示します.if文中のCLK'eventに注目して下さ い.これは,信号CLKが変動したときに真となる値です.eventをアトリビュートと呼びます. このようにこの値が真であり,CLK = '1'という条件を同時に満たすというこ とは,すなわちクロックの立ち上がりを検出することを意味しています.この 表現は非常に重要なので,しっかりと理解して下さい.また,立ち下がりを検 出するにはCLK ='0'と書けばよいのです.


-- ライブラリ宣言
library	IEEE;
use IEEE.std_logic_1164.all;

-- エンティティ宣言
entity D_FF is
  port (
    D   : in  std_logic;
    CLK : in  std_logic;
    Q   : out std_logic );
end D_FF;

-- アーキテクチャ本体
architecture D_FF_Body of D_FF is
signal DBUF: std_logic;
begin
  process(CLK)
  begin
    if CLK'event and CLK = '1' then
      DBUF <= D;
    end if;
  end process;
  Q <= DBUF;
end D_FF_Body;

クロックが立ち上がると,内部信号DBUFに入力信号Dが記憶されます.これ以 外の時はなにも起こりません.同時処理レベルで,DBUFの信号が常にQに代入 されており,いつでも記憶情報が取り出せるようになっています.このように してDフリップフロップが記述できます.この考え方を応用すれば,種々のレ ジスタやカウンタの記述も可能です.

手始めに,同期リセット付きDフリップフロップを記述してみます.


-- ライブラリ宣言
library	IEEE;
use IEEE.std_logic_1164.all;

-- エンティティ宣言
entity D_FF is
  port (
    D     : in  std_logic;
    CLK   : in  std_logic;
    RESET : in  std_logic;
    Q     : out std_logic );
end D_FF;

-- アーキテクチャ本体
architecture D_FF_Body of D_FF is
signal DBUF: std_logic;
begin
  process(CLK)
  begin
    if CLK'event and CLK = '1' then
      if RESET = '1' then
	DBUF <= '0';
      else
        DBUF <= D;
      end if;
    end if;
  end process;
  Q <= DBUF;
end D_FF_Body;

このように,if CLK'event and CLK = '1' then ... end if; 内で RESET 信 号に応じた処理を行います.

では,非同期リセット付きDフリップフロップを記述してみます.もう少し複 雑にするために,書き込み制御も行う8ビットのレジスタにしてみます.


-- ライブラリ宣言
library	IEEE;
use IEEE.std_logic_1164.all;

-- エンティティ宣言
entity D_FF is
  port (
    D     : in  std_logic_vector( 7 downto 0 );
    CLK   : in  std_logic;
    RESET : in  std_logic;
    WE    : in  std_logic;
    Q     : out std_logic_vector( 7 downto 0 ) );
end D_FF;

-- アーキテクチャ本体
architecture D_FF_Body of D_FF is
signal DBUF: std_logic;
begin
  process(CLK, RESET)
  begin
    if RESET = '1' then
      DBUF <= "00000000";
    elsif CLK'event and CLK = '1' then
      if WE = '1' then
        DBUF <= D;
      end if;
    end if;
  end process;
  Q <= DBUF;
end D_FF_Body;

このように,リセットについては if CLK'event and CLK = '1' then ... end if; の外で処理を行います.この場合,RESETの変化によりプロセス文を実行 できるようにセンシティビティリストへ RESET を追加しておく必要がありま す.書き込み制御については,同期的な動作を行えばよいのでif CLK'event and CLK = '1' then ... end if; 内に制御を記述します.また,8ビット長に 拡張するためには,単にベクタタイプを使えばよいのです.
次は,順序回路の応用例のひとつとして8ビットバイナリカウンタについて学びます.

VHDLによる順序回路の記述法 −8ビットバイナリカウンタ−



ホーム もどる 辞書

This is my e-mail address:
arch_www < www@cs.kumamoto-u.ac.jp >
Copyright (C) KITE Microprocessor Project, 1996