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;