検索
連載

2行で書けるバイナリコードを動かしてみようオリジナルCPUでバイナリコード入門(8)(2/2 ページ)

オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。今回の第8回からバイナリコードのプログラミング演習がスタートする。まずは、最も短いレベルとなる2行で書けるバイナリコードを動かしてみる。

Share
Tweet
LINE
Hatena
前のページへ |       

2行で書けるプログラム

 ここからは、はじめてのバイナリプログラミングとして、最も短いレベルのバイナリコードを紹介します。それは、レジスタR6のインクリメントを繰り返すプログラムです。

 レジスタR6は外部の4個のLEDに接続されています。Tang Nanoの評価基板上に実装されている6個のオレンジ色のLEDのうち4個のLEDにアサインされているのです。これによって、レジスタR6が2進数でカウントアップされていく様子をLEDで観察することができます。

 ここからは図1を見ながらドットマトリクスの見方をおさらいしておきましょう。Tang Nanoのモジュールはブレッドボードに挿した状態で、USBコネクターを左側に向けた状態になっています。その右側には8桁のドットマトリクスが上から順に8個並んでいます。1行目の8桁がレジスタR0に対応していますが、R0は4ビットですので8桁のうち左の4桁しか使っていません。

図1
図1 最初のドットマトリックスの状態[クリックで拡大]

 ドットマトリックスにおける桁の見方ですが、一番左側の桁が最下位ビットとなり、そこから右に向かって上位ビットになります。ドットマトリクスの2〜8行目は、それぞれレジスタR1〜7に対応しています。図1では、ドットマトリクスの上から6行目のLEDが4個点灯しています。この列はレジスタR5の値を反映しているのですが、R5は4ビットの外部入力を格納するレジスタです。4ビットとも点灯しているということは、現状では4ビットとも何の入力デバイスにも接続されていないので、プルアップ抵抗によりハイ電圧になっているため1の入力になっています。

 ここも先述した外部LEDにならって負論理に書き換えたほうがよさそうですね。書き換える箇所はinstructions.vの36行目です。

       regs[5]=~btn;

 “btn”の前に“~”を追加しました。

 そして、リスト2が実際に動かしたレジスタR6のインクリメントを繰り返すバイナリコードです。

ram[0] <=8'b01100_110;  // inc r6
ram[1] <=8'b1001_0000;  // jmp 	0
リスト2 実際に動かすプログラム

 ファイル名はshort.asmとしてプロジェクトの中のsrcのフォルダに保存します。筆者はこの操作はWindowsであればメモ帳などのテキストエディターで行います。そして、instructions.vの30行目を以下のようにshort.asmをインクルードできるように書き換えます(リスト3)。

initial begin
    `include "short.asm"
end
リスト3 instructions.vの30行目の書き換え内容

 プログラムを実行した結果が図2です。図1では、ドットマトリクスの上から6行目のレジスターR5の値が1111であるのに対して、図2では0000になっています。入力を負理論にした効果です。

図2
図2 プログラム実行後の状態[クリックで拡大]

 上から8行目はレジスタR7なのでプログラムカウンターを示しています。図1では、この行はどのLEDも点灯していないので0000を示しており、ちょうど0番地を実行しています。それに対して図2の8行目はドットマトリクスの一番左のLEDが1個点灯していますね。これは1番地の命令を実行していることを示しています。

 上から7行目はレジスタR6の値です。これは外部のオレンジ色のLEDに反映されます。写真では7個LEDが縦に並んでいるように見えますが、抵抗を挟んで一番下にあるLEDは電源が入っていることを示すLEDです。そして1つ上のLEDはc_flagなので、R6が1111を超えると点灯します。最初の1巡目(0〜15数える間)は消灯していますが、2巡目からは点灯します。一番上から4個までのLEDがレジスタR6の値を反映しています。C_flagがセットされる瞬間を見逃した場合はリセットボタンを押せばプログラムは最初から始まります。

 ちなみにブレッドボード上には3個のタクトスイッチが写っていますが、これらは今回のプログラムでは使っていません。また、図1と図2におけるTang NanoのUSBコネクターの上下にもタクトスイッチが2個あります。上側のタクトスイッチがリセットでプログラムが初期化されます。下側のもう1つのタクトスイッチは今回は使っていません。

 このように2行と短いバイナリコードですが、レジスタR6がカウントアップされる様子やオーバーフローを示すフラグがセットされる様子を見て取れると思います。

おわりに

 今回からいよいよバイナリプログラミング演習がはじまりました。「はじめに」でも書きましたが、2023年8月に参加したセキュリティ・ネクストキャンプでのエピソードなども絡めて記事を展開したかったのですが、演習初回は思いの外お伝えしなければならないことが多く、そういった余地は少なかったですね。次回以降にでも触れていきたいと思います。演習お疲れさまでした。また次回お会いしましょう。

連載第2回リストの訂正とおわび

 連載第2回『HDLソースコードからオリジナルCPU「DL166」の内部動作を理解する』の1ページ目に掲載しているリスト1 「DL166」のHDLソースコードの19行目に一部誤りがありました。この場を借りて訂正させていただきます。ご指摘いただいた読者の皆さまありがとうございました。記事本文は訂正済みです。

誤:19 /* NOT */	5'b01101: regs[sss]<=!regs[sss];
正:19 /* NOT */	5'b01101: regs[sss]<=~regs[sss];

 GitHubに掲載した「DL166」のHDLソースコードも修正してあります。

Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る