2007.11.12 集積回路工学 Matsuzawa Lab 1
東京工業大学
大学院理工学研究科
電子物理工学専攻
1. ハードウェア記述言語(VHDLで回路を設計)
1. ハードウェア記述言語(VHDLで回路を設計)
• HDL設計の手順や基本用語を学ぶ
RTLとは?Register Transfer Level
レジスタ間の転送関係を表現したレベル 慣例的に以下のことを行う -機能を、代入、if, caseなどで表現したもの -論理合成できる記述 -クロックを意識した記述 ゲートレベルとは? ゲート回路やフリップフロップなどの接続関係を示したもの ネットリストとも言う
2007.11.12 集積回路工学 Matsuzawa Lab 3
Hardware Description Language :ハードウェア記述言語
Hardware Description Language :ハードウェア記述言語 – Digital • Verilog-HDL, VHDL Verilog⇔C言語 VHDL⇔PASCALかADA VHDLは抽象性の高い記述 Verilogは具体的な回路図に近い記述 – Analog • Verilog-AMS, VHDL AMSなどにより動作記述が行える トップダウン設計を支援する トップダウン設計においては,アナログ部,デジタル部とも抽 象度の高い設計が必要となる。 デジタル部はゲート・レベルだけでなく,RTL(register transfer level)や動作レベルで設計する。 アナログ部はトランジスタ・レベルだけではなく,機能レベル のモデル(例えばオペアンプのマクロモデルなど),動作レベル のモデル(線形方程式や非線形方程式,信号フロー・グラフ,伝 達関数など)を扱う。 見た目はソフトウェアのプログラムに似ているが似て非なるもの
なぜ動作記述による設計なの?
なぜ動作記述による設計なの?
接続記述 動作記述 1cm2程度のシリコンチップ上に、数百万から1億のトランジスタを集積 している。そのため接続情報を記述している回路図エントリでは限界が あり、設計者は設計そのものよりも接続間違いによるケアレスミスを修 正することに時間がかかる。しかし動作記述を用いれば回路の表現に抽 象度が与えられ、さらに上位の設計を可能とするばかりでなく、設計の スピードが格段に向上する。 回路図エントリ module nandHDL記述 (Q,A,B,CK) inputA,B,CK;output Q ... endmodule2007.11.12 集積回路工学 Matsuzawa Lab 5
HDL設計の手順
HDL設計の手順
論理設計 論理合成 論理素子への ゲートの割り当て 物理レイアウト 回路図エントリ HDL記述 ネットリストmodule nand_DFF (Q,A,B,CK) inputA,B,CK;output Q ... endmodule module nand (Q,A,B,CK) inputA,B,CK;output Q ... endmodule 仕様設計 RTL設計 RTL検証 OK? 論理合成 ゲートレベル検証 OK? 物理設計 回路動作を HDLで記述 テストベンチを HDLで記述 動作確認 HDLからゲートレベル に変換 タイミング(遅延) 確認
VHDL文法体系
VHDL文法体系
VHDLの文法 回路記述 テストベンチ ライブラリ記述 回路記述 論理合成に適した記述をする 回路の種類ごとに適した記述スタイルがある テストベンチ 文法を満たしていれば、どんな記述でもよい 記述のテクニックを駆使できる2007.11.12 集積回路工学 Matsuzawa Lab 7
組み合わせ回路
順序回路 順序回路 順序回路は必ずクロックで同 期させること。もし非同期で 作ると伝播遅延から予期しな いパルス(ハザード)が発生す る。
2007.11.12 集積回路工学 Matsuzawa Lab 9 RTL設計例 RTL設計例 コンポーネント宣言 下位コンポーネントの接続 std_logicのベクタ型 (ビット幅のあるデータタイプ) 接続する下位コンポーネントの入出 力信号を定義したもの 4ビット (ビット3~ビット0)
RTL設計例 RTL設計例 センシティビティリスト (基本的に入力信号はすべてここに記述する) 条件式 if文はアーキテクチャ内に記述できず、 process文内に記述する 定数表現 1ビット ‘0’ 複数ビット “0101” バスとワイヤーでは囲む物が違うこと に注意すること。
2007.11.12 集積回路工学 Matsuzawa Lab 11
4ビット(16進)同期式カウンタ
4ビット(16進)同期式カウンタ
Q
0Q
1Q
2Q
30 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 0
1
1 0
0
1 1
0 0
1
1 0
0
1 1
0 0
0
0
1
1
1 1
0 0
0
0
1
1
1 1
0 0
0
0
1
1
1 1
1
1 1 1
0 0 0 0
4 5
6
7
8
9
10
0 1 2 3
11 12 13 14 15
4ビット(16進)同期式カウンタ
4ビット(16進)同期式カウンタ
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; 算術演算パッケージを呼び出 し パッケージの呼び出し パッケージとは? 定数、演算子、データタイプなどの定義をまとめたもの おまじないのようなのであるが、これを指定しないとデフォルトの物が 設定されてしまうので、ここはちゃんと設定すること2007.11.12 集積回路工学 Matsuzawa Lab 13
4ビット(16進)同期式カウンタ
4ビット(16進)同期式カウンタ
ibrary IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; モジュールの入出力ポート及びその属性を定義 entity COUNT4 is port ( CLK, RESET : in std_logic;COUNT : out std_logic_vector( 3 downto 0 ) ); end COUNT4; エンティティ宣言 (入出力の定義) エンティティ名 方向 ポート宣言 データタイプ std_logicのベクタ型 (ビット幅のあるデータタイプ) 回路のインターフェース 部分を定義 接続する下位コンポーネントの入出力信号を定義したもの
architecture RTL of COUNT4 is
signal COUNT_IN : std_logic_vector ( 3 downto 0 ); begin
COUNT <= COUNT_IN;
process ( CLK, RESET ) begin if ( RESET = '1' ) then
COUNT_IN <= "0000";
elsif ( CLK'event and CLK = '1' ) then COUNT_IN <= COUNT_IN + '1'; end if; end process; end RTL;
4ビット(16進)同期式カウンタ
4ビット(16進)同期式カウンタ
ibrary IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT4 is port ( CLK, RESET : in std_logic;COUNT : out std_logic_vector( 3 downto 0 ) ); end COUNT4; 同時処理文 アーキテクチャ内に記述する文 記述の順序に関係なく、同時に処理される 順次処理文 プロセス文やプロシージャ内に記述する文 記述順に処理される
2007.11.12 集積回路工学 Matsuzawa Lab 15 RTL設計例 RTL設計例 architecture ~ of ~ is begin 同時処理文 下位コンポーネント接続 プロセス文 信号代入文 条件付き信号代入文(when~else) プロシージャ呼び出し ジェネレート文 など end ~; process …. begin 順次処理文 信号代入文 変数代入文 if case wait文 ループ文 プロシージャ呼び出し など end process; 同時処理文 アーキテクチャ内に記述する文 記述の順序に関係なく、同時に処理される 順次処理文 プロセス文やプロシージャ内に記述する文 記述順に処理される
4ビット(16進)同期式カウンタ
4ビット(16進)同期式カウンタ
ibrary IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT4 is port ( CLK, RESET : in std_logic;COUNT : out std_logic_vector( 3 downto 0 ) ); end COUNT4; 4ビットは0から3と書く ことに注意 内部変数を外部変数に代入 VHDLでは”OUT”の属性の信号はエンティ ティ内部で再びその値を使用できない architecture RTL of COUNT4 is
signal COUNT_IN : std_logic_vector ( 3 downto 0 ); begin
COUNT <= COUNT_IN;
process ( CLK, RESET ) begin if ( RESET = '1' ) then
COUNT_IN <= "0000";
elsif ( CLK'event and CLK = '1' ) then COUNT_IN <= COUNT_IN + '1'; end if; end process; end RTL; アーキテクチャ名 信号代入文 エンティティ名 アーキティクチャ (構造、動作の記述) 回路の構造や 動作を記述 1つのエンティティに対して、複 数のアーキテクチャを定義できる
2007.11.12 集積回路工学 Matsuzawa Lab 17 ibrary IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT4 is port ( CLK, RESET : in std_logic;
COUNT : out std_logic_vector( 3 downto 0 ) );
end COUNT4;
architecture RTL of COUNT4 is
signal COUNT_IN : std_logic_vector ( 3 downto 0 ); begin
COUNT <= COUNT_IN;
process ( CLK, RESET ) begin if ( RESET = '1' ) then
COUNT_IN <= "0000";
elsif ( CLK'event and CLK = '1' ) then COUNT_IN <= COUNT_IN + '1'; end if; end process; end RTL;
4ビット(16進)同期式カウンタ
4ビット(16進)同期式カウンタ
process文 CLKもしくはRESETが変化したときに活性化 され記述の上から順に実行される。 If文、case文などの順次処理文はこのプロセス文の中で記述す る。それに対してプロセス文の外の記述では値が変化すれば、 常に再代入されて動作する。この回路記述ではCOUNT_INが 変化すればCOUNTは変化後の値がいつでも再代入される。 CLK’ event and CLK=’1’ CLK信号の立ち上がり時を検出 センシティビティリスト (基本的に入力信号はすべてここに記述する) 条件式 定数表現 1ビット ‘0’ 複数ビット “0101”データ・タイプ
データ・タイプ
信号や定数にはデータタイプ(型)がある。 データタイプによって、取り得る値の種類が決まる。 データタイプが異なる信号や定数間での直接代入は出来ない。(変換が必要) データタイプはパッケージの中で定義されている。 A: std_logic B: integer A<=3; A <=‘11’; B<=“1011”; B<=11; ○ ○ × × 3 × “11”; 11 ד1011”;2007.11.12 集積回路工学 Matsuzawa Lab 19
ADDER
ADDER
Half Adder Half AdderA
B
S
CO
CIN
Full Adder
コンポーネント宣言 下位コンポーネントの接続 接続する下位コンポーネントの入出 力信号を定義したもの インスタンス名:コンポーネント名 port map (ポートリスト) コンポーネント化 コンポーネント化
2007.11.12 集積回路工学 Matsuzawa Lab 21