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桁目の数字を表示しています。