FPGA 回路ブロック Tips (初級)
■ スイッチによるLEDのON・OFF TKDN-SP6-45(Spartan-6)編
<試作品仕様>
・オルタネートスイッチによりLEDをON・OFFすること
・回路数は4回路とする。
・FPGAは ザイリンクス Spartan-6 XC6SLX45-CSG324 とする。
・使用する評価ボードは 特殊電子回路 TDKN-SP6-45とする。
<試作品回路図> (→ 回路図のPDFファイル)
試作品の回路図を示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> <vhdソースファイル> library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity f1112_SLX45_Led_OnOff2 is Port ( Sw1 : in STD_LOGIC; Sw2 : in STD_LOGIC; Sw3 : in STD_LOGIC; Sw4 : in STD_LOGIC; Led1 : out STD_LOGIC; Led2 : out STD_LOGIC; Led3 : out STD_LOGIC; Led4 : out STD_LOGIC); end f1112_SLX45_Led_OnOff2; architecture RTL of f1112_SLX45_Led_OnOff2 is begin Led1 <= not Sw1; Led2 <= not Sw2; Led3 <= not Sw3; Led4 <= not Sw4; end RTL; --------------------------------------------------------------------------
<ucfソースファイル> NET "Sw1" LOC = "N4"; NET "Sw2" LOC = "P4"; NET "Sw3" LOC = "N3"; NET "Sw4" LOC = "N5"; NET "Led1" LOC = "C6"; NET "Led2" LOC = "B2"; NET "Led3" LOC = "B3"; NET "Led4" LOC = "A2";
<動作結果>
ディップスイッチで赤色LEDがON・OFFしているところの写真です。
■ スイッチによるLEDのON・OFF XP68-01-LX16(Sprartan-6 PLCC)編
<試作品仕様>
・オルタネートスイッチによりLEDをON・OFFすること
・回路数は4回路とする。
・FPGAは ザイリンクス Spartan-6 XC6SLX16-2CSG225C とする。
・使用する評価ボードは (有)ヒューマンデータ XP68-01-LX16(外形: PLCC 68ピン相当) とする。
<試作品回路図> (→ 回路図のPDFファイル)
試作品の回路図を示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> <vhdソースファイル>
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_Logic_Arith.All; use Ieee.Std_Logic_Unsigned.All; entity f1112_Xp68_16_Led_OnOff is Port ( Sw1 : in STD_LOGIC; Sw2 : in STD_LOGIC; Sw3 : in STD_LOGIC; Sw4 : in STD_LOGIC; Led1 : out STD_LOGIC; Led2 : out STD_LOGIC; Led3 : out STD_LOGIC; Led4 : out STD_LOGIC); end f1112_Xp68_16_Led_OnOff; architecture RTL of f1112_Xp68_16_Led_OnOff is begin Led1 <= not Sw1; Led2 <= not Sw2; Led3 <= not Sw3; Led4 <= not Sw4; end RTL;
<ucfソースファイル> # Xp68-16 Led On/Off NET "Sw1" LOC = "D4"; NET "Sw2" LOC = "E3"; NET "Sw3" LOC = "D3"; NET "Sw4" LOC = "D1"; NET "Led1" LOC = "B3"; NET "Led2" LOC = "A3"; NET "Led3" LOC = "C4"; NET "Led4" LOC = "A4";
<動作結果>
ディップスイッチで赤色LEDがON・OFFしているところの写真です。
■ HEXスイッチによる7セグメントLED表示 TKDN-SP6-45(Spartan-6) 編
<試作品仕様>
・ HEX スイッチ(16進スイッチ)の接点出力を 7セグメントLEDに表示する。
・表示文字範囲は 0 1 2 … C d E F の16文字とする。
・FPGAは ザイリンクス Spartan-6 XC6SLX45-CSG324 とする。
・使用する評価ボードは 特殊電子回路 TDKN-SP6-45とする。
<試作品回路図> (→ 回路図のPDFファイル)
試作品の回路図を示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> <vhdソースファイル> library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity f1112_SLX45_HexSw_7seg is Port ( Hex_SW : in STD_LOGIC_VECTOR(3 downto 0); Seg7_Led : out STD_LOGIC_VECTOR (7 downto 0)); end f1112_SLX45_HexSw_7seg; architecture RTL of f1112_SLX45_HexSw_7seg is signal nHex_Sw : std_logic_vector(3 downto 0); begin nHex_SW <= Hex_SW; process(nHex_SW) begin case nHex_SW is --各segmenntとの関係 ".gfedcba" when "0000" => seg7_Led(7 downto 0) <= "01000000"; --0 when "0001" => seg7_Led(7 downto 0) <= "01111001"; --1 when "0010" => seg7_Led(7 downto 0) <= "00100100"; --2 when "0011" => seg7_Led(7 downto 0) <= "00110000"; --3 when "0100" => seg7_Led(7 downto 0) <= "00011001"; --4 when "0101" => seg7_Led(7 downto 0) <= "00010010"; --5 when "0110" => seg7_Led(7 downto 0) <= "00000010"; --6 when "0111" => seg7_Led(7 downto 0) <= "01111000"; --7 when "1000" => seg7_Led(7 downto 0) <= "00000000"; --8 when "1001" => seg7_Led(7 downto 0) <= "00010000"; --9 when "1010" => seg7_Led(7 downto 0) <= "00001000"; --A when "1011" => seg7_Led(7 downto 0) <= "00000011"; --b when "1100" => seg7_Led(7 downto 0) <= "01000110"; --C when "1101" => seg7_Led(7 downto 0) <= "00100001"; --d when "1110" => seg7_Led(7 downto 0) <= "00000110"; --E when "1111" => seg7_Led(7 downto 0) <= "00001110"; --F when others => seg7_Led(7 downto 0) <= "00000000"; --その他の場合 end case; end process; end RTL;
<ucfソースファイル>
# in Port NET "Hex_SW<0>" LOC = "V4"; NET "Hex_SW<1>" LOC = "T3"; NET "Hex_SW<2>" LOC = "T4"; NET "Hex_SW<3>" LOC = "R3"; # out Port NET "Seg7_Led<0>" LOC = "A10"; NET "Seg7_Led<1>" LOC = "C10"; NET "Seg7_Led<2>" LOC = "C8"; NET "Seg7_Led<3>" LOC = "D8"; NET "Seg7_Led<4>" LOC = "A6"; NET "Seg7_Led<5>" LOC = "C7"; NET "Seg7_Led<6>" LOC = "A5"; NET "Seg7_Led<7>" LOC = "B6";
<動作結果>
・HEX スイッチの信号が 10(10進数)の場合の写真で、 7セグメントLEDにはAが表示されています。
■ HEXスイッチによる7セグメントLED表示 XP68-01-LX16(Sprartan-6 PLCC)編
<試作品仕様>
・ HEX スイッチ(16進スイッチ)の接点出力を 7セグメントLEDに表示する。
・表示文字範囲は 0 1 2 … C d E F の16文字とする。
・FPGAは ザイリンクス Spartan-6 XC6SLX16-2CSG225C とする。
・使用する評価ボードは (有)ヒューマンデータ XP68-01-LX16(外形: PLCC 68ピン相当) とする。
<試作品回路図> (→ 回路図のPDFファイル)
試作品の回路図を示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> <vhdソースファイル> library IEEE; use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_logic_Arith.All; use Ieee.Std_logic_Unsigned.All; entity f1112_Xp68_16_HexSw_7seg is Port ( Hex_SW : in Std_Logic_Vector(3 downto 0); Seg7_Led : out STD_LOGIC_VECTOR (7 downto 0)); end f1112_Xp68_16_HexSw_7seg; architecture RTL of f1112_Xp68_16_HexSw_7seg is signal nHex_Sw : Std_Logic_Vector(3 downto 0); begin nHex_Sw <= not Hex_Sw; process(nHex_Sw) begin case nHex_SW is --各segmenntとの関係 ".gfedcba" when "0000" => seg7_Led(7 downto 0) <= "01000000"; --0 when "0001" => seg7_Led(7 downto 0) <= "01111001"; --1 when "0010" => seg7_Led(7 downto 0) <= "00100100"; --2 when "0011" => seg7_Led(7 downto 0) <= "00110000"; --3 when "0100" => seg7_Led(7 downto 0) <= "00011001"; --4 when "0101" => seg7_Led(7 downto 0) <= "00010010"; --5 when "0110" => seg7_Led(7 downto 0) <= "00000010"; --6 when "0111" => seg7_Led(7 downto 0) <= "01111000"; --7 when "1000" => seg7_Led(7 downto 0) <= "00000000"; --8 when "1001" => seg7_Led(7 downto 0) <= "00010000"; --9 when "1010" => seg7_Led(7 downto 0) <= "00001000"; --A when "1011" => seg7_Led(7 downto 0) <= "00000011"; --b when "1100" => seg7_Led(7 downto 0) <= "01000110"; --C when "1101" => seg7_Led(7 downto 0) <= "00100001"; --d when "1110" => seg7_Led(7 downto 0) <= "00000110"; --E when "1111" => seg7_Led(7 downto 0) <= "00001110"; --F when others => seg7_Led(7 downto 0) <= "00000000"; --その他の場合 end case; end process; end RTL;
<ucfソースファイル> # f1112_Xp68_16_HexSw_7seg NET "Hex_Sw<0>" LOC = "C2"; NET "Hex_Sw<1>" LOC = "C1"; NET "Hex_Sw<2>" LOC = "E2"; NET "Hex_Sw<3>" LOC = "E1"; NET "Seg7_Led<0>" LOC = "A7"; NET "Seg7_Led<1>" LOC = "B7"; NET "Seg7_Led<2>" LOC = "A13"; NET "Seg7_Led<3>" LOC = "B13"; NET "Seg7_Led<4>" LOC = "A11"; NET "Seg7_Led<5>" LOC = "B11"; NET "Seg7_Led<6>" LOC = "A6"; NET "Seg7_Led<7>" LOC = "F3";
--------------------------------------------
<動作結果>
8のように見えますが 5を表示した時の写真です。
■ フリーランカウンタ(7セグメントLED 10進2桁) TKDN-SP6-45(Spartan-6)編
<試作品仕様>
・FPGAの外部に1MHzの発振器を接続してこのパルスをもとに1秒ごとにインクリメントするカウンタをつくる。
・表示は0〜99までの10進整数とする。 99のあとは0に戻ること
・表示は2つの7セグメントLEDを使用すること
・FPGAは ザイリンクス Spartan-6 XC6SLX45-CSG324 とする。
・使用する評価ボードは 特殊電子回路 TDKN-SP6-45とする。
<試作品回路図> (→ 回路図のPDFファイル)
試作品の回路図を示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> <vhdソースファイル> library IEEE; --最上層ブロック use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity f1112_SLX45_FreeCounter_10MHz is Port ( Clk : in STD_LOGIC; Seg7_0 : out STD_LOGIC_VECTOR (7 downto 0); Seg7_1 : out STD_LOGIC_VECTOR (7 downto 0)); end f1112_SLX45_FreeCounter_10MHz; architecture RTL of f1112_SLX45_FreeCounter_10MHz is Signal Count1: Integer range 0 to 10000000; Signal Count2: Integer range 0 to 9; Signal Count3: Integer range 0 to 9; component Display0 is --コンポーネント宣言 Port ( Count2 : in Integer range 0 to 10; Seg7_0 : out STD_LOGIC_VECTOR (7 downto 0)); end component; component Display1 is --コンポーネント宣言 Port ( Count3 : in Integer range 0 to 10; Seg7_1 : out STD_LOGIC_VECTOR (7 downto 0)); end component; begin process(Clk) begin if(Clk' event and Clk = '1')then --1msec毎 Count1 <= Count1 + 1; if(Count1 >= 10000000)then --1sec毎 Count1 <= 0; Count2 <= Count2 +1; --0〜15の繰り返し if(Count2 >= 9)then Count2 <= 0; Count3 <= Count3 + 1; if(Count3 >= 9)then Count3 <= 0; end if; end if; end if; end if; end process; U1: Display0 port map(Count2,Seg7_0); U2: Display1 port map(Count3,Seg7_1); end RTL; ---------------------------------------------------------------------- library IEEE; --下位層ブロック use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_Logic_Arith.All; use Ieee.Std_Logic_Unsigned.All; entity Display1 is --7セグメントLED表示ライブラリ Port ( Count3 : in Integer range 0 to 10; Seg7_1 : out STD_LOGIC_VECTOR (7 downto 0)); end Display1; architecture RTL of Display1 is begin process(Count3) --7セグメントLED 16進表示 begin case(Count3) is when 0 => Seg7_1 <= "11000000"; --0 when 1 => Seg7_1 <= "11111001"; --1 when 2 => Seg7_1 <= "10100100"; --2 when 3 => Seg7_1 <= "10110000"; --3 when 4 => Seg7_1 <= "10011001"; --4 when 5 => Seg7_1 <= "10010010"; --5 when 6 => Seg7_1 <= "10000010"; --6 when 7 => Seg7_1<= "11111000"; --7 when 8 => Seg7_1 <= "10000000"; --8 when 9 => Seg7_1 <= "10010000"; --9 when 10 => Seg7_1 <= "10001000"; --A when others => Seg7_1 <="10000110"; --その他の場合 end case; end process; end RTL; -------------------------------------------------------------------------- library IEEE; --下位層ブロック use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_Logic_Arith.All; use Ieee.Std_Logic_Unsigned.All; entity Display0 is --7セグメントLED表示ライブラリ Port ( Count2 : in Integer range 0 to 10; Seg7_0 : out STD_LOGIC_VECTOR (7 downto 0)); end Display0; architecture RTL of Display0 is begin process(Count2) --7セグメントLED 16進表示 begin case(Count2) is when 0 => Seg7_0 <= "11000000"; --0 when 1 => Seg7_0 <= "11111001"; --1 when 2 => Seg7_0 <= "10100100"; --2 when 3 => Seg7_0 <= "10110000"; --3 when 4 => Seg7_0 <= "10011001"; --4 when 5 => Seg7_0 <= "10010010"; --5 when 6 => Seg7_0 <= "10000010"; --6 when 7 => Seg7_0 <= "11111000"; --7 when 8 => Seg7_0 <= "10000000"; --8 when 9 => Seg7_0 <= "10010000"; --9 when 10 => Seg7_0 <= "10001000"; --A when others => Seg7_0 <="10000110"; --その他の場合 end case; end process; end RTL;
<ucfソースファイル> # C1112_SLX45_FeerunCounter_10MHz.ucf NET "Clk" LOC = "T8"; NET "Seg7_0<0>" LOC = "A10" ; NET "Seg7_0<1>" LOC = "C10" ; NET "Seg7_0<2>" LOC = "C8" ; NET "Seg7_0<3>" LOC = "D8" ; NET "Seg7_0<4>" LOC = "A6" ; NET "Seg7_0<5>" LOC = "C7" ; NET "Seg7_0<6>" LOC = "A5" ; NET "Seg7_0<7>" LOC = "B6" ; NET "seg7_1<0>" LOC = "B14" ; NET "seg7_1<1>" LOC = "A14" ; NET "seg7_1<2>" LOC = "C13" ; NET "seg7_1<3>" LOC = "A13" ; NET "seg7_1<4>" LOC = "B12" ; NET "seg7_1<5>" LOC = "A12" ; NET "seg7_1<6>" LOC = "B11" ; NET "seg7_1<7>" LOC = "A11" ; }
-------------------------------------------
<動作結果>
カウント数58の時の写真です。 上段が1桁目の数字を、下段が2桁目の数字を表します。
■ フリーランカウンタ(7セグメントLED 10進2桁) XP68-01-LX16(Sprartan-6 PLCC)編
<試作品仕様>
・FPGAの外部に1MHzの発振器を接続してこのパルスをもとに1秒ごとにインクリメントするカウンタをつくる。
・表示は0〜99までの10進整数とする。 99のあとは0に戻ること
・表示は2つの7セグメントLEDを使用すること
・FPGAは ザイリンクス Spartan-6 XC6SLX16-2CSG225C とする。
・使用する評価ボードは (有)ヒューマンデータ XP68-01-LX16(外形: PLCC 68ピン相当) とする。
<試作品回路図> (→ 回路図のPDFファイル)
試作品の回路図を示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> <vhdソースファイル> library IEEE; use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_Logic_1164.All; use Ieee.Std_Logic_1164.All; entity f1112_Xp68_16_FreeRun_Counter_10MH is Port ( Clk : in STD_LOGIC; Seg7_0 : out STD_LOGIC_VECTOR (7 downto 0); Seg7_1 : out STD_LOGIC_VECTOR (7 downto 0)); end f1112_Xp68_16_FreeRun_Counter_10MH; architecture RTL of f1112_Xp68_16_FreeRun_Counter_10MH is Signal Count1: Integer range 0 to 10000000; Signal Count2: Integer range 0 to 9; Signal Count3: Integer range 0 to 9; component Display0 is --コンポーネント宣言 Port ( Count2 : in Integer range 0 to 10; Seg7_0 : out STD_LOGIC_VECTOR (7 downto 0)); end component; component Display1 is --コンポーネント宣言 Port ( Count3 : in Integer range 0 to 10; Seg7_1 : out STD_LOGIC_VECTOR (7 downto 0)); end component; begin process(Clk) begin if(Clk' event and Clk = '1')then --1msec毎 Count1 <= Count1 + 1; if(Count1 >= 10000000)then --1sec毎 Count1 <= 0; Count2 <= Count2 +1; --0〜15の繰り返し if(Count2 >= 9)then Count2 <= 0; Count3 <= Count3 + 1; if(Count3 >= 9)then Count3 <= 0; end if; end if; end if; end if; end process; U1: Display0 port map(Count2,Seg7_0); U2: Display1 port map(Count3,Seg7_1); end RTL; ---------------------------------------------------------------------- library IEEE; --下位層ブロック use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_Logic_Arith.All; use Ieee.Std_Logic_Unsigned.All; entity Display1 is --7セグメントLED表示ライブラリ Port ( Count3 : in Integer range 0 to 10; Seg7_1 : out STD_LOGIC_VECTOR (7 downto 0)); end Display1; architecture RTL of Display1 is begin process(Count3) --7セグメントLED 16進表示 begin case(Count3) is when 0 => Seg7_1 <= "11000000"; --0 when 1 => Seg7_1 <= "11111001"; --1 when 2 => Seg7_1 <= "10100100"; --2 when 3 => Seg7_1 <= "10110000"; --3 when 4 => Seg7_1 <= "10011001"; --4 when 5 => Seg7_1 <= "10010010"; --5 when 6 => Seg7_1 <= "10000010"; --6 when 7 => Seg7_1<= "11111000"; --7 when 8 => Seg7_1 <= "10000000"; --8 when 9 => Seg7_1 <= "10010000"; --9 when 10 => Seg7_1 <= "10001000"; --A end case; end process; end RTL; -------------------------------------------------------------------------- library IEEE; --下位層ブロック use IEEE.STD_LOGIC_1164.ALL; use Ieee.Std_Logic_Arith.All; use Ieee.Std_Logic_Unsigned.All; entity Display0 is --7セグメントLED表示ライブラリ Port ( Count2 : in Integer range 0 to 10; Seg7_0 : out STD_LOGIC_VECTOR (7 downto 0)); end Display0; architecture RTL of Display0 is begin process(Count2) --7セグメントLED 16進表示 begin case(Count2) is when 0 => Seg7_0 <= "11000000"; --0 when 1 => Seg7_0 <= "11111001"; --1 when 2 => Seg7_0 <= "10100100"; --2 when 3 => Seg7_0 <= "10110000"; --3 when 4 => Seg7_0 <= "10011001"; --4 when 5 => Seg7_0 <= "10010010"; --5 when 6 => Seg7_0 <= "10000010"; --6 when 7 => Seg7_0 <= "11111000"; --7 when 8 => Seg7_0 <= "10000000"; --8 when 9 => Seg7_0 <= "10010000"; --9 when 10 => Seg7_0 <= "10001000"; --A end case; end process; end RTL;
<urfソースファイル> #f1112_Xp68_16_FreeRun_Counter_10MHz NET "Clk" LOC = "J2"; NET "Seg7_0<0>" LOC = "A7"; NET "Seg7_0<1>" LOC = "B7"; NET "Seg7_0<2>" LOC = "A13"; NET "Seg7_0<3>" LOC = "B13"; NET "Seg7_0<4>" LOC = "A11"; NET "Seg7_0<5>" LOC = "B11"; NET "Seg7_0<6>" LOC = "A6"; NET "Seg7_0<7>" LOC = "F3"; NET "Seg7_1<0>" LOC = "M4"; NET "Seg7_1<1>" LOC = "C8"; NET "Seg7_1<2>" LOC = "A9"; NET "Seg7_1<3>" LOC = "B9"; NET "Seg7_1<4>" LOC = "C11"; NET "Seg7_1<5>" LOC = "D11"; NET "Seg7_1<6>" LOC = "A12"; NET "Seg7_1<7>" LOC = "C12";
----------------------------------------------
<動作結果>
カウント数が53の時の写真です。 上段が1桁目、下段が2桁目の数字を表示しています。