2.7 順序回路の記述 (教科書P44あたり)


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

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


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


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

シンボル

名称

意味

tC

サイクルタイム

動作する周期、スペックでは最小値が規定される。

tS

セットアップタイム

クロックエッジに対するデータを用意する時間、スペックでは最小値が規定される。

tH

ホールドタイム

クロックエッジに対してデータを保持する時間、スペックでは最小値が規定される。

tKQ

アクセスタイム

クロックエッジからデータ出力までの時間、スペックでは最大値が規定される。


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

 

教科書 2.7 (P44)

 

リスト2.11: RESETのないD−FF記述 (1)

 

リスト2.12: RESETのないD−FF記述 (2)

 

リスト2.13: 非同期RESETのあるD−FF記述

 

リスト2.14: 非同期SET・RESETのあるD−FF記述

 

リスト2.15: 同期RESETのあるD−FF記述

 


移動平均回路の設計

移動平均回路の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
データ入力:FMINPUT8ビット)

データ出力:AVGOUT8ビット)

アーキテクチャ宣言

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; 

と等価となり、FF1個しか生成されない。

-- 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”を前につけると、全て正の数になってしまうので、MSB2ビットコピーしている。

-- 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;

教科書P85TEXTIOパッケージの説明がある。

今回、テスト入力として他のテキストファイルに書かれた値を用いるので、ライブラリ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;

システムクロックを発生している。

nsごとに変化するので、クロック周期は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ではひとつのエンティティに複数のアーキテクチャを
持たせることができるので、その割り当ての宣言。
必ず最上位階層に記述する必要がある。

 


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

リスト avg4.vhd

テストベンチ SigGen.vhd

入力信号列 fm.txt

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

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

2) 回路の合成を行え 


HomeWork3

1)    上記内容をレポートにして提出せよ!

2)    16点平均をとる回路に再設計し、動作波形を示し、上記4点平均回路との回路規模を比較せよ。

以上