組み合せ回路の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 ;  と簡単化される。


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

(例)

回路図のそのままの記述 簡単化後の回路そのままの記述
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 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文の使用)

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 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'以外の値もあるから。


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


if文を使う記述

library 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