外部入力で取り込んだ値によってプログラムを制御するオリジナルCPUでバイナリコード入門(12)(2/2 ページ)

» 2024年01月25日 08時00分 公開
[今岡通博MONOist]
前のページへ 1|2       

 それでは、実際に動かしてみましょう。/src/instructions.vの29〜31行目を以下のように書き換えます(リスト3)。

    initial begin
        `include "button1.asm"
    end
リスト3 /src/instructions.vの29〜31行目の書き換え内容

 GoWinのIDEを使って、SynthesizeとPlace & Routeそして最後にProgram DeviceでTang Nanoの評価モジュールに書き込んでください。

 上側のタクトスイッチを押すと、USBコネクターを左に向けている場合、レジスタR5の値を示すLEDドットマトリクスの上から6行目の一番左側のLEDが点灯します。タクトスイッチの値を実際にDL166が取り込むのはCPUが動いている約1秒間隔で行われますので、1秒以上タクトスイッチを押していないとレジスタR5には取り込まれないことがありますので気を付けてください。

 図1はUSBコネクターの下側のタクトスイッチを押すことで、LEDドットマトリクスによりレジスタR5の最下位ビットが1になったことを示しています。写真は用意していないのですが、ここからタクトスイッチの押下を止めるとLEDは消灯します。なお、図1のブレッドボードに刺さっている赤、緑、青のタクトスイッチは今回の演習内容には関係ありません。

図1 図1 USBコネクターの下側のタクトスイッチを押すことで、LEDドットマトリクスによりレジスタR5の最下位ビットが1になったことを示される[クリックで拡大]

外部入力と条件分岐

 次のプログラムbutton2.asm(リスト4)の内容について説明します。これは、タクトスイッチを押しているときと押してないときで処理を変えるプログラムです。最初タクトスイッチを押していないときは、Tang Nanoの基板上のLEDは一番上にある1つだけが光っていますが、タクトスイッチを押すと上から4つ目のLEDまでの間でローテートしながらLEDが光ります。

ram[0] <=8'b1010_0001;  // mvi 	R0,0001
ram[1] <=8'b00_110_000; // mov  R6,R0
ram[2] <=8'b1010_1111;  // mvi  R0,1111
ram[3] <=8'b01_000_101; // add  R0,R5
ram[4] <=8'b1000_0011;  // jnc  3
ram[5] <=8'b01111_110;  // urotate R6
ram[6] <=8'b1001_0010;  // jmp 	2
リスト4 button2.asmのコード

 ではプログラムを見ていきましょう。0番地でまずレジスタR0に1を入れます。それを1番地でレジスタR6に転送します。これでTang Nano基板上の一番上のLEDが点灯します。2番地レジスタR0に1111を入れます。3番地ではR0の値とレジスタR5の値を足します。R5の最下位ビットにはタクトスイッチの状態が反映されます。R5はタクトスイッチが押されると1となります。押されていないときは0です。この足し算を実行するとタクトスイッチが押されたとき桁あふれが起こります。すなわちc_flagが0から1になります。これはTang Nano基板上の上から6番目のLEDが点灯することで確認できます。

 4番地は条件分岐のjnc 3です。タクトスイッチが押されていないときは3番地の命令を実行する繰り返しですが、タクトスイッチが押されると次の5番地の命令を実行します。5番地ではレジスタR6を1つ上位ビット方向にローテートします。このレジスタはTang Nano基板上のLEDに反映されます。そして6番地のjmp 2命令で処理を2番地に移します。このようにタクトスイッチが押されると4個のLEDがローテートして光るというわけです。

 実機でプログラムの動作を確認して頂けましたでしょうか。タクトスイッチが押されたとき、何か処理をさせたいという用途のプログラムであれば4番地のjnc命令と6番地のjmp命令の間にさせたい処理のコードを挟めばそれを実現させることができます。

おわりに

 いかがでしたでしょうか。外部入力と条件分岐を組み合わせると外部環境の変化に応じてコンピュータの処理を変えることができるようになります。今回は、人の指で押下するタクトスイッチの状態をCPUに取り込む方法とそのプログラミングを演習しましたが、これがセンサーであればどうでしょう。まさに外界の環境変化によって処理を変えることができるのです。これは外界の環境変化をフィードバックとしてもらったその値に応じて処理を調整することであり、制御の基本中の基本ですよね。DL166はインターネットに接続する機能はないのですが、IoT(モノのインターネット)の基本でもあります。

 次回以降の回のどこかで光センサーをDL166に接続する方法などについてもお話ししたいと思っています。これを機にバイナリコーディングに親しんで頂ければ幸いです。それでは次回をお楽しみに。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.