1500円ZYNQ基板でFPGAプログラミング大全Xilinx編(第2版)の実習 2-1 LED点滅回路

#はじめに
前の投稿で、EBAZ4205 基板を改造して、Cora Z7 相当で動かせるようになりました。

早速、FPGAプログラミング大全Xilinx編(第2版)の
最初の課題 "Lチカ" をやってみます。


#関連ファイルのダウンロード
ソースファイル一式を、FPGAプログラミング大全Xilinx編(第2版) サポートサイトから取ってきます。
https://www.shuwasystem.co.jp/support/7980html/6326.html
![1_サポートサイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/ca000bc6-2f7f-79ff-20bf-c719844731e4.png)

XilinxFPGA_SE.zip を解凍して、\Cora_Z7-10\dai2-3sho\blink フォルダをデスクトップに展開します。

#制約ファイル(blink.xdc)の変更
Cora Z7-10 と EBAZ4205 では、FPGA のピンと、LED やスイッチの接続が違っているため、制約ファイル(blink.xdc)を変更します。
既存のポート名に対応する FPGA のピン番号を修正します。
変更点は、下記の通りです。

>クロック入力
> Cora Z7-10:H16 (125 MHz) → EBAZ4205:N18 (33.333 MHz)
> Cora Z7-10:クロック周期 8ns → EBAZ4205:クロック周期 30ns
>
>スイッチ入力 (RESET)
> Cora Z7-10:D19 (BTN1) → EBAZ4205:V13 (U67 に付けたスイッチ - 基板端側)
>
>LED出力
> Cora Z7-10:N15 (赤) → EBAZ4205:W14 (赤)
> Cora Z7-10:G17 (緑) → EBAZ4205:W13 (緑)
> Cora Z7-10:L15 (青) → EBAZ4205:U12 (NCピン - 出力しても何も起きない)

```blink.xdc
## EBAZ4205 constraints file
## chapter: 2
## project: blink

#Clock signal
set_property PACKAGE_PIN N18     [get_ports { CLK }]
set_property IOSTANDARD LVCMOS33 [get_ports { CLK }]
create_clock -add -name sys_clk_pin -period 30.00 \
        -waveform {0 4} [get_ports { CLK }]

#Reset
set_property -dict { PACKAGE_PIN V13   IOSTANDARD LVCMOS33 } \
        [get_ports { RST }]; # BTN[3]

#RGB LED
set_property -dict { PACKAGE_PIN W14   IOSTANDARD LVCMOS33 } \
        [get_ports { LED_RGB[2] }]; # Red
set_property -dict { PACKAGE_PIN W13   IOSTANDARD LVCMOS33 } \
        [get_ports { LED_RGB[1] }]; # Green
set_property -dict { PACKAGE_PIN U12   IOSTANDARD LVCMOS33 } \
        [get_ports { LED_RGB[0] }]; # Blue
```

#回路ソース(blink.v)の変更
Cora Z7-10 と EBAZ4205 の搭載部品の違いから、下記 3 点を変更します。
>・クロック周波数が 125 MHz → 33.333 MHz に遅くなるため、カウンタの bit 数を 26bit から 24bit へ減らす
>　⇒ カウンタ幅を cnt26[25:0] から cnt24[23:0] へ減少
>　⇒ ALL1 検出を 26'h3ffffff から 24'hffffff へ変更。
>・LED が RGB ではなく RG しかないため、点滅パターンを変更 (LEDデコーダ)
>・LED への出力値と点灯の論理が逆なので、出力値に ~ を追加して反転で表記 (LEDデコーダ)

```blink.v
/* Copyright(C) 2020 Cobac.Net All Rights Reserved. */
/* chapter: 第2章       */
/* project: blink       */
/* outline: LED点滅回路 */
/* modified by KAN573   */

module blink (
    input               CLK,
    input               RST,
    output  reg [2:0]   LED_RGB
);

/* システムクロックを分周 */
reg [23:0] cnt24;

always @( posedge CLK ) begin
    if ( RST )
        cnt24 <= 24'h0;
    else
        cnt24 <= cnt24 + 1'h1;
end

wire ledcnten = (cnt24==24'hffffff);

/* LED用5進カウンタ */
reg [2:0] cnt3;

always @( posedge CLK ) begin
    if ( RST )
        cnt3 <= 3'h0;
    else if ( ledcnten )
        if ( cnt3==3'd5)
            cnt3 <=3'h0;
        else
            cnt3 <= cnt3 + 3'h1;
end

/* LEDデコーダ */
always @* begin
    case ( cnt3 )
        3'd0:   LED_RGB = ~3'b100;
        3'd1:   LED_RGB = ~3'b010;
        3'd2:   LED_RGB = ~3'b110;
        3'd3:   LED_RGB = ~3'b010;
        3'd4:   LED_RGB = ~3'b100;
        3'd5:   LED_RGB = ~3'b000;
        default:LED_RGB = ~3'b000;
    endcase
end

endmodule
```

#コンパイル
オリジナルと同じですので、大全の手順通りでよいです。

#動作確認
FPGA へのダウンロードが完了すると、cnt3 のシーケンスに従って、LAN コネクタ横の LED が点灯します。
LED の発光パターンは下記を繰り返します。
![2_LEDパターン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a9eeef96-3c87-ae57-42a0-9764029eab81.png)

U67 に付けたスイッチがリセットボタンです。
押すと cnt3 がクリアされて、cnt3=0 から再スタートします。
![4_動作確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a57536c6-b412-3315-4f01-5abe5dc5714a.jpeg)


#まとめ
2-1 LED 点滅回路の記述と動作確認について、EBAZ4205 で学習することができました。