基本的な記憶回路であり,組合せ回路の構成要素となるDフリップフロップに ついて考えてみましょう.頻繁に用いられる回路ですから,この回路の記述例 は是非覚えて下さい.<表:Dフリップフ ップの動作>は,クロックの立ち上が りで動作するDフリップフロップの動作表です.
次に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;
手始めに,同期リセット付き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;
では,非同期リセット付き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;
VHDLによる順序回路の記述法 −8ビットバイナリカウンタ−