演算


VHDLでは以下の演算子が用意されています。

演算の種類 論理演算(std_logic_vectorで可能) 数値演算(integer, realで可能)
否定 絶対値 ベキ乗 not  abc **
乗除算 * (ieee.std_logic_unsigned.all) * / mod rem
単項符号   + -
加減算 連結子 + -(ieee.std_logic_unsigned.all) & + -
関係演算子 = /= < > <= >= = /=
論理演算子 and or nand  nor  xor xnor  

この表で上に置かれた物が優先順位が高くなります。
library で use ieee.std_logic_unsigned.all; を登録することで、オーバロード機能が働き std_logic_vector タイプのデータは+-*を行うことができます。

演算例
a   <= b and c;
d   <= e + f;
g   <= (h and i) or (j and not (k and l)); --and, orは同じ優先度、notの優先度は高い

論理演算子は次のライブラリを追加することでリダクション演算もできます。

use ieee.std_logic_misc.all;

signal vctr : std_logic_vector(7 downto 0);
signal rda : std_logic;

rda <= and_reduce(vctr);
rda <= or_reduce(vctr);
rda <= nand_reduce(vctr);
rda <= nor_reduce(vctr);
rda <= xor_reduce(vctr);
rda <= xnor_reduce(vctr);

関係演算子の演算結果はBoolean値であるため、prosess文でstd_logicに置き換えます。

process (indt) begin
 if (indt < "110") then
  dodt  <= '0';
 else
  dodt  <= '1';
 end if;
end process;

3ステート出力も下の様にprosess文を使います。

process (trStat, inDt) begin
 if (trStat = '1') then
  OutDt <= inDt;
 else
  OutDt <= (others => 'Z'); 
 end if;
end process;


VHDL目次          MAIL  HOME