LIFE LOG(ここにはあなたのブログ名)

作業日誌 う靴

気ままにコンピュータ関連の備忘録などを書きます...。

あの格安FPGAボードで 7セグメントLED をドライブする~Part.2

1. はじめに

 あの格安FPGAボードを今回はタクトスイッチによる入力ではなく、FPGAボードにあらかじめ搭載の水晶発振器(50MHz)のクロック入力を用いて、自動で数を数えてくれる基本的なアップカウンタを設計してみます。ストップウォッチになる一歩前段階の制作です。Part.1とは違い、今回はブロック図を繋ぐやり方ではなく、全部VHDLで記述します。 (※ちなみに、Amazonの購入先リンクを貼っておきますが、AliExpressで検索すれば同一商品がもう少し安くみつかります)

2. 実装する機能について

・7セグメントLED の表示がFPGAボード搭載の水晶発振器(50MHz)のクロック入力のたびに(1秒毎に)、カウントアップする。

・クロック入力されるに応じて、0~Fまでの16進数を数える。(今回も、とりあえず7セグLEDは1個だけの使用です)

3. VHDLコード(全文)

UpCounter.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity UpCounter is
port(      CLK           :      in      std_logic;
          SEG7LED   :     out    std_logic_vector(7 downto 0)   );
end UpCounter;


architecture RTL of UpCounter is
signal CNT : integer range 0 to 24999999;      --500ms分確保
signal T500: std_logic;
signal BIN4 : std_logic_vector(3 downto 0);
signal DP : std_logic;

begin

        --タイマー(500msごと)
    process( CLK )
    begin
          if( CLK'event and CLK = '1') then
             if( CNT = 24999999 ) then
                T500 <= '1';
                CNT   <= 0;
             else
                CNT <= CNT + 1;
                T500 <= '0';
             end if;
              end if;
    end process;
    
    
   --フリップ・フロップ
    process( T500 )
    begin
       if( T500'event and T500='1') then
            DP <= not DP;
        end if;
    end process;
    
    
      --カウンタ 
      process(DP)
      begin
        if(DP'event and DP = '1') then
               if( BIN4 = "1111" ) then
                    BIN4 <= "0000";
                else
                  BIN4 <= BIN4 + 1;
               end if;
         end if;
      end process;
    
      --デコーダ
      process(BIN4)
      begin
            case BIN4 is
                 when "0000" => SEG7LED <= "11111100";  --0
                 when "0001" => SEG7LED <= "01100000";  --1
                 when "0010" => SEG7LED <= "11011010";  --2
                 when "0011" => SEG7LED <= "11110010";  --3
                 when "0100" => SEG7LED <= "01100110";  --4
                 when "0101" => SEG7LED <= "10110110";  --5
                 when "0110" => SEG7LED <= "10111110";  --6
                 when "0111" => SEG7LED <= "11100100";  --7
                 when "1000" => SEG7LED <= "11111110";  --8
                 when "1001" => SEG7LED <= "11110110";  --9
                 when "1010" => SEG7LED <= "11101110";  --A
                 when "1011" => SEG7LED <= "00111110";  --b
                 when "1100" => SEG7LED <= "10011100";  --C
                 when "1101" => SEG7LED <= "01111010";  --d
                 when "1110" => SEG7LED <= "10011110";  --E
                 when others => SEG7LED <= "10001110";  --F
            end case;
       end process;
    
end RTL;

4. 実験結果

 こんな感じで動作確認ができた。

www.youtube.com