あのFPGAボードで 7セグメントLED をドライブする①

#1.　はじめに
　**[あのFPGAボード]****(WINGONEER ALTERA FPGA Cyclonell EP2C5T144)**で、定番の**7セグメントLED**(とりあえず今回は1ケタ)をドライブする基本的な記事です。QuartusⅡ自体の操作に慣れるという意味でも、再現できるように、できるかぎり具体的な手順を追って書いていきます。
　VHDLで記述した回路を**ブロック図(Block Diagram)**として登録し、それらブロック図をグラフィカルにつなぎ合わせて、目的とする**「機能」**をもつ回路を設計するやり方を、自分への備忘録も兼ねて書きます。
[あのFPGAボード]:https://qiita.com/uuktu/items/11e97611090c909e1343

#2.　実装する機能について
・[７セグメントLED] がタクトスイッチを１回押すたびごとに、カウントアップする。
・そうして、**０～９まで**の数を数えられる。（今回、とりあえず７セグLEDは１個だけの使用です）
・タクトスイッチを押したときの**チャタリング防止機能**をつける。
（チャタリングとは、スイッチを押すときに機械接点がバウンドして小刻みなON/OFFを繰り返す現象。入力状態が不安定になるので、防止対策をとるのが一般的）
[７セグメントLED]:http://akizukidenshi.com/catalog/g/gI-00215/

#3.　完成回路図
　先に、**QuartusⅡで簡単に設計した回路**の完成図を図示します。最終的にはこんな感じで、VHDLのコードを書く、あるいは各種ブロック（シンボル）を組み合わせながら開発をして、目的とする**「機能」**を実装していきます。
![キャプチャcu.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/384e946e-0bc4-e516-70fe-3ace8b14a119.jpeg)


　なお、この全体回路図の中に含まれているブロックのそれぞれは単一の機能をもつモジュールのようなもので、これらを組み合わせて（組み合わせ論理回路）、うまい具合に目的の**「機能」**を実装します。この図では、外からの見た目はブロックのように見えるものの、中身はVHDLコードで記述されており、あくまでも人が開発する上で理解しやすいグラフィカルな表示になっているだけです（たしか...）。
　この図から、**２入力（CLK, SW）、８出力（７セグLED + 小数点LED1つ）**の回路をこれから組み上げていくイメージをなんとなく先に持っておくと理解しやすいかと思います。

#4.　実験回路の作製
　FPGAボード、７セグメントLED、タクトスイッチの実体配線は図のような感じになりました。ジャンパワイヤでごちゃごちゃしてますが、ブレッドボード上での実験ということでいつも通りです。７セグLEDのピン配置については、[こちらの記事]を参考にさせていただきました。
　スイッチ側のプルアップ抵抗は入れましたが、７セグLEDへの電流制限抵抗は今回自分は入れませんでした...( ﾟДﾟ)。Quartus上で設定するピンアサインと実体配線が一致するように注意します。Quartus上でのピンアサイン図を載せておきますので、それを参考に実験回路を作製してください。

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/925198f8-cea9-014e-982e-6c7aef4416ac.jpeg">;
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/932f63c1-1de2-7309-e54b-033eb8885034.jpeg">;
</div>
[こちらの記事]:https://qiita.com/hola/items/b18bda3e3717817181b8


#5.　VHDLコード全文とBlock Diagram (~.bdf)上での回路設計

```vhdl:BINCNT4.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

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

architecture RTL of BINCNT4 is
signal BIN4 : std_logic_vector(3 downto 0);
begin
   --カウンタ 
   process(DIN)
	begin
	    if(DIN'event and DIN = '1') then
			   if( BIN4 = "1001" ) then
				    BIN4 <= "0000";
				else
		          BIN4 <= BIN4 + 1;
			   end if;
		 end if;
   end process;
	
	process(BIN4)
	begin
			case BIN4 is
				 when "0000" => SEG7LED <= "00000011";  --0
				 when "0001" => SEG7LED <= "10011111";  --1
				 when "0010" => SEG7LED <= "00100101";  --2
				 when "0011" => SEG7LED <= "00001101";  --3
				 when "0100" => SEG7LED <= "10011001";  --4
				 when "0101" => SEG7LED <= "01001001";  --5
				 when "0110" => SEG7LED <= "01000001";  --6
				 when "0111" => SEG7LED <= "00011011";  --7
				 when "1000" => SEG7LED <= "00000001";  --8
				 when "1001" => SEG7LED <= "00001001";  --9
				 when "1010" => SEG7LED <= "00010001";  --A
				 when "1011" => SEG7LED <= "11000001";  --b
				 when "1100" => SEG7LED <= "01101011";  --C
				 when "1101" => SEG7LED <= "10000101";  --d
				 when "1110" => SEG7LED <= "01100001";  --E
				 when others => SEG7LED <= "01110001";  --F
		    end case;
	end process;
end RTL;
```

```vhdl:CHATTER.vhd

library ieee;
use ieee.std_logic_1164.all;

entity CHATTER is
	port( SSW:		out std_logic;
			CLK, SW: in  std_logic );
end CHATTER;

architecture RTL of CHATTER is
   signal CHATT :   std_logic_vector( 3 downto 0 );
	signal CNT1MS:   integer range 0 to 4999;
begin
process (CLK) begin
	if ( CLK'event and CLK = '1') then
		if(CNT1MS = 4999) then 
			CNT1MS <= 0;
			CHATT <= CHATT (2 downto 0) & SW;
		else
			CNT1MS <= CNT1MS + 1;
		end if;
	end if;
end process;

SSW <= CHATT (3) or CHATT (2) or CHATT (1) or CHATT (0);

end RTL; 
```


・この２つのVHDLファイルが記述出来たら、それぞれをブロック図（シンボル）として登録してみます。VHDLファイルのタブで選んだ状態で、上部メニューバーの "File" -> "Create/Update" -> "Create Symbol Files for Current File" を選択すると、シンボル登録の完了です。

・シンボルとして登録が完了したら、Block Diagram上で図のようなアイコンを選択し、"Symbol"ウィンドウを開きます。すると、"Project"の中にいま生成した`CHATTER`や`BITCNT4`が回路図中に置くシンボルとして選択できるようになっています!!
![キャプチャ44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/0148279a-9803-d9b1-6f90-500d82567eca.jpeg)
・ここまででVHDLコードで記述したものをシンボルとしてブロック図のように組み合わせ、回路を設計することができるようになりました。下図のように、シンボルを置いたり各種配線をする（配線に名前を付けて配線すると確実です）などして設計が完了した回路図を、例えば`top.bdf`のファイル名で保存します。（※詳しい操作方法などは[こちらのPDF]を参考にしながらやりました）

`top.bdf`
![キャプチャcu.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/3d5c8acf-1579-c042-5c5b-aa0659ea20bf.jpeg)
[こちらのPDF]:https://www.macnica.co.jp/business/semiconductor/articles/pdf/ELS1270_Q1000_10__1.pdf

・`SEG7LED[7..0]`の出力バス（束）をNOTゲートで一度すべて反転させている理由は、使用した７セグLEDがカソードコモンである仕様に対応させるためです。（７セグLEDがアクティブLOWの想定でVHDLを書いていたのですが、後々確認したら７セグLEDがアクティブHIGHだったので...）

**※設定上の注意点として...**
・プロジェクト名を右クリックして表示されるメニューの "Settings.." -> "General"の"Top-level entity" で `top.bdf`と設定する。

・"Settings.." -> "Files"の"File Name"欄に`top.bdf`, `CHATTER.vhd`, `BITCNT4.vhd`がすべて設定されているようにする。

#6.　実験結果
　タクトスイッチを１回押すごとに（しっかりとチャタリングが防止されたうえで）、７セグLEDに表示された数字が０～９のあいだでカウントアップされました!!　
![IMG_0438.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/9e57daa2-efa3-89f5-19e9-38f4aa9a8f94.jpeg)
![IMG_0439.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630856/2b11ae31-66cd-c367-0d95-e52ef4a0e7eb.jpeg)

#7.　まとめ
　[あのFPGAボード]と７セグメントLEDを１つ用いて、チャタリング防止しながらタクトスイッチを１回押すたびに０～９のあいだで確実に１カウントアップする基本的な回路の設計演習を行いました。次は同じハードウェアで桁数を増やしてとりあえずストップウォッチでしょうか...。

#8.　参考図書
・[見てわかるVHDL]
[見てわかるVHDL]:https://www.amazon.co.jp/%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8BVHDL-%E5%9D%82%E5%B7%BB-%E4%BD%B3%E5%AF%BF%E7%BE%8E/dp/476931213X/ref=sr_1_33?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=VHDL&qid=1589496630&sr=8-33

・[ハードウェア記述言語によるディジタル回路設計の基礎―VHDLによる回路設計]
[ハードウェア記述言語によるディジタル回路設計の基礎―VHDLによる回路設計]:https://www.amazon.co.jp/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%98%E8%BF%B0%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E5%9B%9E%E8%B7%AF%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E7%A4%8E%E2%80%95VHDL%E3%81%AB%E3%82%88%E3%82%8B%E5%9B%9E%E8%B7%AF%E8%A8%AD%E8%A8%88-%E9%9B%BB%E6%B0%97%E3%83%BB%E9%9B%BB%E5%AD%90%E5%B7%A5%E5%AD%A6%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E6%9C%A8%E6%9D%91-%E8%AA%A0%E8%81%A1/dp/4901683934/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=VHDL&qid=1589496630&sr=8-4