組み込みシステム基礎 資料 - 鳥取大学工学部知能情報工学科 計算機B

2014/09/28 版
組み込みシステム基礎
~ VHDL 入門 ~
鳥取大学 工学部
知能情報工学科 菅原 一孔
1
HDL設計の手順
設計
仕様
RTL
設計
RTL
検証
ok?
HDLで回路を記述
HDLのまま動作確認:
機能の検証
RTL:Register Transfer Level
レジスタ間の転送関係を表現したレベル
• 機能を,代入,if, case などで表現したもの
• 論理合成できる記述
• クロックを意識した記述
論理
合成
ゲー
トレ
ベル
検証
レイアウト
ツールへ
ok?
HDLから回路へ変換
回路で動作確認:
タイミングの検証
ゲートレベル:Gate Level
• ゲート回路やフリップフロップ等
の接続関係を示したもの
• ネットリストともいう
2
VHDLの書き方
3
データタイプ
std_logic
integer
'0'
0
'W'
弱い不定値
'1'
1
'L'
弱い0
'U'
未定値
'H'
弱い1
'X'
不定値
'-'
ドントケア
'Z'
ハイ イン
ピーダンス
boolean
2 で表される符
号付の値
-2
true
真
false
偽
~ 2 -1
注意:'X'は小文字 'x'ではエラー
回路記述で使うデータタイプ
テストベンチで使うデータタイプ
std_logic
1ビット
time
時間
std_logic_vector
複数ビット
real
実数
integer
整数
character
文字
boolean
論理値(真か偽)
string
文字列
text
ファイルアクセス
4
VHDLによる回路記述の基本構成
CIRCUIT.vhd
: エンティティ名はファイル名と一致
ライブラリ宣言
バッケージ呼び出し
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all
エンティティ宣言
entity エンティティ名 is
入出力ピンの記述;
end エンティティ名;
entity CIRCUIT is
port(入出力ピンの記述 );
end CIRCUIT;
アーキテクチャ宣言
architecture アーキテクチャ名
of エンティティ名 is
回路の動作の記述;
endアーキテクチャ名;
architecture RTL of
CIRCUIT is
回路の動作の記述;
end RTL;
5
エンティティ宣言
~入出力端子の宣言
port文
port(信号名,信号名:方向 データタイプ(型);
信号名,信号名:方向 データタイプ(型);
…
信号名,信号名:方向 データタイプ(型));
例
3
A
X
B
Y
CIRC1
6
entity CIRC1 is
port( A : in std_logic;
B : in std_logic_vector(2 downto 0);
X : out std_logic;
Y : out std_logic_vector(5 downto 0));
end CIRC1;
6
port文の方向とデータタイプ(型)
方向
データ タイプ (型)
in
入力
out
出力 (内部参照は不可)
std_logic
inout
双方向
buffer
出力 (内部参照可)
std_logic_vector
linkage 方向指定なし
注意:
outの指定したポートは内部で参照できない
⇒ 式の右辺には書けない
例:
port (Q:out std_logic);
Q <= Q + '1';
7
アーキテクチャ宣言 ~回路構造の記述
architecture アーキテクチャ名 of エンティティ名 is
-- process文を使わない組合せ回路の記述;
同時信号代入文;
下位コンポーネント宣言;
-- component文
-- prosess文を使った組合せ回路の記述 *1
process(センシティビティリスト) begin
回路記述
end process;
-- 順序回路の記述 *2
process(センシティビティリスト) begin
回路記述
end process;
end アーキテクチャ名;
8
アーキテクチャ宣言の種類
A: process文を使わない回路記述
⇒ 同時信号代入文による組合せ回路の記述
B: process文を使った回路記述
⇒ B1 順次信号代入文による組合せ回路の記述
B2 順序回路の記述
① 回路の構造による回路記述
② 回路の動作による回路記述
③ 階層構造による回路記述
9
⇒ component文
:下位コンポーネント接続
信号,変数,定数
文法
信号
signal 信号名,信号名,...: データタイプ [:= 初期] ;
宣言場所
アーキテクチャの宣言部
代入記号
<=
文法
変数
定数
variable 変数名,変数名,...: データタイプ [:= 初期] ;
宣言場所
プロセス文の宣言部
代入記号
:=
文法
宣言場所
constant 定数名,定数名,...: データタイプ [:= 初期] ;
アーキテクチャ,プロセス文の宣言部
10
演算子
論理演算子
算術演算子
関係演算子
not
NOT
+
加算 プラス記号
=
等しい
and
AND
-
減算 マイナス記号
/=
等しくない
or
OR
*
乗算
<
小さい
/
除算
<=
小さいか等しい
nand NAND
nor
NOR
mod
モジュロー
>
大きい
xor
ExOR
rem
剰余
>=
大きいか等しい
**
累乗
xnor ExNOR
演算子
方向
sll
左
絶対値
srl
右
連接
sla
左
sra
右
rol
左
ror
右
その他の演算子
abs
&
シフト演算子
注意:
実際の設計では赤字は使用せず
動作
論理シフト
シフトもとには0
算術シフト
シフトもとは不変
回転シフト
11
LSBとMSBが結合して回転
信号代入文
信号代入文
否定
: not 信号名
2項演算 : 信号名 <= 信号名
二項演算子
2項演算子 信号名
and
or
例
Q<=(D1 and S) or (D0 and (not S));
nand
nor
xor
コメント
xnor
-- (ハイフン2つ,複数行にわたるコメントの記述はない)
信号名などの識別子
大文字,小文字は区別しない
最初は英文字
英字,数字,アンダースコア(最後の文字や,連続した使用はできない)
12
演算子の優先順位
高
優先
順位
低
論理否定など not
**
乗除算,剰余
* /
mod rem
符号
+ -
加減算,連接
+ -
シフト演算
sll srl
sla
関係演算
= /= <
<=
論理演算
and or nand
abs
&
sra rol ror
>
>=
nor xor xnor
注意:
演算順で結果が異なる場合文法エラー
例)
signal A,B,C,Q: std_logic;
Q<=A xor B xor C;
--文法エラー
正しくは
Q<=(A xor B) xor C;
Q<=A xor (B xor C);
13
集合体
()で囲まれ,カンマで区切られた要素の集合
signal EN:std_logic;
signal A,B:std_logic_vector(3 downto 0);
A<=(EN,EN,'0',EN);
A<=(3=>EN,2=>EN,1=>'0',0=>EN);
A<=EN & EN & '0' & EN;
A<=(3 downto 0 =>EN);
A<=EN & EN & EN & EN;
B<=('0','0','0','1');
B<=(0=>'1',others=>'0');
B<="0001";
14
アトリビュート (属性)
信号や変数に付加された値
シングルクオートにより,値を得る
アトリビュート
S'event
S'stable
対象
信号
A'left
A'right
A'range
A'length
配列型の信号,
変数,定数
意味
変化があったか
値
安定していたか
true,
false
最左ビットの位置
整数
最右ビットの位置
ビット幅の範囲
レンジ
ビット幅
整数
例)
signal A:std_logic_vector(15 downto 0);
A'left
15
A'right
0
A'range
15 downto 0
A'length
16
15
A: process文を使わない組合せ回路
16
A:3つの信号代入文(1),(2)
SUBST1.vhd
SUBST2.vhd
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SUBST1 is
port(A0:in std_logic;
A1:in std_logic;
Z0:out std_logic;
Z1:out std_logic);
end SUBST1;
entity SUBST2 is
port(A0,A1:in std_logic;
Z0:Z1:out std_logic);
end SUBST2;
architecture Behavioral of SUBST1 is
begin
Z0<=A0;
Z1<=A1;
end Behavioral;
architecture Behavioral of SUBST2 is
begin
Z0<=A0;
Z1<=A1;
end Behavioral;
17
A: 3つの信号代入文(3)
SUBST3.vhd
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SUBST3 is
port(A:in std_logic vector(1 downto 0);
Z:out std_logic vector(1 downto 0));
end SUBST3;
architecture Behavioral of SUBST3 is
begin
Z<=A;
end Behavioral;
2
A(1:0)
Z(1:0)
2
18
signal文 ~信号の宣言
signal 信号名:データタイプ(型)
エンティティ宣言
アーキテクチャ宣言①
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
architecture Behavioral of SUBST is
begin
Z<=(A and B) or (not C);
end Behavioral;
entity SUBST is
port(A,B,C:in std_logic;
Z:out std_logic);
end SUBST;
アーキテクチャ宣言②
architecture Behavioral of SUBST is
signal X,Y:std_logic;
begin
内部信号
X<= A and B;
signal文
Y<= not C;
Z<= X or Y;
end Behavioral;
19
半加算器 ~構造による回路記述
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity HA is
port(A,B:in std_logic;
S,C:out std_logic);
end HA;
architecture Behavioral of HA is
begin
S<= A xor B;
C<= A and B;
end Behavioral;
20
半加算器 ~動作による回路記述
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity HA is
port(A,B:in std_logic;
S,C:out std_logic);
end HA;
architecture Behavioral of HA is
signal SUM:std_logic_vector(1 downto 0);
begin
SUM<=('0' & A) + ('0' & B);
S<= SUM(0);
C<= SUM(1);
end Behavioral;
連結演算子'&'
ビット毎の信号代入
21
全加算器 ~構造による回路記述
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity FA is
port(A,B,CI:in std_logic;
S,CO:out std_logic);
end FA;
architecture Behavioral of FA is
signal S_O,C_O,C_I:std_logic;
begin
S_O<= A xor B;
C_O<= A and B;
C_I<= CI and S_O;
S<=CI xor S_O;
CO<=C_I or C_O;
end Behavioral;
22
全加算器 ~動作による回路記述
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity FA is
port(A,B,CI:in std_logic;
S,CO:out std_logic);
end FA;
architecture Behavioral of FA is
signal SUM:std_logic_vector(1 downto 0);
begin
SUM<=('0' & A) + ('0' & B) + ('0' & CI);
S<= SUM(0);
CO<= SUM(1);
end Behavioral;
23
加算回路
4
5
A
4
B
C
右辺と左辺のビット幅が異なると文法エラー
例 C<=A+B;
A,BとCのビット幅が異なる
符号付回路 (符号拡張)
C<=(A(A'left) & A)+(B(B'left) & B);
符号なし回路
C<=('0' & A)+('0' & B);
24
③: 階層記述
25
全加算器 階層記述
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity FA is
port(A,B,CI:in std_logic;
S,CO:out std_logic);
end FA;
architecture Behavioral of FA is
component HA is
port(A,B:in std_logic;
S,C:out std_logic);
end component;
signal C1,C2,S1:std_logic;
begin
U1:HA port map(A,B,S1,C1);
U2:HA port map(S1,CI,S,C2);
CO<=C1 or C2;
end Behavioral;
26
4ビット加算器 階層記述 エンティティ宣言
エンティティ宣言
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity ADD_4 is
port(A,B:in std_logic_vector(3 downto 0);
CI:in std_logic;
Z:out std_logic_vector(3 downto 0);
CO:out std_logic);
end ADD_4;
B(0) A(0)
CI
A S
B
CI CO
B(1) A(1)
C1
Z(0)
A S
B
CI CO
B(2) A(2)
C2
Z(1)
A S
B
CI CO
B(3) A(3)
C3
Z(2)
A S
B
CI CO
CO
Z(3)
27
4ビット加算器 階層記述 アーキテクチャ宣言
アーキテクチャ宣言
architecture Behavioral of ADD_4 is
component FA is
port(A,B,CI:in std_logic;
S,CO:out std_logic);
end component;
signal C1,C2,C3:std_logic;
begin
U3:FA port map(A(3),B(3),C3,Z(3),CO);
U2:FA port map(A(2),B(2),C2,Z(2),C3);
U1:FA port map(A(1),B(1),C1,Z(1),C2);
U0:FA port map(A(0),B(0),CI,Z(0),C1);
end Behavioral;
28
4ビットセレクタ ~階層構造による回路の記述~
29
1ビットセレクタ ~構造による回路記述~
D0
Q
D1
S
S
Q
0
D0
1
D1
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SEL2TO1 is
port(D0,D1,S:in std_logic;
Q:out std_logic);
end SEL2TO1;
architecture RTL of SEL2TO1 is
begin
Q<=(D1 and S) or (D0 and (not S));
end RTL;
30
4ビットセレクタ
コンポーネント:順番による接続
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
ライブラリ宣言
entity SEL4_CMP is
port(DL,DH:in std_logic_vector(3 downto 0);
SEL:in std_logic;
DOUT:out std_logic_vector(3 downto 0));
end SEL4_CMP;
エンティティ宣言
(入出力の定義)
architecture RTL of SEL4_CMP is
componet SEL2TO1
port(DO,DI,S:in std_logic;
Q:out std_logic);
begin
S0:SEL2TO1 port map(DL(0),DH(0),SEL,DOUT(0));
S1:SEL2TO1 port map(DL(1),DH(1),SEL,DOUT(1));
S2:SEL2TO1 port map(DL(2),DH(2),SEL,DOUT(2));
S3:SEL2TO1 port map(DL(3),DH(3),SEL,DOUT(3));
end RTL;
アーキテクチャ
(構造,動作の記述)
順番による接続
31
4ビットセレクタ
コンポーネント:名前による接続
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SEL4 is
port(DL,DH:in std_logic_vector(3 downto 0);
SEL:in std_logic;
DOUT:out std_logic_vector(3 downto 0));
end SEL4;
architecture RTL of SEL4 is
component SEL2TO1
port(D0,D1,S:in std_logic;
Q:out std_logic);
名前による接続
end component;
定義側信号名=>接続信号名
begin
S0:SEL2TO1 port map(D0=>DL(0),D1=>DH(0),S=>SEL,Q=>DOUT(0));
S1:SEL2TO1 port map(D0=>DL(1),D1=>DH(1),S=>SEL,Q=>DOUT(1));
S2:SEL2TO1 port map(D0=>DL(2),D1=>DH(2),S=>SEL,Q=>DOUT(2));
S3:SEL2TO1 port map(D0=>DL(3),D1=>DH(3),S=>SEL,Q=>DOUT(3));
32
end RTL;
4ビットセレクタ ~動作による回路記述~
when文 ~条件付き信号代入文
信号名 <= 式1 when 条件式 else 式2;
条件式が真 ... 式1を代入
条件式が偽 ... 式2を代入
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SEL4_IF is
port(DL,DH:in std_logic_vector(3 downto 0);
SEL:in std_logic;
DOUT:out std_logic_vector(3 downto 0));
end SEL4_IF;
architecture RTL of SEL4_IF is
begin
DOUT<=DL when SEL='0'else DH;
end RTL;
注意:when文は
条件式や式1,2 として演算式を記
述できない
プロセス文内では使用できない
33
③: process文を使った組合せ回路
34
同時処理文と順次処理文
architecture ~ of ~ is
...
begin
同時処理文
同時信号代入文
下位コンポーネント接続
プロセス文
when文 条件付き信号代入文
など
end ~;
同時処理文:記述の順序にかかわらず,同時に
処理される
architecture内に記述
順次処理文:記述順に処理される
process文, procedure文内に記述
architecture ~ of ~ is
...
begin
...
process
...
begin
順次処理文
順次信号代入文
変数代入文
if文
case when文
ループ文
など
end process;
35
process文
[ラベル:] process [(センシティビティリスト)]
各種宣言
begin
順次処理文
end process [ラベル];
記述例 (組合せ回路)
記述例 (順序回路)
process(A,B) begin
Q<=A+B;
end process
process(CK,RST) begin
if RST='1' then
Q<='0';
elsif CK'event and CK='1' then
Q<=D;
end if;
注意:
end process;
センシティビティリストに
は,クロックと非同期リ
セットのみ
注意:
すべての入力をセンシ
ティビティリストに加える
36
動作による回路の記述 ~if 文~
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SEL4_IF is
port(DL,DH:in std_logic_vector(3 downto 0);
SEL:in std_logic;
DOUT:out std_logic_vector(3 downto 0));
end SEL4_IF;
architecture RTL of SEL4_IF is
begin
process(DL,DH,SEL) begin
if (SEL='0') then
DOUT<=DL;
else
DOUT<=DH;
end if;
end process;
end RTL;
-- process文
37
動作による回路の記述 ~case when文~
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity SEL4_CASEWHEN is
port(DL,DH:in std_logic_vector(3 downto 0);
SEL:in std_logic;
DOUT:out std_logic_vector(3 downto 0));
end SEL4_CASEWHEN;
architecture RTL of SEL4_CASEWHEN is
begin
process(DL,DH,SEL) begin
-- process文
case SEL is
when '0' => DOUT<=DL;
when '1' => DOUT<=DH;
when others => DOUT<"XXXX";
end case;
end process;
end RTL;
38
if文とcase when文
if 条件式 then 順次処理文
[elsif 条件式 then 順次処理文]
[elsif 条件式 then 順次処理文]
...
[else 順次処理文]
end if;
記述例
process(DL,DH,SEL) begin
if (SEL='0') then DOUT<=DL;
else DOUT<=DH;
end if;
end process;
case 式 is
when 選択 [|選択|選択|...] =>順次処理文
when 選択 [|選択|選択|...] =>順次処理文
...
end case;
注意:
case文内の式には演算式
記述例
を記述できない
process(DL,DH,SEL) begin
case SEL is
when '0' => DOUT<=DL;
when '1' => DOUT<=DH;
when others => DOUT<="XXXX";
end case;
end process;
定数
選択
定数 to 定数
定数 downto 定数
others
39
多数決回路
A
B
C
Q
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
1
1
1
1
1
architecture RTL of MAJORITY is
signal TMP: std_logic_vector (2 downto 0);
begin
TMP<=A & B & C;
process(TMP) begin
case TMP is
when "000" => Q<='0';
when "001" => Q<='0';
when "010" => Q<='0';
when "011" => Q<='1';
when "100" => Q<='0';
when "101" => Q<='1';
when "110" => Q<='1';
when "111" => Q<='1';
when others => Q<='x';
end case;
end process;
end RTL;
40
プロセス文による組合せ回路
DIN
(1)
(0)
DOUT
(3)
(2)
(1)
(0)
DIN
DOUT
00
0001
01
0010
10
0100
11
1000
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity DEC2TO4 is
port(DIN:in std_logic_vector(1 downto 0);
DOUT:out std_logic_vector(3 downto 0));
end DEC2TO4;
architecture RTL of DEC2TO4 is
begin
process(DIN) begin
case DIN is
when "00" => DOUT<="0001";
when "01" => DOUT<="0010";
when "10" => DOUT<="0100";
when "11" => DOUT<="1000";
end case;
end process;
end RTL;
41
process文による順序回路の記述
42
D-FF ポジティブエッジトリガ
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
D
Q
CK
注意:
センシティビティビットには,D
を含まない
entity D_FF is
port(CK,D:in std_logic;
Q:out std_logic);
end D_FF;
architecture RTL of D_FF is
begin
process(CK) begin
if (CK'event and CK='1') then Q<=D;
end if;
end process;
end RTL;
43
同期リセット付 D_FF
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
D
Q
CK
RST
注意:
センシティビティビットには,D
やRSTを含まない
entity D_FF_RST is
port(CK,RST,D:in std_logic;
Q:out std_logic);
end D_FF_RST;
architecture RTL of D_FF_RST is
begin
process(CK) begin
if (CK'event and CK='1') then
if (RST='0') then Q<='0';
else Q<=D;
end if;
end if;
end process;
end RTL;
44
非同期リセット付 D-FF
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
D
Q
CK
RST
entity D_FF_RST is
port(CK,RST,D:in std_logic;
Q:out std_logic);
end D_FF_RST;
architecture RTL of D_FF_RST is
begin
process(CK,RST) begin
if (RST='0') then Q<='0';
elsif (CK'event and CK='1') then
Q<=D;
end if;
end process;
end RTL;
45
SR_FF
entity SR_FF is
port(S,R,CK:in std_logic;
Q:out std_logic);
end SR_FF;
S
Q
CK
R
architecture RTL of SR_FF is
signal SR:std_logic_vector(1 down to 0);
begin
SR<=(S & R);
process(CK) begin
if (CK'event and CK='1') then
case SR is
when "01" => Q<='0';
when "10" => Q<='1';
when others => null;
end case;
end if;
end process;
end RTL;
ライブラリ宣言は省略
46
JK_FF
J
entity JK_FF is
port (CK,J,K:in std_logic;
Q,Qnot:out std_logic);
end JK_FF;
Q
architecture Behavioral of JK_FF is
signal JK:std_logic_vector(1 downto 0);
signal TMP:std_logic;
CK
K
J
K
Q
0
0
Q
0
1
0
1
0
1
1
1
Q
ライブラリ宣言は省略
begin
JK<=J&K;
process(CK)
begin
if(CK'event and CK='1') then
case JK is
when "01" => TMP<='0';
when "10" => TMP<='1';
when "11" => TMP<=not TMP;
when others => null;
end case;
end if;
end process;
Q<=TMP;
Qnot<=not TMP;
end Behavioral;
47
4ビットシリアルインパラレルアウトシフトレジスタ
entity SINPOUT4 is
port(D,CK:in std_logic;
RST:out std_logic;
Q:out std_logic_vector(3 downto 0));
end SINPOUT4;
architecture RTL of SINPOUT4 is
signal WORK:std_logic_vector(3 downto 0);
begin
process(CK) begin
if (RST='0') then WORK<="0000";
else
if (CK'event and CK='1') then
WORK(0) <= D;
WORK(1) <= WORK(0);
WORK(2) <= WORK(1);
WORK(3) <= WORK(2);
end if;
end if;
end process;
Q<=WORK;
end RTL;
以下,ライブラリ宣言は省略
注意
WORK(0)
WORK(1)
WORK(2)
WORK(3)
<=
<=
<=
<=
D;
WORK(0);
WORK(1);
WORK(2);
48
4ビットカウンタ (リセット機能付き)
49
4ビットカウンタの構造記述 CNT4
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity CNT4 is
port (CI:in std_logic;
CO:out std_logic_vector(3 downto 0));
end CNT4;
architecture Behavioral of CNT4 is
signal Q:std_logic_vector(3 downto 0);
signal Qnot:std_logic_vector(3 downto 0);
signal S2,S3:std_logic;
component JK_FF
port (CK,J,K:in std_logic;
Q,Qnot:out std_logic);
end component;
begin
S2<=Q(0) and Q(1);
S3<=S2 and Q(2);
U0:JK_FF port map(CI,'1','1',Q(0),Qnot(0));
U1:JK_FF port map(CI,Q(0),Q(0),Q(1),Qnot(1));
U2:JK_FF port map(CI,S2,S2,Q(2),Qnot(2));
U3:JK_FF port map(CI,S3,S3,Q(3),Qnot(3));
CO(3)<=Q(3);
CO(2)<=Q(2);
CO(1)<=Q(1);
CO(0)<=Q(0);
end Behavioral;
50
カウンタ出力のLED表示 CNT7SEG
entity CNT7SEG is
port (CI:in std_logic;
OUT7:out std_logic_vector(7 downto 0));
end CNT7SEG;
architecture Behavioral of CNT7SEG is
signal CO:std_logic_vector(3 downto 0);
signal DIV:std_logic_vector(22 downto 0);
signal DIVout:std_logic;
component CNT4 is
port (CI:in std_logic;
CO:out std_logic_vector(3 downto 0));
end component;
component SEG7DEC is
port(inp : in std_logic_vector(3 downto 0);
outp : out std_logic_vector(7 downto 0));
end component;
begin
DIVout<=DIV(1);
process(CI)
begin
if CI'event and CI='1' then DIV<=DIV+1;
end if;
end process;
U0:CNT4 port map(DIVout,CO);
U1:SEG7DEC port map(CO,OUT7);
end Behavioral;
51
4ビットカウンタ(リセット機能付き)の動作記述
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity CNT4 is
port(CLK,RST:in std_logic;
Q:out std_logic_vector(3 downto 0));
end CNT4;
architecture RTL of CNT4 is
signal Q_REG:std_logic_vector(3 downto 0);
begin
Q<=Q_REG;
繰り返し
process(CLK,RST)
if RST='1' then
Q_REG<="0000";
elsif clk'event and CLK='1' then
Q_REG<=Q_REG+"0001"
end if;
end process;
end RTL;
内部信号の宣言
カウンタのリセット
リセット信号の入力による,
非同期リセット
クロックの立ち上がりの検出
カウントアップ
Q<=Q+“0001”とは書けない
のでQ_REGを宣言して使用
52
10進カウンタ
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity COUNT10 is
port(CLK,RST:in std_logic;
Q:out std_logic_vector(3 downto 0));
end COUNT10;
architecture RTL of COUNT10 is
signal Q_REG:std_logic_vector(3 downto 0);
begin
Q<=Q_REG;
process(CLK,RST) begin
if RST='1' then Q_REG<="0000";
elsif CLK'event and CLK='1' then
if Q_REG="1001" then Q_REG<="0000";
else Q_REG<=Q_REG + "0001";
endif;
end if;
end process;
end RTL;
53
4ビットラッチ ~下位コンポーネント接続
entity LATCH4 is
port(CLK,RST:in std_logic;
D:in std_logic_vector(3 downto 0);
Q:out std_logic_vector(3 downto0));
end LATCH4;
architecture RTL of LATCH4 is
component D_FF
-- コンポーネント宣言
port(CK,RB,D:in std_logic;
Q:out std_logic);
end component;
begin
順番による接続
DF0:D_FF port map(CLK,RST,D(0),Q(0);
DF1:D_FF port map(CLK,RST,D(1),Q(1);
DF2:D_FF port map(CK=>CLK,RB=>RST,D=>D(2),Q=>Q(2));
DF3:D_FF port map(CK=>CLK,RB=>RST,D=>D(3),Q=>Q(3));
end RTL;
名前による接続
インスタンス名:コンポーネント名 port map (ポートリスト);
54
ALU,アキュムレータ
entity ALU_ACC is
port(A:out std_logic_vector(15 downto 0);
B:in std_logic_vector(15 downto 0);
CND:in std_logic_vector(2 downto 0);
CLK,E:in std_logic);
end ALU_ACC;
architecture Behavioral of ALU_ACC is
signal ACC:std_logic_vector(15 downto 0);
begin
A<=ACC;
process(CLK)
begin
if CLK'event and CLK='1' then
if E='1' then
case CND is
when "000" => ACC<=(15 downto 0=>'0');
when "001" => ACC<=B;
when "010" => ACC<=ACC+B;
when "011" => ACC<=ACC-B;
when "100" => ACC<=ACC and B;
when "101" => ACC<=ACC or B;
when "110" => ACC<=ACC xor B;
when "111" => ACC<=not ACC;
when others => null;
end case;
end if;
end if;
end process;
end Behavioral;
55
state machine
56
JK-FFによる3進カウンタ (状態遷移図)
J1
/01
00
01
/00
/10
K1
Q1
Q0
0
0
1
1
Q1
Q0
0
1
0
x
0
x
1
1
x
1
x
x
0
1
K1=1
J1=Q0
10
J0
Q1 Q0 Q1 Q0 J1 K1 J0 K0
0
0
0
1
0
x
1
x
0
1
1
0
1
x
x
1
1
0
0
0
x
1
0
x
1
1
x
x
x
x
x
x
K0
Q1
Q0
0
1
Q1
Q0
0
1
0
0
x
x
1
x
x
1
1
x
J0=Q1
K0=1
57
JK-FFによる3進カウンタ (回路図とVHDL記述)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
U1
J
CI
Q
CO(1)
CK
K
Q
U0
J
Q
CK
K
Q
CO(0)
entity COUNTER_SYNC_3 is
port (CI:in std_logic;
CO:out std_logic_vector(1 downto 0));
end COUNTER_SYNC_3;
architecture Behavioral of COUNTER_SYNC_3 is
signal Q:std_logic_vector(1 downto 0);
signal Qnot:std_logic_vector(1 downto 0);
component JK_FF
port (CK,J,K:in std_logic;
Q,Qnot:out std_logic);
end component;
begin
U1:JK_FF port map(CI,Q(0),
'1',Q(1),Qnot(1));
U0:JK_FF port map(CI,Qnot(1),
'1',Q(0),Qnot(0));
CO(1)<=Q(1);
CO(0)<=Q(0);
end Behavioral;
58
ステートマシンの記述(1) 信号,定数の宣言
ステート生成回路 信号,定数の宣言
architecture RTL of TRAY_ENCDEC is
signal CUR:std_logic_vector(1 downto 0);
signal NXT:std_logic_vector(1 downto 0);
constant CLOSED:std_logic_vector(1 downto 0):="00";
constant OPENING:std_logic_vector(1 downto 0):="01";
constant OPENED:std_logic_vector(1 downto 0):="10";
constant CLOSING:std_logic_vector(1 downto 0):="11";
constant UNKNOWN:std_logic_vector(1 downto 0):="XX";
59
ステートマシンの記述(2) ステート生成回路
ステート生成回路
begin
process(CUR,BUTTON,FINOPN,FINCLS) begin
case CUR is
when CLOSED => if BUTTON='1' then NXT<=OPENING;
else NXT<=CLOSED;
end if;
when OPENING => if FINOPN='1' then NXT<=OPENED;
else NXT<=OPENING;
end if;
when OPENED => if BUTTON='1' then NXT<=CLOSING;
else NXT<=OPENED;
end if;
when CLOSING => if FINCLS='1' then NXT<=CLOSED;
else NXT<=CLOSING;
end if;
when others => NXT<=UNKNOWN;
end case;
end process;
end RTL;
60
ステートマシンの記述(3) ステートレジスタと出力回路
ステートレジスタ
process(CLK,RST) begin
if RST='1' then CUR<=CLOSED;
elsif CLK'event and CLK='1' then CUR<=NXT;
end if;
end process;
モータ制御出力
MOTOR<='1' when CUR=OPENING or CUR=CLOSING else '0';
DIR<='1' when CUR=OPENING else '0';
61
課題1:半減算器 HS
下位からの借りを考慮しない減算 X-Y
X
Y
B
D
X
Y
B (借り)
D (差)
0
0
0
0
0
1
1
0
1
1
0
0
① 上の真理値表を完成させよ
② DとBをXとYで表せ.
③ 半減算器の構造をVHDLで記述せよ.
62
課題2:全減算器 FS
下位からの借りを考慮した減算 X-Y-BI
表1
X
BO
Y
BI
D
図1
X
Y
BI
BO
(借り)
D
(差)
0
0
0
0
0
0
0
0
1
1
1
-1
0
1
0
1
1
-1
0
1
1
1
0
-2
1
0
0
0
1
1
1
0
1
0
0
0
1
1
0
0
0
0
1
1
1
1
1
-1
63
課題2:全減算器 FS
表2
図1の全減算器の真理値表は表1で与え
られることを知り,以下の問いに答え
よ
X
Y
BI
B1 D1 B2 BO
D
0
0
0
0
0
0
1
-1
① 図1の全減算器が半減算器を用いて
図2で表すことができることを,
表2の真理値表を完成させて確認
せよ
② 全減算器の構造を半減算器を用い
てVHDLで記述せよ.
0
1
0
-1
0
1
1
-2
1
0
0
1
1
0
1
0
1
1
0
0
1
1
1
-1
図2
64
略解1
X
B
Y
D
=
X
Y
B (借り)
D (差)
0
0
0
0
0
1
1
1
1
0
0
1
1
1
0
0
⊕
=
65
略解2
1=
1=
⊕
2= 1
= 1+ 2
= 1⊕
X
Y
BI
B1 D1 B2 BO
D
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
1
-1
0
1
0
1
1
0
1
1
-1
0
1
1
1
1
0
1
0
-2
1
0
0
0
1
0
0
1
1
1
0
1
0
1
0
0
0
0
1
1
0
0
0
0
0
0
0
1
1
1
0
0
1
1
1
-1
66
ファンクション
67
ファンクション
architecture RTL of SEL4
function SELECTOR(L,H:std_logic_vector;
S:std_logic)
return std_logic_vector is
begin
if S='0' then return L;
else return H;
end if;
end SELECTOR;
begin
DOUT<=SELECTOR(DL,DH,SEL);
end RTL;
関数の定義
L,H,S:仮引数
関数の呼出し
DL,DH,SEL:実引数
DOUT<=SELECTOR(L=>DL,H=>DH,S=>SEL);
68
ファンクションによる組合せ回路
2to4デコーダ
DEC
2
DIN
4
D
DOUT
DIN
DOUT
00
0001
01
0010
10
0100
11
1000
entity DEC2TO4_FUNC is
port(DIN:in std_logic_vector(1 downto 0);
DOUT:out std_logic_vector(3 downto 0));
end DEC2TO4_FUNC;
architecture RTL of DEC2TO4_FUNC is
function DEC(D:std_logic_vector(1 downto 0))
return std_logic_vector is
begin
case D is
when "00" => return "0001";
when "01" => return "0010";
when "10" => return "0100";
when "11" => return "1000";
when others => return "XXXX";
end case;
enc DEC;
begin
DOUT<=DEC(DIN);
end RTL;
69
符号付回路
70
符号付 オフセット/リミッタ回路
DIN+OFFSET
20
DOUT
-20
DIN+OFFSET DOUT
>20
20
<-20
-20
上記以外
DIN+OFFSET
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_signed.all;
entity OFTLMT is
port(DIN:in std_logic_vector(5 downto 0);
OFFSET:in std_logic_vector(2 downto 0);
DOUT:out std_logic_vector(5 down to );
end OFLMT;
architecture RTL of OFTLMT is
constant UP_LMT:std_logic_vector(5 downto 0)
:="010100";
constant LOW_LMT:std_logic_vector(5 downto 0)
:="101100";
signal ADDOUT:std_logic_vector(6 downto 0);
begin
ADDOUT<=(DIN(5) & DIN) + OFFSET;
process(ADDOUT) begin
if ADDOUT>UP_LMT then DOUT<=UP_LMT;
elsif ADDOUT<LOW_LMT then DOUT<=LOW_LMT;
else DOUT<=ADDOUT(5 downto 0);
end if;
end process;
71
end RTL;