順序回路の設計(5章フリップフロップとそのVHDL記述)



ラッチとフリップフロップ(FF)

ラッチの定義(例:Dラッチ)

CLKがHighの時に、入力Dは出力Qへインバータ2段で接続され、
CLKがLowの時に、インバータ2段がリング接続になり、値を保持する。


Dフリップフロップ(FF)の定義(例:Dフリップフロップ)


フリップフロップ(FF)の動作波形

シンボル 名称 意味
tC サイクルタイム 動作する周期、スペックでは最小値が規定される。
tS セットアップタイム クロックエッジに対するデータを用意する時間、スペックでは最小値が規定される。
tH ホールドタイム クロックエッジに対してデータを保持する時間、スペックでは最小値が規定される。
tKQ アクセスタイム クロックエッジからデータ出力までの時間、スペックでは最大値が規定される。

フリップフロップを使った回路(同期回路)の意味


クイズ1

1)3人の学生A,B,Cさんはそれぞれ以下の仕事をするとする

A: 紙に書かれた数字を見て、その数字に1を加えたもの計算し、紙に答えを書く

B: 紙に書かれた数字を見て、その数字を2倍したもの計算し、紙に答えを書く

C: 紙に書かれた数字を見て、その数字を5倍し、それから3を引き算したもの計算し、紙に答えを書く

最初、Aさん、Bさん、Cさんにそれぞれ、「1」、「2」、「3」と書かれた紙を渡す。

そして、A,B,Cさんはすぐに自分の仕事をする。

先生の「ハイ!」という合図で、AさんはBさんに紙を渡し、BさんはCさんに紙を渡し、CさんはAさんに紙を渡すとする。

先生が「ハイ!」と5回言った後に、Aさん、Bさん、Cさんの紙の数字はそれぞれ幾らか?

 

2) 以下の波形をそれぞれ、DラッチとDフリップフロップに入力した時の波形を描け


VHDLにおけるフリップフロップ(FF)の生成方法

 

リスト5.8 D-FFのVHDL記述

ライブラリ宣言 library IEEE; 
use IEEE.std_logic_1164.all;
いつもどおり
エンティティ宣言 entity PET_D_FF is 
 port( CK, D : in std_logic; 
       Q : out std_logic ); 
end PET_D_FF;
クロック入力:CK
データ入力:D

データ出力:Q

アーキテクチャ宣言 architecture BEHAVIOR of PET_D_FF is 
begin 
  process ( CK ) begin 
   if ( CK'event and CK = '1' ) then 
    Q <= D; 
   end if; 
  end process; 
end BEHAVIOR;
1) 記述は出力信号Qの動作を記述すればよい

2) FFの出力QはクロックのLow->High変化時のみ変化するので、

 2-1) センシティビティリストにCKのみを入れる。
    これで、クロック変化時のみに限定

 2-2) if文でクロックのLow->High変化に限定

Clock'event and Clock= '1' 'eventアトリビュートを用いた立ち上りエッジの検出
Clock'event and Clock= '0' 'eventアトリビュートを用いた立ち下りエッジの検出
not Clock'stable and Clock = '1' 'stableアトリビュートを用いた立ち上りエッジの検出
not Clock'stable and Clock = '0' 'stableアトリビュートを用いた立ち下りエッジの検出
rising_edge(Clock) ファンクションコールを用いた立ち上りエッジの検出
falling_edge(Clock) ファンクションコールを用いた立ち下がりエッジの検出

関数rising_edge, falling_edgeは'X'から'1'への変化を検知しない。


DFFの記述方法1

P1: process (Clock)
begin
  if ( Clock'event and Clock= '1') then
    Y1 <= A1;
  end if;

  if ( Clock'event and Clock= '1') then
    Y2 <= A2;
  end if;
end process P1;


DFFの記述方法2

P2: process
begin
  wait until (Clock'event and Clock= '1');
    Y3 <= A3;
end process P2;


DFFの記述方法3

P3: process (Clock)
begin
  if rising_edge(Clock) then
    Y4 <= A4;
  end if;
end process P3;


DFFの記述方法4

P4: process
begin
  wait until rising_edge(Clock);
    Y5 <= A5;
end process P4:
 


P111コラム9 process文を用いたフリップフロップの記述


移動平均回路の設計

リスト avg4.vhd

テストベンチ SigGen.vhd

入力信号列 fm.txt

移動平均回路のVHDL記述

ライブラリ宣言 library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.STD_LOGIC_ARITH.all;
今回は入力信号として、2の補数表現を用いた正・負混合の信号を用いるので、P63コラム4の算術演算用パー-ケージで説明されているように、std_logic_arithを用いる。
エンティティ宣言 entity AVG4 is 
 port(CLK : in std_logic; 
    FMINPUT : in std_logic_vector(7 downto 0);
    AVGOUT : out std_logic_vector(7 downto 0));
end AVG4;
クロック入力:CLK
データ入力:FMINPUT(8ビット)

データ出力:AVGOUT(8ビット)

アーキテクチャ宣言 architecture RTL of AVG4 is 
signal FF1, FF2, FF3, FF4 : std_logic_vector(7 downto 0);
signal SUM : std_logic_vector(9 downto 0); 
begin 
4つのFF出力を定義

加算した信号を定義

-- SHIFT REGISTER 
 process(CLK) begin 
  if (CLK'event and CLK = '1') then 
   FF1 <= FMINPUT; 
   FF2 <= FF1; 
   FF3 <= FF2; 
   FF4 <= FF3; 
  end if; 
 end process; 
このような記述で4つのFFが生成される。

   FF1 :=FMINPUT; 
   FF2 := FF1; 
   FF3 := FF2; 
   FF4 := FF3; 

とすると、

   FF4 :=FMINPUT; 

と等価となり、FFは1個しか生成されない。

-- SUM 
SUM <= signed(FF1(7)&FF1(7)&FF1)
    +signed(FF2(7)&FF2(7)&FF2) 
    +signed(FF3(7)&FF3(7)&FF3)
    +signed(FF4(7)&FF4(7)&FF4); 
std_logic_arithを用いているので、P63コラム4の算術演算用パー-ケージで説明されているように、signedで型変換を行っている。

8ビットを10ビットに拡張する時に、”00”を前につけると、全て正の数になってしまうので、MSBを2ビットコピーしている。

-- DIVIDE BY 4 (SHIFT 2 bit), OUTPUT REGISTER
 process(CLK) begin 
  if (CLK'event and CLK='1') then 
   AVGOUT <= SUM(9 downto 2); 
  end if; 
 end process; 

end RTL;
出力のレジスタを記述している。

4の割り算を2ビット右シフトで実現している。

ここでは、四捨五入は用いず、切り捨てしている。

 


テストベンチのVHDL記述

ライブラリ宣言 library STD, IEEE; 
use STD.TEXTIO.all; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_textio.all;
教科書P85にTEXTIOパッケージの説明がある。

今回、テスト入力として他のテキストファイルに書かれた値を用いるので、ライブラリSTDを指定し、パッケージTEXTIOを呼び出している。

エンティティ宣言 entity TESTBENCH_FF1 is 
end TESTBENCH_FF1;
テストベンチであるので、中味は空である。
アーキテクチャ宣言 architecture SIM_DATA of TESTBENCH_FF1 is 

component AVG4 
  port(CLK : in std_logic; FMINPUT : in std_logic_vector(7 downto 0); 
  AVGOUT : out std_logic_vector(7 downto 0)); 
end component; 

signal FMINPUT : std_logic_vector(7 downto 0); 
signal AVGOUT : std_logic_vector(7 downto 0); 
signal CLK : std_logic := '0'; 

begin
今回テストされるAVG4回路(移動平均回路)をコンポーネント(部品)宣言している。

その他用いる信号を宣言している。

-- Sysetem CLK generation 
CLK <= not CLK after 5 ns;
システムクロックを発生している。

5nsごとに変化するので、クロック周期は10nsである。

CLKの初期値はsignal宣言のところで、定義されている。

-- DUT 
U1: AVG4 port map (CLK, FMINPUT, AVGOUT);
テストされる回路AVG4を置いている。
-- TEST VECTOR
P1: process
 file TEST_IN : text is in "fm.txt";
 variable LINE_IN : line;
 variable V_FMINPUT : std_logic_vector(7 downto 0);
begin
 readline(TEST_IN, LINE_IN);
 read(LINE_IN, V_FMINPUT);
 FMINPUT <= V_FMINPUT;
 wait for 10 ns;
 if endfile(TEST_IN) then
  wait;
 end if;
end process;

end SIM_DATA;

詳しくは、P85ページの説明とP87ページのリスト4.14を参考にしてください。

fm.txt

の値を読み込んで、10nsすなわち、毎サイクルごとに値をFMINPUT信号に代入している。

if文は終了条件。

configuration CFG_FF1 of TESTBENCH_FF1 is
 for SIM_DATA
 end for;
end CFG_FF1;
VHDLではひとつのエンティティに複数のアーキテクチャを
持たせることができるので、その割り当ての宣言。
必ず最上位階層に記述する必要がある。

 


実習4 移動平均回路の動作シミュレーション(1)

リスト avg4.vhd

テストベンチ SigGen.vhd

入力信号列 fm.txt

0) 作業ディレクトリに、上記3つのファイルをコピーする。

1) Sciroccoにて正常動作を確認せよ!


実習4(2)

2) クロック信号とその周期を指定する。

 

3) 回路の合成を行う。

Tool -> Design Optimization

デフォルトの設定でOK

これで、以下のような回路が合成される。

4) TOPの回路の中にあるすべてのBOX(他の回路が違うレベルにある)を展開(同一レベルに)する。

BOXをクリックして選択、

edit -> ungroup

を用いて展開する。

これをすべてのBOXに対して行う。

以下のような回路が得られる。

5)回路のクリティカルパスを表示する

tC > tKQ + 組み合わせ回路の遅延時間 +tS

が正常動作する条件である。

 

6)性能をレポートで確認する。

Analysis -> report で

area および timingをチェックしてApply

tKQ + 組み合わせ回路の遅延時間

全体として、

tC > tKQ + 組み合わせ回路の遅延時間 +tS

が成立する必要性を

tC ー tS > tKQ + 組み合わせ回路の遅延時間

で上記リストはチェックしている。

tC:サイクルタイムで CLK と示されている

tS:フリップフロップのセットアップタイムで リストでは -tSを library setup time としている。

上記リストでは

slack = (tC -tS) - (tKQ + 組み合わせ回路の遅延時間)

として、これが正であれば条件を満たしているので、 MET(満たした)という表示になっている。

 

最小の動作サイクル時間は tC - slack で求めることができる。

上記リストでは、50−40.8=9.2ns となる。

 


実習4(3)

7) クロックの周期のターゲット値を1として、再合成する。(なるべく、最小サイクル時間の小さい回路を合成せよ)

8) この時の最小の動作サイクル時間はいくらか?

 


実習4(4)

9) 回路を改造して、16ポイントの平均を計算する回路を設計せよ。

以下のものを提出すること。

以上