1/16
VHDL を使った
PLD 設計のすすめ
2001/7/13 大久保 弘崇
http://www.aichi-pu.ac.jp/ist/~ohkubo/ 2/16VHDL 設計のメリット
汎用の設計になる
(どこのデバイスにも搭載可能)
設計の再利用が促進
MIL記号のCADでの設計との比較。
Verilog-HDL などでも別に同じ。
メーカー独自のHDLは、今となっては特にメリットはない。
PLD 利用のメリット
小型化・高集積化
回路の修正が容易
3/16PLD 制作の作業フロー
動作記述
*.vhd
構成ファイル
論理合成
配置配線
テストベンチ
*.vhd
シミュレーション
動作検証
4/16VHDL 記述の概略 : 階層構造
◇エンティティ:インタフェースを定義
◇アーキテクチャ:実現を定義
◇コンポーネント:エンティティを利用
5
5/16
エンティティ:インタフェースを定義
entity HALFADD is
port ( A,B : in std_logic ;
S,C : out std_logic ) ;
end HALFADD ;
A
B
S
C
HALFADD
6/16A
B
S
C
HALFADD
アーキテクチャ:エンティティの実現
architecture ARCH1 of HALFADD is
begin
S <= A xor B ;
C <= A and B ;
end ARCH1 ;
ひとつのエンティティに対して、いくつもアーキテクチャを
定義することができる。
例) 加算回路のエンティティに、キャリーの繰り上げ方の異
なる複数のアーキテクチャが宣言できる。
ARCH1
7/16コンポーネント:部品の呼び出し
entity FULLADD is
port (A,B,Ci : in std_logic ;
S,Co
: out std_logic ) ;
end FULLADD ;
architecture FA1 of FULLADD is
component HALFADD
port (A,B : in std_logic ;
S,C : out std_logic ) ;
end component ;
(つづく)
8/16signal S1, C1, C2 : std_logic ;
begin
HA1 : HALFADD
port map(A=>A,B=>B,S=>S1,C=>C1);
HA2 : HALFADD
port map(S1,Ci,S,C2) ;
Co <= C1 or C2 ;
end FA1 ;
(
architecture FA1
のつづき...)
B
Ci
S1
C1
C2
S
Co
FULLADD
FA1
HA1
A B S CHA2
A B S CA
9/16
VHDL のデータ型
std_logic 'U' :
Unknown
'X' :
Undefined
'0' :
Low
'1' :
High
'Z' :
Hi-Z
'-' :
Don't Care
std_logic_vector
Integer
Character
ユーザ定義型
(
列挙・部分値
)
0/16ベクタの例
entity ADDER8bit isport (A,B : in std_logic_vector (7 downto 0) ; S : out std_logic_vector (7 downto 0) ; Co : out std_logic ) ;
[中略]
signal C : std_logic_vector (8 downto 0) ;
L : for i in 0 to 7 generate FAx : FULLADD
port map (A=>A(i),B=>B(i),C=>C(i+1),S=>S(i)); end generate; C(0) <= '0' ; Co <= C(8) ; 1/16
プロセス:逐次処理風の記述が可能
architecture A1 of SELECT is
begin
PROC1 : process (A,B,SEL)
begin
if SEL='1' then Y <= A ;
else Y <= B ;
end if ;
end process ;
end A1 ;
センシティビィティリスト
A
B
SEL
Y
プロセス文は、センシティビティリストの信号が変化したとき、プロセス内で 信号代入している(出力)信号を対応して変化させる回路を生成する。 センシティビティリストの信号が変化しない間は、それ以外の(入力)信号が 変化しても、出力は変化せず先の値を保持する。 そのような信号をもつプロセスは一般に順序回路に合成されるが、ここの 例のVHDLプログラムのように、組合せ回路で充分表現できるものもある。そ ういうプロセスはちゃんと組合せ回路に合成される(はず)。 2/16状態の保持 : CPU 内レジスタの例
architecture REG1 of REGISTER is
signal content : std_logic_vector (7 downto 0) ; begin
write : process ( reset, clock )
if reset = '1' then content <= '00000000' ;
elsif ( clock'event and clock = '1') then if we='1' then content <= inbus ; endif ;
endif ; end process ;
outbus <= content when oe='1' else 'ZZZZZZZZ' ; end REG1 ;
値を入れる信号線
非同期リセット
立ち上がり動作
Ci=>C(i), Co3/16
検証もVHDLの枠組みで
テスト対象の
VHDL プログラム
テストパターン
結果を
比較
テストベンチのVHDLプログラム
・ファイル入出力
・wait, after, assert 構文
・配置配線後のタイミング検証も
合成不可能なことがらもVHDLは記述可能
4/16
実演1
HalfAdd → FullAdd → 4bit Adder
実演2
プロジェクト作成、シミュレーション、制約、合成、ダウンロード コンポーネント設計、有限状態機械(FSM) カウンタ クロック 速度指定 数値入力 比較器 4 4 リセット eq 内部状態 状態 遷移 出力生成 Finite State MachineLED点滅 5/16
参考文献
HDLによるデジタル設計の基礎
桜井 至, テクノプレス, 1997, 3,200円
実践的に例から入っていくのでとっつきやすい。Verilog-HDL の例 も平行して掲載されている。詳細に入っていくと物足らなくなる。VHDLによるハードウェア設計入門
長谷川 裕恭, CQ出版社, 1995, 2300円
変に合成結果の詳細に入り込んでいるところがあるが、 一通りのことが説明されている。VHDL言語入門, Jayaram Bhasker,
CQ出版社, 1995, 3200円
訳本。VHDL, Douglas L.Perry, ASCII, 1996, 4500円
これも訳本。この中で一番字が多い。 6/16関連URL
Xilinx
www.xilinx.co.jp www.xilinx.comAltera
www.altera.co.jp www.altera.comModelTech
www.model.comビーアイティ
www3.famille.ne.jp/~bit/Fri Jul 13 01:58:52 2001 rotator.vhd page 1
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL; 3
4 entity rotator is
5 Port ( pulse : in std_logic;
6 led : out std_logic_vector(7 downto 0)); 7 end rotator;
8
9 architecture behavioral of rotator is
10 type tmystate is (s0,u1,u2,u3,u4,u5,u6,s7,d6,d5,d4,d3,d2,d1); 11 signal mystate : tmystate ;
12 begin
13 -- state machine 14 process(pulse) 15 begin
16 if (pulse’event and pulse = ’1’) then 17 case mystate is 18 when s0 => mystate <= u1 ; 19 when u1 => mystate <= u2 ; 20 when u2 => mystate <= u3 ; 21 when u3 => mystate <= u4 ; 22 when u4 => mystate <= u5 ; 23 when u5 => mystate <= u6 ; 24 when u6 => mystate <= s7 ; 25 when s7 => mystate <= d6 ; 26 when d6 => mystate <= d5 ; 27 when d5 => mystate <= d4 ; 28 when d4 => mystate <= d3 ; 29 when d3 => mystate <= d2 ; 30 when d2 => mystate <= d1 ; 31 when d1 => mystate <= s0 ; 32 end case; 33 end if ; 34 end process ; 35 -- signal output 36 process(mystate) 37 begin 38 -- led <= "00000000" ; 39 case mystate is 40 when s0 => led <= "10000000" ; 41 when u1 => led <= "01000000" ; 42 when u2 => led <= "00100000" ; 43 when u3 => led <= "00010000" ; 44 when u4 => led <= "00001000" ; 45 when u5 => led <= "00000100" ; 46 when u6 => led <= "00000010" ; 47 when s7 => led <= "00000001" ; 48 when d6 => led <= "00000010" ; 49 when d5 => led <= "00000100" ; 50 when d4 => led <= "00001000" ; 51 when d3 => led <= "00010000" ; 52 when d2 => led <= "00100000" ; 53 when d1 => led <= "01000000" ; 54 end case; 55 end process ; 56 57 end behavioral;
Fri Jul 13 01:35:32 2001 comparate.vhd page 1
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL; 3
4 entity comparate is
5 Port ( a,b : in std_logic_vector(3 downto 0); 6 eq : out std_logic);
7 end comparate; 8
9 architecture behavioral of comparate is 10
11 begin
12 eq <= ’1’ when a = b else ’0’ ; 13 end behavioral;
Fri Jul 13 02:03:12 2001 kr.vhd page 1 1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 4 entity kr is 5 Port ( clk : in std_logic;
6 inp : in std_logic_vector(3 downto 0); 7 led : out std_logic_vector(7 downto 0);
8 mon : out std_logic_vector(3 downto 0)); 9 end kr;
10
11 architecture kr1 of kr is 12 component counter is
13 Port ( clk,rst : in std_logic;
14 val : out std_logic_vector(3 downto 0)); 15 end component;
16 component comparate is
17 Port ( a,b : in std_logic_vector(3 downto 0); 18 eq : out std_logic);
19 end component;
20 component rotator is
21 Port ( pulse : in std_logic;
22 led : out std_logic_vector(7 downto 0)); 23 end component;
24 signal countval : std_logic_vector(3 downto 0); 25 signal pulse : std_logic ;
26 begin
27 CT1 : counter port map (clk,pulse,countval) ; 28 CP1 : comparate port map (countval,inp,pulse) ; 29 RT1 : rotator port map (pulse,led) ;
30 mon <= countval ; 31 end kr1;
Fri Jul 13 01:33:42 2001 counter.vhd page 1
1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 use IEEE.STD_LOGIC_UNSIGNED.ALL; 4 5 entity counter is 6 Port ( clk,rst : in std_logic;
7 val : out std_logic_vector(3 downto 0)); 8 end counter;
9
10 architecture ct1 of counter is 11
12 signal value : std_logic_vector(3 downto 0) ; 13
14 begin 15
16 process(clk) 17 begin
18 if (clk’event and clk=’1’) then 19 if rst=’1’ then 20 value <= "0000" ; 21 else 22 value <= value + "0001" ; 23 end if; 24 end if ; 25 end process ; 26 27 val <= value ; 28 29 end ct1;