3ビットカウンターをVerilogで実装してModelSimでシミュレーションを行う

# 前提条件
QuartusとModelSimがパソコンにインストールされていること。

# 環境
OS: Windows 10
Quartus Prime Version: Lite, Version 17

# Verilog コード

今回は3ビットカウンタを実装することにします。メインのプログラムのファイル名は`coinc.v`、テストするプログラムのファイル名は`coinc_TEST.v`とします。

## coinc.v

```
module coinc (RESD, CLK, C);
input RESD, CLK;
output [2:0] C;
reg [2:0] C;

always @(posedge CLK or negedge RESD)
	begin
		if (RESD == 1'b0) C <= 3'b000;
		else C <= C + 3'b001;
	end

endmodule

```
## coinc_TEST.v

```
module coinc_TEST;

reg RESD, CLK;
wire [2:0] C;

coinc tcounter4 (RESD, CLK, C);


initial
	begin
		CLK = 0;
		forever #50 CLK = !CLK;
	end

initial
	begin
		RESD = 1;
		#10 RESD = 0;
		#20 RESD = 1;
	end

initial
	$monitor (" %3d, %d, %d, %d", $stime, RESD, CLK, C);

endmodule
```

# Start Analysis and Synthesis

Quartusに上記の二つのソースコードの記述が終わったら、`coinc_TEST.v`にいるまま、上の画面で`start analysis and synthesis`を押します。

![スクリーンショット (33)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/51c69c9f-1494-e079-6d17-0e39f5a4a18e.jpeg)

終わったらModelSimを開きます。

# ModelSimにてシミュレーションまで

ModelSimをまず開き、`File`を開いて`change directory`を押してソースコードがおかれているディレクトリを選びます。
![スクリーンショット (35)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/2f487a0f-d1e3-3c1d-1c58-923487aa61ef.jpeg)

そのあと、もう一度`File`を開いて`Library`を押します。
![スクリーンショット (36)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/dc1ebece-f9c4-8f08-7041-636199c5cbe5.jpeg)


(もうすでにworkというライブラリがあれば、この手続きは必要ないです。スキップして次のステップへ行きましょう。)
`a new library and a logical mapping to it`を選択し、`work`という名前を割り振ります。
![スクリーンショット (37).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/07765adc-6e73-a97d-d45d-5a19e7f48e1c.png)

コンパイルを押して、今回使ったファイルを両方選びます。
![スクリーンショット (37)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/fa420bce-a113-fe8a-cbb2-fb719170a1a0.jpeg)

![スクリーンショット (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/fdaca74a-e4eb-044f-974d-371088cb8c2c.png)

ここで`transcript`に`# Errors: 0, Warnings: 0`というメッセージが現れればオーケーです。
次に上のsimulateを押します。

![スクリーンショット (38)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/2336df7e-6de4-a324-a085-00260f2bb61b.jpeg)

coinc_TEST.vを選び、OKを選びます。

![スクリーンショット (39).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/c690c9b9-768d-4949-c31b-70f942e3888f.png)

これで新たなウィンドウがポップアップします。Objectsのすべての値を選び、Waveの中にドラッグします。（ここでWaveが存在しない場合、上のViewから選択して表示させる必要があります。）

![スクリーンショット (40)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/f9554317-08db-3b3c-2393-e66db3c49a20.jpeg)

最後に以下の青い〇で囲まれている`run`を押してシミュレーション結果が出ます。下の`transcript`に `run 1000`などと打ち込めば、1000psのシミュレーションを行えたりと実行時間を調整できます。

![スクリーンショット (42)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/e0f752da-60a3-11a2-da6f-d1dfebd0736d.jpeg)


こちらが `run 1000`としたときのシミュレーション結果です。たしかに3ビットの数字をカウントしているのがわかります。
![スクリーンショット (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/43ed302c-7467-56f3-a709-9bb22c2cba64.png)


# 参考
> [実践 コンピュータアーキテクチャ](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E5%9D%82%E4%BA%95-%E4%BF%AE%E4%B8%80/dp/4339024376)

> [Verilogファイルのシミュレーションによる動作確認の方法 (Model Simの使い方)](http://www.ee.tcu.ac.jp/lectures/fpga/Verilog_simulation.html)