MAX10 RGB LED制御

前回は既に書き込まれたプログラムでLEDが点灯していたので、今回は簡単なLED制御をしてみたいと思います。

Arduinoと記述方法が異なります。今回使用するのはVerilog-HDLです。

用意するもの


トランジスタ技術2016年4月号増刊で入手しました。

プログラミングする


外部クロックをカウントして1秒周期で制御するように論理回路を組んでいくだけです。

module MAX10_FB(
    input   wire    RST,            //PIN 123
    input   wire    CLK,            //PIN 27
    output  wire    LED_RED,        //PIN 120
    output  wire    LED_BLUE,       //PIN 121
    output  wire    LED_GREEN       //PIN 122

);

reg     [25:0]      COUNTER;
reg     [3:0]       ONE_SEC;


//1sカウンター
always @(posedge CLK or negedge RST)
begin
    if(~RST)begin
        COUNTER <= 26'b0;
    end
    else if(COUNTER >= 48_000_000)begin
        COUNTER <= 26'b0;
    end
    else begin
        COUNTER <= COUNTER + 1'b1;
    end
end

//16カウンター
always @(posedge CLK or negedge RST)
begin
    if(~RST)begin
        ONE_SEC <= 4'b0;
    end
    else if(ONE_SEC >= 15)begin
        ONE_SEC <= 4'b0;
    end
    else if(COUNTER >= 48_000_000)begin
        ONE_SEC <= ONE_SEC + 1'b1;
    end
    else begin
        ONE_SEC <= ONE_SEC;
    end
end

assign LED_RED      = ~(ONE_SEC[1]);
assign LED_GREEN    = ~(ONE_SEC[2]);
assign LED_BLUE     = ~(ONE_SEC[3]);

endmodule

上のプログラムでLEDが、赤⇒緑⇒黄⇒青⇒紫⇒水⇒白⇒消灯の順で変化します。

1sカウンターで48,000,000回クロックをカウントしてます。。。

 

Verilogの記述について(簡単に)


動作確認の前に記述を簡単に説明すると、

  • module MAX10_FB(省略);では入力と出力信号の宣言を行います。ただ、これだけではまだICの外に繋がっていないので注意です。
  • regではレジスタを用意します。データの値が保持できます。他にwireがありますが、例えるなら電気配線のジャンパーみたいなの。
  • always @(posedge CLK or negedge RST):alwaysは一つの回路ブロックの様な物。@()の中のイベントが発生すると実行される。上の記述だとクロックが立ち上がった時かリセットが立ち下がった時。
  • begin~end これはC言語でいう{}。
    if(xxx){
    }

    if(xxx)begin
    end
    は同じです。
  • assign タイミングに左右されない簡単な組み合わせ回路です。
    出力先はwireで宣言されている必要があります。

動作確認


プログラム動作の様子は下記(すごい短い)

これだけです。

飛びも回りもしません。色が変わるだけです。


書き換え方も一応簡単に説明しときます。

前回紹介したQuartusのメニューバー左より「New Project Wizard」をクリック。

vlcsnap-2018-01-05-23h41m20s328


ウィンドウが出てきたら「NEXT」をクリック。

vlcsnap-2018-01-05-23h41m49s530


次はプロジェクトの保存先と名前。名前はトップモジュールの物を入れるといいかも(上のプログラムで言うとmodule “MAX10_FB”(…. )

vlcsnap-2018-01-05-23h42m44s199


次は使っているデバイスを選択する。MAX10-FBは10M08SAE144C8G(パッケージ上部にも書いてあります。)

vlcsnap-2018-01-05-23h43m54s367


一応、シミュレーションソフトを設定します。

vlcsnap-2018-01-05-23h44m06s373


先ほど書いたプログラムをします。(ファイル拡張子は.v)

vlcsnap-2018-01-05-23h45m44s759


ディレクトリから選択して追加。

vlcsnap-2018-01-05-23h46m08s025


一度コンパイルする。(エラー出ても無視

vlcsnap-2018-01-05-23h47m37s092


moduleで宣言した信号線を設定するため「Pin Planner」をクリック。

vlcsnap-2018-01-05-23h47m59s964


赤い四角いところで対象信号のピン番号を入力。トップビューのピンも選択されると色が変わる。

vlcsnap-2018-01-05-23h48m37s463


Pin Plannerを閉じたら再度コンパイルをします。エラーが無ければメニューバーの「Programmer」をクリックします。開いたら恐らくデバイスが認識されているので左側の「Start」で書き込みを開始します。

vlcsnap-2018-01-05-23h52m19s334

これであとはプログラムが動作します。

ね?簡単でしょ?(インターフェイスはArduino IDEが圧倒的楽

次回以降は、NIOS IIにも触れてみたいと思います(理解できれば

 

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中