SNSへはこちら

Tang Nanoでお手軽FPGA入門(4) - PLLのIPを使う

今度は IDE の機能である IP Core Generator で回路ブロックを生成する練習をしてみたいと思います。
このボードには PLL が載っているらしいですが(搭載チップである GW1N のデータシート参照)、これを使う IP の生成をしてみます。

IP Core Generatorの操作

ではやっていきましょう。まずはプロジェクトを作成します。

できましたか?そうしたらメニューバーから Tools -> IP Core Generator を選択すると、機能ブロックの一覧が並んだ画面が表示されると思います。

その一覧から画像のように PLL を選んでダブルクリックしましょう。

今回はオンボードの 24MHz クロックを なんとな〜く 200MHz にしてみたいと思うので、そういうふうに設定しましょうか。

そうしたら OK とか Yes を押しておきます。すると gowin_pll_tmp.v とか言うファイルが表示されますが、これは実際にインスタンス化する際にこう使ってくれよというテンプレートです。取り敢えず今すぐには使いません。

取り敢えず24MHzでLチカ

クロックが逓倍されたかを確認する前に、オンボードの 24MHz クロックでLチカをしておきましょう。以下のコードで、1秒間に1回 LED が反転します。

module delay_ms(input wire clk, input wire rstn, output reg tick);
    reg[31:0] counter;
    parameter max = 32'd24_000_000;

    always @(posedge clk or negedge rstn) begin
        if( ~rstn ) begin
            counter <= 0;
            tick <= 0;
        end
        else begin
            counter <= counter + 1;
            if( counter == max ) begin
                tick <= 1;
                counter <= 0;
            end
            else begin
                tick <= 0;
            end
        end
    end
endmodule

module main(input wire clk, input wire rstn, output reg led);
    wire tick;
    delay_ms delay(clk, rstn, tick);

    always @(posedge tick or negedge rstn) begin
        if( ~rstn ) begin
            led <= 1;
        end
        else begin
            led <= ~led;
        end
    end
endmodule

まあ普通のLチカですね。あくまでこれはただの動作確認。

PLLで逓倍された出力の200MHzでLチカ

続いて、main で PLL をインスタンス化し、そこから出てきたクロックを使うように設定してみましょう。
always 文直前までの部分を以下に置き換えてください。

    wire clk_o;
    Gowin_PLL pll(
        .clkout(clk_o), //output clkout
        .clkin(clk) //input clkin
    );
    wire tick;
    delay_ms delay(clk_o, rstn, tick);

んで、これで動くかと思ったら動かなかったので、max = 32'd200_000_000 とすると、またさっきと同じような動きになります。

今回はさくっとでしたが、IP Core Generator の使い方を勉強したということで以上です。

次回あたりは LCD を使い始めていきたいなあ、、と思いますね。