第 8 回 中間試験前の演習
問 1.VHDL ソースコードを読む
(1)次の VHDL のソースコードが記述しているゲート回路の回路図を示せ.
(2)この回路の入出力の真理値表を示し,(3)どのような働きをする回路か述べよ。
(2) (3)
A(3) A(2) A(1) A(0) TMP(0) TMP(1) Y
ヒント:4ビットパターン A の中の“1”の個数
に注目
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Logic is
port ( A : in std_logic_vector(3 downto 0);
Y : out std_logic);
end Logic;
architecture Behavioral of Logic is
signal TMP : std_logic_vector(1 downto 0);
begin
TMP(0) <= A(3) xor A(2);
TMP(1) <= TMP(0) xor A(1);
Y <= TMP(1) xor A(0);
end Behavioral;
問 2.タイミングチャート
以下に示す VHDL コードで記述されている回路に関するタイミングチャートを完成させよ。
1)レジスタの動作
2)LOAD 入力付きカウンタ
library IEEE; use IEEE.std_logic_1164.all; entity RegN is generic (N : integer := 8); port ( CLK, EN : in std_logic; R : in std_logic_vector(N-1 downto 0); Q : out std_logic_vector(N-1 downto 0) ); end RegN; architecture RTL of RegN is begin process(CLK) beginif (CLK'event and CLK = '1') then if (EN = '1') then Q <= R; end if; end if; end process; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity PC4 is port (
CLK, RESET, LOAD : in std_logic; D : in std_logic_vector(3 downto 0); C : out std_logic_vector(3 downto 0) );
end PC4;
architecture RTL of PC4 is
signal count : std_logic_vector(3 downto 0); begin process(CLK, RESET) begin if (RESET = '0') then count <= (others => '0'); elsif (CLK'event and CLK = '1') then if (LOAD = '0') then count <= D; else count <= count + '1'; end if; end if; end process; C <= count; end RTL; CLK EN R(0) Q(0) HL CLK RESET LOAD D(3) D(2) D(1) D(0) C(3) C(2) リセット データのロード
3)同期イネーブル入力付きカウンタ
リスト 1 : 問 2 の VHDL コード library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Logic_circuit is port ( CLK : in std_logic; RST : in std_logic; EN : in std_Logic;REG_EN_O: out std_logic;
COUNT : out std_logic_vector(3 downto 0) );
end Logic_circuit;
architecture Behavioral of Logic_circuit is signal cnt : std_logic_vector(3 downto 0); signal reg_en : std_logic;
begin
process(CLK,RST) –レジスタの記述 begin
if(RST='0') then reg_en<='0';
elsif(CLK'event and CLK='1') then reg_en<=EN; end if; end process; process(CLK,RST) begin if(RST='0') then cnt<=(others=>'0');
elsif(CLK'event and CLK='1') then if(reg_en='1') then if(conv_integer(cnt)=8) then cnt<=(others=>'0'); else cnt<=cnt+'1'; end if; end if; end if; end process; REG_EN_O<=reg_en; COUNT<=cnt; end Behavioral;
タイミングチャート
RST CLK EN REG_EN_O COUNT[3] COUNT[2] COUNT[1] COUNT[0]問3. ステートマシンの応用 バスの動作
応答速度のばらつきが大きい入出力装置(I/O)をバスに接続する場合,READY 信号などの確認用信号を
用いて入出力のタイミングを調整する。
以下に示すのは,バスに接続された I/O にアクセスするためのバスコントローラの VHDL コードである。
コントローラの入出力信号の仕様は Table 1 に示すとおりである。
W_DATA:I/O に書き込みたいデータ [入力] R_DATA:I/O から読み出されたデータ [出力] ADDRESS : I/O のアドレス [入力] W:”1”で I/O への書き込み,”0”で読み出し[入力] D_BUS:データバス [入出力] A_BUS:アドレスバス [出力] READY: I/O がアクセス可能なときに”1”になる [入力] IO_WRITE:書き込みを指示する制御バス信号 [出力] IO_READ:読み出しを指示する制御バス信号 [出力] library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity BUS_CONTROLLER isgeneric (N : integer := 8; M : integer := 16); port (
CLK, RESET, READY, W : in std_logic;
W_DATA : input std_logic_vector(N-1 downto 0); ADDRESS : input std_logic_vector(M-1 downto 0); D_BUS : inout std_logic_vector(N-1 downto 0); A_BUS : out std_logic_vector(M-1 downto 0);
R_DATA : output std_logic_vector(N-1 downto 0); IO_WRITE, IO_READ : out std_logic
);
end BUS_CONTROLLER;
architecture RTL of BUS_CONTROLLER is signal count : std_logic_vector(N-1 downto 0);
type type_state is (Idle, Write, Read, W_wait, R_wait); signal state : type_state;
begin IO_WRITE <= W; IO_READ <= not W; A_BUS <= ADDRESS; process(CLK, RESET) begin if (RESET = '0') then state <= Idle;
elsif (CLK'event and CLK = '1') then case state is when Idle => if (W = '1') then state <= W_wait; else state <= R_wait; end if; when W_wait => if(READY= '0') state = W_wait; else state <=Write; end if when R_wait => if(READY= '0') state <= R_wait; else state <= Read; end if; when Write => state <= Idle; when Read => state <= Idle; when others => state<=Idle; end case; end if; end process;
D_BUS <= W_DATA when state = Write else (others=> 'Z'); R_DATA <= D_BUS when state = Read else (others=> '0'); end RTL; CLK RESET READY W W_DATA R_DATA D_BUS A_BUS IO_READ IO_WRITE N bit M bit N bit N bit M bit ADDRESS
Idle
W _wait
RESET=‘0’
R_wait
W = ‘1’ W = ‘0’問4.マイクロプロッサのアーキテクチャ
Fig.4 (a)は,4ビットプロセッサのアーキテクチャの例である。このプロセッサのコントローラが
出力する制御信号は 14 ビットで、そのフォーマットを Fig.4 (b)に示す。
W/
R
はメモリ制御信号,
OP_MODE は ALU(算術演算論理回路)の演算の種類を指定するモード,WE_A,B,及び C はレジスタにデータ
を書き込むための許可信号,WE_R_F はレジスタファイルにデータを書き込むための許可信号,SEL はマル
チプレクサの選択信号,R_ADR はレジスタファイルアドレス,及び M_ADR はメモリアドレスを示す。
また,リスト 2 はアーキテクチャ内で用いられる ALU の VHDL 記述である。
--リスト 2 ALU の VHDL 記述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity ALU4 is port (A, B : in std_logic_vector(3 downto 0); -- データ入力(4bit) M : in std_logic_vector(1 downto 0); -- 制御入力(2bit) O : out std_logic_vector(3 downto 0); -- 出力(4bit) S : out std_logic -- 符号出力(1bit) );
end ALU4;
architecture RTL of ALU4 is
signal alu : std_logic_vector(3 downto 0); -- ALU 内部データ(9bit に拡張)
begin
alu <= (A(3) & A) + (B(3) & B) when (M = "00") else -- bit 拡張後に符号付き加算 (A(3) & A) - (B(3) & B) when (M = "01") else -- bit 拡張後に符号付き減算 ('0' & A) and ('0' & B) when (M = "10") else -- AND 演算
('0' & A) or ('0' & B); -- OR 演算 O <= alu(3 downto 0); S <= alu(4); end RTL;
Fig.4 マイクロプロセッサのアーキテクチャの例
(a)アーキテクチャ
(b)制御信号フォーマットとその機能
MUX 0 1 デコーダ&ステートマシン 命令 WE_A WE_B WE_C SEL R_A WE OP_MODE アドレス データメモリ 0100 0101 0000 M_ADR WE_R_F R_B WE R_C WE 00 01 10 11 ALU R_ADR 1111 命令フェッチ デコード 実行 ライトバック リセット レジスタファイル W/R ①レジスタ B にメモリアドレス 0100 番地のデ ータを格納する場合 00 0100 0 0 00 0100 ②レジスタ A と C の内容を論理 AND し結果をレ ジスタファイルアドレス 00 に書き込む場合 10 0001 0 1 00 0000A
B
注:レジスタファイルには符号出力を 除いたデータを出力している 制御信号フォーマット(14ビット) OP_MODE :ALUの演算モード WE_ : レジスタライトイネーブル SEL: MUX(マルチプレクサ)の選択出力信号 M_ADR:メモリアドレス(0000~1111) R_ADR:レジスタファイルアドレス(00~11) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 : 算術加算 01 : 算術減算 10 :論理AND 11 :論理OR 0 1 2 3 4 5 6 7 8 9 10 11 12 13 A B C R_F WE_ 8 9 10 11 ←レジスタ名 ←’1’のときにデータを 各レジスタに格納 0 : ポート0を選択 1 : ポート1を選択 : メモリ制御信号 R W/R W/ 0 : メモリから読み込み 1 : メモリに書き込み M_ADR R_ADR OP_MODE WE_ R_F A B C SEL W/RW/Rこのマイクロプロセッサのアーキテクチャについて,以下の問に答えよ。
(1)以下の 1)~5)の各動作を実行するためのビットパターンのシーケンスを示せ。
1)メモリ間算術加算命令 ①メモリアドレス 0000 からデータを読み込み,レジスタ B に格納 ②メモリアドレス 0111 からデータを読み込み,レジスタ C に格納 ③レジスタ B 及びレジスタ C の内容を算術加算演算し,結果をレジスタファイルアドレス 01 のレジスタに格納 2)レジスタ間データ転送命令 ①レジスタファイルアドレス 01 の内容をレジスタ A に格納 3)レジスタ間減算命令 ①レジスタ A 及びレジスタ C の内容を算術減算し,結果をレジスタファイルアドレス 10 に格納 4)メモリ-レジスタ間論理 OR 演算命令 ①メモリアドレス 1000 からデータを読み込み,レジスタ C に格納 ②レジスタファイルアドレス 11 の内容をレジスタ A に格納 ③レジスタ A 及びレジスタ C の内容を論理 OR 演算し,結果をレジスタファイルアドレス 00 へ格納 5)レジスタからメモリへのデータ転送命令 ①レジスタファイルアドレス 00 の内容をメモリアドレス 1001 番地に書き込む(2)
上記の命令を全て実行した時の,レジスタファイルの内容を記入せよ。ただし,上記で指定されたメモリ
の内容は Table1 のとおりであり,レジスタファイルアドレス 11 にはデータとして 0011 が格納されてい
るとせよ。
Table1 指定されたメモリアドレスの内容
メモリアドレス データ
0000
0100
0111
1100
1000
0001
レジスタファイル
アドレス
00
01
10
11
データ
0 0
0
0 0
0 1 2 3 4 5 6 7 8 9 10 11 12 130
1)メモリ間算術加算命令 ① ② ③ 2)レジスタ間データ 転送命令 ① 3)レジスタ間減算命令 ① 4)メモリ-レジスタ間 論理OR演算命令 ① ② ③ 5)レジスタからメモリへ のデータ転送命令 ①0 0
0 0
0 0
0 0
0 0
0 0 0 0
0
0
0
0
0
0
0
0
0
0 0
0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
問5.コンピュータと内部表現の基礎
1)アドレス 24 ビットのプロセッサが直接にアクセス(読み書き)できるメモリの最大容量を求めよ。ただ
し,1 アドレスに 8 ビットデータを割り当てる通常のメモリ構成とし,容量は G バイト,K バイト,M バイト
などの慣用的な単位を用いること。
最大
242
個のアドレスを指定でき,1 つのアドレスに8 ビット(=1 バイト)が割り当てられるから,
24
2
バイト=16M バイト
2)8 ビットプロセッサについて以下の問いに答えよ。ただし,このプロセッサでは,データレジスタのビ
ット幅は8であり,ALU 内部では9ビットにビット拡張して扱っているものとせよ。。
①8ビットおよび9ビットのデータで表現できる整数の値の範囲を示せ。
8ビット:
72
−
~
2
7−
1
の範囲(-128~127)
9ビット:
82
−
~
2
8−
1
の範囲(-256~255)
②2つの8ビットのデータの加減算の結果の値の範囲を示せ。
-128~127 の範囲の2 数の加減算なので,-256~254
③内部表現 0100 1101 および 1001 0101 で表される整数の値と,そのビット拡張後の内部表現を示せ。
0100 1101 = 64 + 8 + 4 + 1 = 77 ビット拡張すると,0 0100 1101
1001 0101 → MSB が 1 なので負の数 →2の補数を求めると,0110 1011 となる
0110 1011 = 64 + 32 + 8 + 2 +1 = 107 → 表されている数値は-107
ビット拡張すると,1 1001 0101
3)以下の演算を8ビット内部表現で実行し,結果の 10 進数表記を示せ。(結果がオーバーフローする場合
は,“オーバーフロー”と記せ。
)
①0010 1101 + 0100 1110 ②0100 0011 + 0100 0111 ③0110 1011 - 0100 1100
4)3)①~③の演算を 9 ビットに拡張してから行ってみよ。
①
②
③
①
②
③
第 8 回 中間試験前の演習
問 1.VHDL ソースコードを読む
(1)次の VHDL のソースコードが記述しているゲート回路の回路図を示せ.
(2)この回路の入出力の真理値表を示し,(3)どのような働きをする回路か述べよ。
(2) (3)
A(3) A(2) A(1) A(0) TMP(0) TMP(1) Y
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
1
1
0
0
1
1
0
1
0
0
1
0
0
1
1
1
0
1
0
1
1
1
0
0
1
1
0
1
0
0
0
1
1
1
1
0
1
1
0
0
0
1
1
1
1
0
0
1
1
1
0
1
0
1
0
1
0
0
1
0
1
1
1
0
1
1
1
0
0
0
0
0
1
1
0
1
0
0
1
1
1
1
0
0
1
1
1
1
1
1
0
1
0
ヒント:4ビットパターン A の中の“1”の個数
に注目
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Logic is
Port ( A : in std_logic_vector(3 downto 0);
Y : out std_logic);
end Logic;
architecture Behavioral of Logic is
signal TMP : std_logic_vector(1 downto 0);
begin
TMP(0) <= A(3) xor A(2);
TMP(1) <= TMP(0) xor A(1);
Y <= TMP(1) xor A(0);
end Behavioral;
入力信号のビット列の中で 1 の個
数が奇数の場合に出力信号 Y
が’1’になる回路である。
**つまり「奇数パリティチェック回
路」として働く
A(3)
A(2)
A(1)
A(0)
Y
TMP(0) TMP(1)
問 2.タイミングチャート
以下に示す VHDL コードで記述されている回路に関するタイミングチャートを完成させよ。
1)レジスタの動作(R(0)と Q(0)のみのタイミングチャート)
2)LOAD 入力付きカウンタ
library IEEE; use IEEE.std_logic_1164.all; entity RegN is generic (N : integer := 8); port ( CLK, EN : in std_logic; R : in std_logic_vector(N-1 downto 0); Q : out std_logic_vector(N-1 downto 0) ); end RegN; architecture RTL of RegN is begin process(CLK) beginif (CLK'event and CLK = '1') then if (EN = '1') then Q <= R; end if; end if; end process; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity PC4 is port (
CLK, RESET, LOAD : in std_logic; D : in std_logic_vector(3 downto 0); C : out std_logic_vector(3 downto 0) );
end PC4;
architecture RTL of PC4 is
signal count : std_logic_vector(3 downto 0); begin process(CLK, RESET) begin if (RESET = '0') then count <= (others => '0'); elsif (CLK'event and CLK = '1') then if (LOAD = '0') then count <= D; else count <= count + '1'; end if; end if; end process; C <= count; end RTL; CLK EN R(0) Q(0) H L CLK RESET LOAD D(3) D(2) D(1) D(0) C(3) データのロード リセット
3)同期イネーブル入力付きカウンタ
リスト 1 : 問 2 の VHDL コード library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Logic_circuit is Port ( CLK : in std_logic; RST : in std_logic; EN : in std_Logic;REG_EN_O: out std_logic;
COUNT : out std_logic_vector(3 downto 0) );
end Logic_circuit;
architecture Behavioral of Logic_circuit is signal cnt : std_logic_vector(3 downto 0); signal reg_en : std_logic;
begin
process(CLK,RST) –レジスタの記述 begin
if(RST='0') then reg_en<='0';
elsif(CLK'event and CLK='1') then reg_en<=EN; end if; end process; process(CLK,RST) begin if(RST='0') then cnt<=(others=>'0');
elsif(CLK'event and CLK='1') then if(reg_en='1') then if(conv_integer(cnt)=8) then cnt<=(others=>'0'); else cnt<=cnt+'1'; end if; end if; end if; end process; REG_EN_O<=reg_en; COUNT<=cnt; end Behavioral;
タイミングチャート
RST CLK EN REG_EN_O COUNT[3] COUNT[2] COUNT[1] COUNT[0] COUNT= 0000,0000, 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0110, 0111, 1000問3. ステートマシンの応用 バスの動作
応答速度のばらつきが大きい入出力装置(I/O)をバスに接続する場合,READY 信号などの確認用信号を
用いて入出力のタイミングを調整する。
以下に示すのは,バスに接続された I/O にアクセスするためのバスコントローラの VHDL コードである。
コントローラの入出力信号の仕様は Table 1 に示すとおりである。
W_DATA:I/O に書き込みたいデータ [入力] R_DATA:I/O から読み出されたデータ [出力] ADDRESS : I/O のアドレス [入力] W:”1”で I/O への書き込み,”0”で読み出し[入力] D_BUS:データバス [入出力] A_BUS:アドレスバス [出力] READY: I/O がアクセス可能なときに”1”になる [入力] IO_WRITE:書き込みを指示する制御バス信号 [出力] IO_READ:読み出しを指示する制御バス信号 [出力] library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity BUS_CONTROLLER isgeneric (N : integer := 8; M : integer := 16); port (
CLK, RESET, READY, W : in std_logic;
W_DATA : input std_logic_vector(N-1 downto 0); ADDRESS : input std_logic_vector(M-1 downto 0); D_BUS : inout std_logic_vector(N-1 downto 0); A_BUS : out std_logic_vector(M-1 downto 0);
R_DATA : output std_logic_vector(N-1 downto 0); IO_WRITE, IO_READ : out std_logic
);
end BUS_CONTROLLER;
architecture RTL of BUS_CONTROLLER is signal count : std_logic_vector(N-1 downto 0);
type type_state is (Idle, Write, Read, W_wait, R_wait); signal state : type_state;
begin IO_WRITE <= W; IO_READ <= not W; A_BUS <= ADDRESS; process(CLK, RESET) begin if (RESET = '0') then state <= Idle;
elsif (CLK'event and CLK = '1') then case state is when Idle => if (W = '1') then state <= W_wait; else state <= R_wait; end if; when W_wait => if(READY= '0') state <= W_wait; else state <=Write; end if when R_wait => if(READY= '0') state <= R_wait; else state <= Read; end if; when Write => state <= Idle; when Read => state <= Idle; when others => state<=Idle; end case; end if; end process;
D_BUS <= W_DATA when state = Write else (others=> 'Z'); R_DATA <= D_BUS when state = Read else (others=> '0'); end RTL; CLK RESET READY W W_DATA R_DATA D_BUS A_BUS IO_READ IO_WRITE N bit M bit N bit N bit M bit ADDRESS
(1)このバスコントローラの状態遷移図を示せ。
Idle
W _wait
Write
RESET=‘0’
R_wait
W = ‘1’
W = ‘0’
READY= ‘0’
READY= ‘0’
Read
READY= ‘1’
READY= ‘1’
問4.マイクロプロッサのアーキテクチャ
Fig.4 (a)は,4ビットプロセッサのアーキテクチャの例である。このプロセッサのコントローラが出力す
る制御信号は 14 ビットで、そのフォーマットを Fig.4 (b)に示す。
W/
R
はメモリ制御信号,OP_MODE は ALU(算
術演算論理回路)の演算の種類を指定するモード,WE_A,B,及び C はレジスタにデータを書き込むための許可
信号,WE_R_F はレジスタファイルにデータを書き込むための許可信号,SEL はマルチプレクサの選択信
号,R_ADR はレジスタファイルアドレス,及び M_ADR はメモリアドレスを示す。
また,リスト 2 はアーキテクチャ内で用いられる ALU の VHDL 記述である。
--リスト 2 ALU の VHDL 記述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity ALU4 is port (A, B : in std_logic_vector(3 downto 0); -- データ入力(4bit) M : in std_logic_vector(1 downto 0); -- 制御入力(2bit) O : out std_logic_vector(3 downto 0); -- 出力(4bit) S : out std_logic -- 符号出力(1bit) );
end ALU4;
architecture RTL of ALU4 is
signal alu : std_logic_vector(3 downto 0); -- ALU 内部データ(9bit に拡張)
begin
alu <= (A(3) & A) + (B(3) & B) when (M = "00") else -- bit 拡張後に符号付き加算 (A(3) & A) - (B(3) & B) when (M = "01") else -- bit 拡張後に符号付き減算 ('0' & A) and ('0' & B) when (M = "10") else -- AND 演算
('0' & A) or ('0' & B); -- OR 演算 O <= alu(3 downto 0); S <= alu(4); end RTL;