4.1多ビット加算器 P63

琉球大学情報工学科 和田 知久



算術演算子を用いた4ビット加算器のVHDL記述 (演習4.3、リスト4.4) 

リスト4.4(コピー)

以下にもファイルがある!
/net/home/teacher/wada/public_html/cadpub/adder4.vhd

もう少し細かく見ると

ライブラリ宣言 library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
ライブラリ宣言、STD_LOGICを使用する場合に必要
いつもSTD_LOGICを使用するのでいつも必要!

IEEE.std_logic_unsignedは、std_logic_vector型で
符号ビットなしの演算を行うためのパッケージである。

ENTITY宣言
回路の名前と
入出力信号
entity ADDER4 is エンティティ宣言
port ( A, B : in std_logic_vector(3 downto 0);
        S      : out std_logic_vector(4 downto 0));
ポート宣言(入出力信号と信号のデータタイプを定義)
入力は4ビット、出力は5ビット
end ADDER4; エンティティ終了。";"忘れるな!
回路の中味の記述 architecture BEHAVIOR of ADDER4 is アーキテクチャ宣言
begin
S <= ('0' & A) + ('0' & B);
end BEHAVIOR;
算術演算”+”を用いて加算を行う場合、左辺のビット長と
右辺のビット長は一致する必要がある。
4ビットどうしの和は5ビットになる可能性があるので、
右辺のMSBに’0’を連接してビット長を調整している。

テストベンチによる検証 P89

テストベンチ

以下にもファイルがある!
/net/home/teacher/wada/public_html/cadpub/adder4_test.vhd

もう少し細かく見ると

ライブラリ宣言 library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
conv_std_logic_vector関数を使うために、 
IEEE.std_logic_arithパッケージが必要
エンティティ entity TESTBENCH_HA is 
end TESTBENCH_HA;
エンティティ宣言
-- テストベンチのエンティティは空
アーキテクチャ architecture SIM_DATA of TESTBENCH_HA is  
component ADDER4
port ( A, B : in std_logic_vector(3 downto 0);
    S  : out std_logic_vector(4 downto 0));
end component;
以下の用いる回路部品(コンポーネント)の宣言
signal SA, SB : std_logic_vector(3 downto 0);
signal SS : std_logic_vector(4 downto 0);
新たに使用する信号の宣言
begin
-- design under test
M1 : ADDER4 port map (SA, SB, SS);
-- test vector
P1 : process
begin
  for I in 0 to 15 loop
    for J in 0 to 15 loop
      SA <= conv_std_logic_vector(I,4);
      SB <= conv_std_logic_vector(J,4);
      wait for 10 ns;
    end loop;
  end loop;
end process;
end SIM_DATA;
実際のテストベンチ回路

M1がテストされる回路

P1が入力信号を作成する記述
ここでは2重のforループを用いて入力値を作成している。
入力信号は
std_logic_vectorで、ループ変数I,Jは整数なので、
conv_std_logic_vector(I,4)関数で、整数Iを4ビットの
std_logic_vectorに変換している。

教科書P89 リスト4.17に同様の例がある。

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

実習 VHDL記述の構文解析(1)

1) 上記2つのファイルを自分のpw上のディレクトリーにコピーして作業を始めよ。

adder4.vhd リスト4.4

adder4_test.vhd テストベンチ

2) VHDLアナライザ(vhdlan)で4ビットアダーの構文解析をする。

% vhdlan adder4.vhd

エラーメッセージ等があればエラーを修正して、再コンパイルする。
コンパイル後に、.sim, .mra 等のファイルができるので確認する。

3) テストベンチファイル adder4_test.vhdの内容を理解し、構文解析をする。

% vhdlan adder4_test.vhd

4) Sciroccoコンパイラを用いてシミュレーション用実行ファイル scsim を作成する。コンパイラの引数は、テストベンチで宣言したコンフィグレーション名を用いる。

% scs CFG_ADDER4

****** 以上でシミュレーションの準備は終了 *****


実習 VHDLシステムシミュレータでの動作確認(2)

5) VHDLシステムシミュレータを Scirocco を起動する。

% scirocco &

6) Scirocco を起動すると Menu Window が現れるので、 Interactive ボタンを押す。

7) Interactive ボタンを押すと、Simulator Invocation Dialog Window が現れるので、Type メニューから Scirocco を選びOKボタンを押す。この時、Interactive Window が現れる。

8) Menu Window の Hierarchy ボタンおよび Waveformボタンを押し、Hierarcy WindowとWaveform Windowを開く。

9) Hierarchy WindowのHierarchy欄で、テストベンチのentity名を選択すると、Signal欄に信号線名が表示される。そこから必要な信号を選択し、Waveform Windowへドラッグ&ドロップする。

10) Interactive Windowのシミュレーションタイムを適当な値(200)に設定して、すぐ右のOKボタンを押すと、Waveform Windowにシミュレーション波形が表示される。

4ビット入力最大の15+15が30になっていることを確認せよ。

11) Menu Window のExitボタンで全てを終了できる。


実習 回路を合成する(3)

12) design_visionで回路を読み込み 回路合成をする。

以下のような回路、面積になる。

13) 回路の遅延時間を調べる。

Timing -> Report Timing path

以下のようなログファイルが得られる。

adder4/timing1.txt

data arrival time が回路の動作スピードである。


実習 高速な回路を合成する(4)

14) 入力ピンから出力ピンへの遅延時間の目標値を0.0に設定する

Attribute -> Design constraints -> Timing Constraints

で以下の図のウインドウがでる。

CNTLを押してからOPTIONを押しながら、マウスで回路の入出力信号をクリックし、

Fromの方にすべての入力信号 A[*]とB[*]を入力する。

Toの方にすべての出力信号 S[*]を入力する。

CNTLを押してからOPTIONを押しながら、マウスでクリックすると複数を選択できる。

Max rise を 0.0 として、OK

そして、回路を合成すると、上記速度=0.0が目標として回路合成される!

これで、回路高速な回路に再合成される。

15) 回路の遅延時間を調べる。

Timing -> Report Timing path

以下のようなログファイルが得られる。

adder4/timing2.txt

data arrival time が回路の動作スピードである。

以上


HW2 WEBCLASSに提出すること!

1)[オーバーフローのチェック]

上記実習の例では2つの4ビット入力を加算して5ビット出力を出力しているが、入出力すべて4ビットに改造し、

S <= ('0' & A) + ('0' & B);

の部分を

S <= A + B;

のように変更した場合、たとえばA=15、B=15ではSは4ビットでは表示できない値になる。実際にSが4ビット幅の場合Sの値はどうなるか?

上記改造前と後で回路面積がどのように変化したか調べよ。

2)[ビット幅変更による回路の変化]

上記実習の例を8ビット入力+8ビット入力=9ビット出力になるように改造し、SCIROCCOで動作確認を行い、速度最速の回路合成を行え。

レポートには以下の内容を含むこと

以上