EBAZ4205 FPGA Xilinx編 第2版　3章

# シミュレーションの演習を進めます。
以下のプロジェクトに対して、シミュレーションを行いました。

https://qiita.com/ShigeoYakuno/items/05ebae0932d7b5c7917d


### gitにアップしているchapter2-3　になります。
一つ下の階層のSIMフォルダにある「pattern_tb.v」を使います
少し解説してみます

### シミュレーションのクロック設定
~~~verilog
/* クロック周期とSimクロック数を定義 */
localparam STEP = 8;
localparam CLKNUM = (800*525+12000)*5;
~~~
- シミュレーション時間単位でのクロック周期（8ns）を定義
- 結果としてクロック周波数は 1/8ns=125MHz
- CLKNUMはシミュレーションするクロック数を指定
- 800は1回の水平スキャンにかかるクロック数。
- 表示領域640クロック＋フロントポーチ16＋同期パルス96+バックポーチ48=800
- 同様に垂直スキャンの525は、表示領域480クロック＋フロントポーチ10＋同期パルス2+バックポーチ33=525
- 800×525 は 1フレームのピクセル数（VGA解像度：640×480 + ブランキング期間）
- +12000 は追加で余裕を持たせたクロック数
- もしテストベンチで波形が安定しない場合は、+12000 を +20000 や +420000 に増やしてもOK
- ×5 は5フレーム分シミュレーションするという意味

###  信号定義と DUT（Device Under Test）接続
~~~verilog
/* 接続信号の宣言 */
reg             CLK;
reg             RST;
wire    [7:0]   VGA_R,  VGA_G,  VGA_B;
wire            VGA_HS, VGA_VS, VGA_DE;
wire            PCK;

/* パターン表示回路を接続 */
pattern pattern(
    .CLK    (CLK),
    .RST    (RST),
    .VGA_R  (VGA_R),
    .VGA_G  (VGA_G),
    .VGA_B  (VGA_B),
    .VGA_HS (VGA_HS),
    .VGA_VS (VGA_VS),
    .VGA_DE (VGA_DE),
    .PCK    (PCK)
);
~~~

- CLK: シミュレーション用クロック

- RST: リセット信号

- VGA_R, VGA_G, VGA_B: RGB 各8bitの出力

- VGA_HS, VGA_VS: 水平・垂直同期信号

- VGA_DE: Display Enable（描画タイミング信号）

- PCK: Pixel Clock

- pattern モジュールは被検証回路（DUT）で、上記の信号が接続されている。

### クロック生成ブロック
~~~verilog
/* クロックの生成 */
always begin
    CLK = 0; #(STEP/2);
    CLK = 1; #(STEP/2);
end
~~~
- 1周期(立上り、立下り)を作っている

### リセットとシミュレーションの流れを以下で記載
~~~verilog
/* 検証対象への入力を作成 */
initial begin
                RST = 0;
    #(STEP*600) RST = 1;
    #(STEP*20)  RST = 0;
    #(STEP*CLKNUM);
    $stop;
end
~~~

- RST = 0;: 最初はリセット解除状態
- #(STEP*600): 600クロック待機（＝約4.8 µs）
- RST = 1;: リセットを1サイクルだけアサート
- #(STEP*20): 20クロック待機（160ns）
- RST = 0;: リセット解除
- #(STEP*CLKNUM): メインシミュレーション（約5フレーム分）
- $stop;: シミュレーション終了




# シミュレーション波形解説


### MMCMによるPCK生成開始部分

- 1us付近でPCKの生成が始まる
- 2us付近でlockedが1となり、MMCMが安定したことがわかる
- 5us付近でリセットし、不定(赤表示)だった信号の値が確定している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/1e909d33-08b4-474b-a57c-b29d0163fe60.png)


### HCNTとVCNTの動作

- 波形選択➡radixで表示を変更できる。デフォルトはヘキサ。Unsigned Desimalに変更した
- HCNT=16､VCNT=10でVGA_HSとVGA_VSが同時に立ち下がっている
- 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/b4e5cc54-60c8-4778-9076-b99eccefda34.png)



### VGA_HSの周期計測
- 波形上で左クリックで黄色いカーソル。クリックしたまま移動させるとエッジで吸着する。
- shift+左クリックで2本目のカーソルを表示でき、1本目との時間を測定できる
- カーソル間は12.711us。これはEBAZ4205のSYSCLK=125MHzのため、正しい。
- 参考書の例はSYSCLK=50MHzなので31.778usとなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/e6562bbf-3d80-4107-866b-f495b91b4754.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/98df55ff-24d7-4a02-865e-9c6126d26dd7.png)


### VGA_R~VGA_Bの値

- VCNT=45から表示が始まり、R:G:B＝ff:ff:ff、ff:ff:00...00:00:00まで変化している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/119f7ce9-b1d5-4b30-b8ea-d93b36e615f9.png)

- 最終ライン(VCNT=524)では逆にR:G:B=00:00:00、00:00:ff...ff:ff:ffまで変化している
- 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/c741f88c-a228-4473-91d5-9e67a7e84d30.png)



### 直感で分かりやすいアナログ表示
- 波形で右クリック➡waveform style　でanalogを選択するとアナログ表示に変更できる(のこぎり波)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657924/f55533e6-8fd6-4a5b-a91d-a990b15e544f.png)

### 今日はここまで