組み合せ回路のVHDL記述

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


組み合せ回路の復習

·         組み合わせ回路とは  出力信号の状態が入力信号のみで決定される回路。

·         したがって以下の特性がある。

1.   真理値表で書ける。

2.   内部にラッチやレジスタのように値を保持する素子は含まれない


真理値表の復習

入力信号

 

途中の信号

 

出力信号

A

B

C

 

X

Y

 

F

G

0

0

0

 

1

0

 

0

1

0

0

1

 

1

1

 

0

0

0

1

0

 

1

0

 

0

1

0

1

1

 

1

0

 

0

1

1

0

0

 

1

0

 

0

1

1

0

1

 

1

1

 

0

0

1

1

0

 

0

0

 

1

1

1

1

1

 

0

0

 

1

1

これより、直接的にブール代数式で書ける!

F <= A and B and (notC) or A and B and C;

G <= notA and notB and notC or ......(省略)


カルノー図の復習

F

AB

C

 

00

01

11

10

0

0

0

1

0

1

0

0

1

0

ということで、 F <= A and B; と簡単化される。

 

G

AB

C

 

00

01

11

10

0

1

1

1

1

1

0

1

1

0

ということで、 G <= (notC) or B ;  と簡単化される。


プロセス文を使わない組み合せ回路の記述

(例)

回路図のそのままの記述

簡単化後の回路そのままの記述

ibrary IEEE;
use IEEE.std_logic_1164.all;

entity COMB is
 port (A, B, C : IN std_logic
    F, G : OUT std_logic );
end COMB;

architecture STRUCTURE1 of COMB is
signal X, Y : std_logic;
begin
X <= A nand B;
Y <= not B nand C;
F <= X nor Y;
G <= not Y;
end STRUCTURE1;

library IEEE;
use IEEE.std_logic_1164.all;

entity COMB is
 port (A, B, C : IN std_logic
    F, G : OUT std_logic );
end COMB;

architecture STRUCTURE2 of COMB is
begin
F <= A and B;
G <= not C or B;
end STRUCTURE2;

·         こんな記述では、設計の生産性は上がらない。

·         回路の簡単化はデザインコンパイラが行うので、設計者はもっと簡単に機能を記述すればよい。


プロセス文を使う回路の記述

(例: case文の使用)

ibrary IEEE;
use IEEE.std_logic_1164.all;

entity COMB is
 port (A, B, C : IN std_logic
    F, G : OUT std_logic );
end COMB;

architecture RTL of COMB is
signal INDATA : std_logic_vector (2 downto 0);
signal OUTDATA : std_logic_vector (1 downto 0);
begin

INDATA <= A & B & C;
F <= OUTDATA(1);
G <= OUTDATA(0);

process (INDATA) begin
 case INDATA is
  when "000" => OUTDATA <= "01";
  when "001" => OUTDATA <= "00";
  when "010" => OUTDATA <= "01";
  when "011" => OUTDATA <= "01";
  when "100" => OUTDATA <= "01";
  when "101" => OUTDATA <= "00";
  when "110" => OUTDATA <= "11";
  when "111" => OUTDATA <= "11";
  when others => OUTDATA <= "XX";
 end case;
end process;

end RTL;

 

 












プロセス文の( )はセンシティビティリスト
と言い、値が変化すると実行開始。
組み合せ回路では
すべての入力信号を記述する。



すべての組み合せを記述する。
=>
は関係演算子ではない。
<=
も関係演算子ではない。

必ず others を記述する。
std_logic
には'0', '1'以外の値もあるから。


プロセス文を使う回路の記述

·         上記記述にはprocess文を含めて4つの同時処理文があり、個別が並列に動作する。

·         process文にはif文、case文、for-loop文などの順序処理文が記述できる。

·         組み合せ回路の生成にはセンシティビティリストにすべての入力を記述すし、case文やif文等ですべての場合を記述する。

·         要は入力の組み合せで出力が一義的に決まるように記述する。


if文を使う記述

ibrary IEEE;
use IEEE.std_logic_1164.all;

entity MUX4 is
 port (INPUT : IN std_logic_vector(3 downto 0);
    SEL : IN std_logic_vector(1 downto 0);
    Y : OUT std_logic );
end MUX4;

architecture RTL of MUX4 is
begin

process ( INPUT, SEL ) begin

  if (SEL = "00" ) then
     Y <= INPUT(0);
  elsif (SEL = "01" ) then
     Y <= INPUT(1);
  elsif (SEL = "10" ) then
     Y <= INPUT(2);
  else
     Y <= INPUT(3);
  end if;
end process;

end RTL;

 

 




プロセス文の( )はセンシティビティリスト
と言い、値が変化すると実行開始。
組み合せ回路では
すべての入力信号を記述する。



すべての組み合せを記述する。
したがって、最後はelseにする。
std_logic
には'0', '1'以外の値もあるから。

もし最後のelse以下がないと、
SEL="11"
の時にYは以前の値を保持
することになり、ラッチが必要になる。

elseif
ではなくelsifなので注意。


データタイプ Boolean と関係演算子

signal A, B, C : std_logic;
A <= ( B < C)
 ;        -- これは違反

signal A : std_logic_vector (3 downto 0) ;
signal B : std_logic_vector (2 downto 0) ;

A <= "1100"
  ---- 12
B <= "111"
   ---- 7
A > B
  --------> FALSE

signal C, D : std_logic_vector (0 to 3);

C <= "1100"
  ---- 3
D <= "0111"
  ---- 14
C < D
  ---------> FALSE

以上