■ 演算子
■論理演算子 not (否定)
CPLDをはじめて動作さるときのシンプルで 手ごろなサンプルを紹介します。
<試作品仕様>
・スイッチ信号をCPLDに入力する。
・CPLD内では 入力してきたスイッチ信号を演算子notをつかった回路で反転させる。
・入力信号が1(”High”、SW:off)の場合LEDを点灯させ、0(”Low”、SW:on)の場合はLEDを消灯させる。
<試作品回路図>(→回路図のPDFファイル)
ザイリンクス XC9572XLをつかった場合の回路図を以下に示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
記述例 <VHDLソースファイル>
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity c1110_Not is Port ( Sw1 : in STD_LOGIC; Led1 : out STD_LOGIC); end c1110_Not; architecture RTL of c1110_Not is begin Led1 <= not Sw1; -- 否定: not end RTL; ---------------------------------------------------------------------- --------------------------------------------------------------------- --<ucfソースファイル> #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "Led1" LOC = "P44" ; NET "Sw1" LOC = "P1" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE
<動作結果>
モード |
EUT写真 |
SW1: ON LED1: OFF |
|
SW1: OFF LED1: ON |
■ 論理演算子 and(論理積)、or(論理和)、nand(否定論理積)、nor(否定論理和)、xor(排他的論理和)
<試作品仕様>
@ SW1とSW2が共に1(off)ならLED1は消灯し、その他の場合は点灯すること。(and)
A SW3またはSW4のいずれかが1(off)ならLED2は消灯すること。その他の場合は点灯すること。(or)
B SW5とSW6が共に1(off)ならLED3は点灯し、その他の場合は消灯すること(nand)
C SW7またはSW8のいずれかが1(off)ならLED4は点灯すること。その他の場合は消灯のこと(nor)
D HEXスチッチのSW1とSW2が共に1(off)であるか、または共に0(on)である場合はLED5消灯し、その他の場合は点灯すること(xor)
<試作品回路図>(→回路図のPDFファイル)
ザイリンクス XC9572XLをつかった場合の回路図を以下に示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム> <VHDLソースファイル> library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity c1110_and_or_nand_nor_xor is Port ( Sw1 : in STD_LOGIC; Sw2 : in STD_LOGIC; Sw3 : in STD_LOGIC; Sw4 : in STD_LOGIC; Sw5 : in STD_LOGIC; Sw6 : in STD_LOGIC; Sw7 : in STD_LOGIC; Sw8 : in STD_LOGIC; Hex_Sw1 : in STD_LOGIC; Hex_Sw2 : in STD_LOGIC; Led1 : out STD_LOGIC; Led2 : out STD_LOGIC; Led3 : out STD_LOGIC; Led4 : out STD_LOGIC; Led5 : out STD_LOGIC); end c1110_and_or_nand_nor_xor; architecture RTL of c1110_and_or_nand_nor_xor is begin Led1 <= Sw1 and Sw2; --論理積 Led2 <= Sw3 or Sw4; --論理和 Led3 <= Sw5 nand Sw6; --否定的論理積 Led4 <= Sw7 nor Sw8; --否定的論理和 Led5 <= Hex_Sw1 xor Hex_Sw2; --排他的論理和 end RTL;
---------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------- --<ucfソースファイル> #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "Hex_Sw1" LOC = "P14" ; NET "Hex_Sw2" LOC = "P13" ; NET "Led1" LOC = "P44" ; NET "Led2" LOC = "P43" ; NET "Led3" LOC = "P40" ; NET "Led4" LOC = "P39" ; NET "Led5" LOC = "P38" ; NET "Sw1" LOC = "P1" ; NET "Sw2" LOC = "P2" ; NET "Sw3" LOC = "P3" ; NET "Sw4" LOC = "P4" ; NET "Sw5" LOC = "P6" ; NET "Sw6" LOC = "P7" ; NET "Sw7" LOC = "P8" ; NET "Sw8" LOC = "P9" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE
<動作結果>
■ 関係演算子、加法演算子、乗法演算子、シフト演算子、その他演算子
論理演算子のほかに以下のような演算子があります。
演算子名称 | 演算子記号 | 機能 | 例 | 備考 |
関係演算子 | = | 左オペランドとオペランドが等しい | if(A = B) | |
/= | 左オペランドと右オペランドは等しくない | if(A /= B) | ||
< | 左オペランドより右オペランドが大きい | if(A < B) | ||
<= | 左オペランドより右オペランドが大きいか等しい | if( A<= B) | 代入としてもこの記号は使用されるがコンパイラが文脈より判断する | |
> | 左オペランドより右オペランドが小さい | if( A > B) | ||
>= | 左オペランドより右オペランドが小さいが等しい | if( A>= B) | ||
加法演算子 | + | 左オペランドに右オペランド(定数)を加える | C <= A + B | |
減算演算子 | - | 左オペランドから右オペランド(定数)を引く | C <= A - B | |
連結演算子 | & | 左辺値(オペランド)と右辺値(オペランド)をつなぐ | signal A: static_logic; signal B: static_logic; signal C: staic_logic_vector(1 downto 0); C <= A & B; |
標準の定数をベクトル型の定数に変換する場合などに用いる |
乗算演算子 | * | 左オペランドと右オペランドをかける | C <= A * B | |
除算演算子 | / | 左オペランドを右オペランドで割る | C <= A / B | |
剰余演算子 | mod | 左オペランド(被除数、整数)を右オペランド(除数、整数)で割った時の余りで、符号は左オペランド(被除数)と 同符号である。また、その絶対値は除数より小さい。 C言語の%と同じ動作である。 |
C <= A mod B | 11 mode 4 -----> 3 -11 mode 4 -----> -3 |
rem | 左オペランド(被除数、整数)を右オペランド(除数、整数)で割った時の余りで、符号は右オペランド(除数)と 同符号である。また、その絶対値は右オペランドより小さい。 |
C <= A rem B | 11 rem 4 ----> 3 -11 rem 4 -----> 3 |
|
シフト演算子 | sll | 左オペランドの各ビットを右定数だけ左シフトする。空きビットには常に0が入る。 | C <= A sll 2(2ビット左へシフト) | 算術左シフト |
srl | 左オペランドの各ビットを右定数だけ右シフトする。空きビットには符号ビットと同じ内容が入る。 | C <= A srl 3(3ビット右へシフト) | 算術右シフト(符号拡張あり) | |
sla | 左オペランドの各ビットを右定数だけ左シフトする。空きビットには常に0が入る。 | C <= A sla 2 | 論理左シフト | |
sra | 左オペランドの各ビットを右定数だけ右シフトする。空きビットには常に0が入る。 | C <= A sra 3 | 論理右シフト(符号拡張なし) | |
rol | 左オペランドの各ビットを右定数だけ左シフトする。空きビットにはMSBが入る。 | C <= A rol 2 | 論理左回転 | |
ror | 右オペランドの各ビットを右定数だけ右シフトする。空きビットにはLSBが入る。 | C <= A ror 3 | 論理右回転 | |
べき乗演算子 | ** | 左オペランドを右オペランド(整数)乗する。 | C <= A ** 3(Aの3乗) | |
絶対値演算子 | abs | 左オペランドの絶対値を取得する。 | C <= abs A |
■ 階層設計
回路をコンポーネント化して、階層設計をおこなう場合ソースコードの記述方式として下記の3つがあります。
@ architecture部にコンポーネント名を記載し、同一のLソースファイルの中に記載する方式
A architecture部にコンポーネント名を記載し、上位階層ソースファイルとは別にコンポーネントだけの下位階層ファイルをつくり同一ディレクトリに置きコンパイルする。
B architecture部にコンポーネント名を記載し、パッケージ宣言文の中でuse文から呼び出す。