あの格安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. 実験結果
こんな感じで動作確認ができた。