先ずチュートリアルより始めよ。

なんで休日の昼間にこんなことやってるのかというと、今日は台風が近づいてきているので外は雨なんです。東京なんか大雨です。特別警報が出ちゃうかも、的な大雨のようです。ていうか京都とかそっちのほうは大変なことになってるようです。

それはさておき。

本来ならたぶんチュートリアルを利用して、そこから適当にいじっていくのが王道だとは思うんですが、どうもXP2を使ったBrevia2用ではずばりのチュートリアルはないようです。「先ず隗より始めよ」なんてのをもじってみたんですが、一筋縄ではいかないようで。

ということで方針を一部変更して、WEBにいろいろとある情報をつまみ食いしつつ進めていこうかと思います。ちなみにどんな感じで進めていくかというと、

  • Lチカ (LEDを点滅させてみる)
  • シミュレーションしてみる
  • UARTを組み込んでみる (巫女さん抜きで)
  • 巫女さんを組み込んでみる (Lチカ編)
  • 巫女さんを組み込んでみる (JTAG UART編)
  • 巫女さんを組み込んでみる (UART編)
  • TeraTermで巫女さんとお話ししてみる (UART応用編)
  • 巫女さんと無線でしゃべってみる (XBee編)
  • 巫女さんに温度を測ってもらう (温度センサ編)
なんてことを考えたりしてて。ぼちぼちやっていこうかと思ってますけど。

それでは始めましょう。

方針を決めます

まず、どうやってLチカさせようか考えてみます。

一定間隔で点いたり消えたりするわけですから、タイマもしくはカウンタが必要です。

Brevia2ボードのクロックは50MHzなので、使いやすくするために周波数を下げる必要もあります。ここは汎用的に1000Hz(1msec)を出力するようなクロックモジュールを作ってみましょう。ついでに1Hzクロックも作っておきましょうか。

このクロックモジュールは入力が原クロックとリセット、出力が低周波クロックになります。クリアや初期値ロード、アップダウンはとりあえず置いときます。このモジュールを複数並べれば複数個のLEDを別々にチカチカさせることもできるように考えます。

トップモジュールではこのクロックモジュールをインスタンス化して、さらにもう一段カウンタつけて点滅間隔を調節し、IOポートにアサインすればいいわけですね。

こうして考えてみると、実はそんなにむずかしくなさそうです。

プロジェクトにファイルを追加する

先般作ったプロジェクトに新しいファイルを追加します。


Input Filesの上で右クリックして、Add→New File...を選択するとダイアログが出ますから、そこでVerilog Filesを選択してファイル名を入力し、左下の"Add to implementation"にチェックを入れてNewを押します。ここではファイル名はclk1000hz.vとしています。


ファイルを追加したら編集用に開きます。
ちなみにファイルの上で右クリックし、"Open With"をクリックするとファイルを開く外部アプリケーションを設定できるようです。Diamond標準のSource Editorは今ひとつ残念なできなので、使い慣れているVimを指定しておきます。


OKを押すと外部エディタで開きます。まだ空っぽなのでなにもありません。


さて、50MHzというのは1秒間に5千万回振動するわけですから、これを1msecで切り替わるようにするにはこの1000分の1、つまり50,000の半周期、すなわち25,000ごとに出力が反転すればいいわけです。となるとカウンタのビット数は、16bitで65,535まで、15bitで32,767まで数えられるので、15bitあればいいわけですが、区切りが悪いので16bitにしてしまいましょう。

とりあえず書いてみたclk1000hz.vは以下のようなモノになります。


// vim: set fenc=utf-8 filetype=verilog expandtab ts=4 sts=0 sw=4:
//
// generate 1000Hz clock from 50MHz osc input.
//

module CLK1000HZ (clk, reset, clk1m);
    parameter CNT = 25000;

    input clk;
    input reset;
    output clk1m;
    reg clk1m;
    reg [15:0] count;

    always @ (posedge clk or negedge reset) begin
        if (reset == 0)
        begin
            count <= 0;
            clk1m <= 0;
        end else
        if (count < CNT)
        begin
            count <= count + 1;
        end
        else begin
            count <= 0;
            clk1m <= ~clk1m;
        end
    end
endmodule

moduleの定義はいいとして、clk1mがoutputとregで二回定義されていますが、これがミソ、のようです。17行目ではresetならカウンタのリセットをして、clk1mも0に初期化。あとはCNTと比較しつつcountを増やしていき、CNTになったらclk1mを反転、というだけです。


vimだとエラー行に飛ぶのに不都合があることがわかったので、泣く泣く標準のエディタに戻しました。

まだモジュールが一つだけですが、これを早速コンパイルしてみましょう。

コンパイルする

左ペインの下にあるタブのうち、Processをクリックします。すると下のようになっているので、


Translate DesignをハイライトしてからツールバーにあるRunボタンをクリックします。


するとTranslate Designのところまで緑色のチェックがつき、コンパイルが終了したことになります。

ここまできたら、次は急がば回れ、シミュレーションで動作を確認してみましょう。

0 件のコメント:

コメントを投稿

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...