オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第10回では、条件分岐を使ったバイナリコードに挑戦する。
前回に引き続き、オリジナル4ビットCPU「DL166」を用いたバイナリプログラミングの演習を行います。今回は「条件分岐を使ってみよう」ということで、さまざまな条件分岐に挑戦してみたいと思います。これまで紹介してきたプログラムは一定の処理をひたすら繰り返し行うというものでしたが、条件分岐を使うと一定の条件でプログラムを止めたり、条件によって処理を変えたりすることができるようになります。これでやっとコンピュータらしい処理ができますね。
⇒連載「オリジナルCPUでバイナリコード入門」バックナンバー
今回の記事や連載「オリジナルCPUでバイナリコード入門」で使用しているFPGA評価ボード「Tang Nano 9K」を題材にしたFPGA勉強会を、筆者の今岡氏が大阪で開催します。参加費用は無料です。勉強会の詳細は以下のイベントURLからご確認ください。
日時:2023年11月19日(日)16〜18時
場所:VisLab OSAKA(グランフロント大阪 北館内)
「Tang Nano 9K(以下、Tang Nano)」にLEDドットマトリクスを搭載したものを用います。連載第4回記事『新たな教材となる「Tang Nano 9K」を使ってLEDマトリクスを制御する』を参考にしてください。また、LEDマトリクスの見方は前回の連載第9回記事が参考になります。
Tang Nano搭載のFPGAの製造元であるGOWIN SemiconductorのIDE(統合開発環境)も必要です。インストール時にドキュメントがダウンロードされますのでそれを参考にしてください。これらのドキュメントには日本語版も含まれています
記事で紹介するVerilog-HDLやサンプルコードは以下のGitHubリポジトリから入手してください。
⇒DL166の命令セットのプロジェクトがあるGitHubのリポジトリはこちら
また、本記事で紹介するサンプルコードにおける命令セットの意味や使い方は、DL166の仕様を紹介した連載第1回記事『オリジナル4ビットCPU「DL166」はプログラミングの基礎学習に最適』を参考にしてください。
condition1.asm(リスト1)は、0から15までを数えて止まるプログラムです。0番地の命令はレジスタR0の値を1増加させる命令です。本来なら0から数え始めるのであれば、この命令の前にレジスタR0に0を入れておくべきでしょう。ただ今回は、リセット時にDL166のレジスタとフラグは0にクリアーされるので、リスト1のプログラムにその処理はありません。
1番地の命令はjnc命令(jump no carryの略)で、ここではc_flagが立っていないときジャンプします。ですから、c_flagが0であれば0番地に実行が戻り、c_flagが1になれば次の2番地の命令を実行します。この命令を使ってinc R0を16回繰り返します。繰り返しの16回目でinc R0はレジスタR0が1111を超えてしまいますのでc_flagを1にします。それでjnc 0を実行すると0番地に戻るのではなく次の2番地へ実行を移します。
2番地のjmp 2は2番地にジャンプする命令なので、ただひたすら2番地の命令を実行し続けます。プログラムカウンタは次の番地の命令に移ることなくこの番地にとどまり、この命令を実行し続けるので外から見れば2番地で実行が止まっているように見えます。他のCPUだとHALT命令といってプログラムを止める命令があるのですが、DL166ではHALT命令がないのでjmp命令の繰り返しで代用しています。
ram[0] <=8'b01100_000; // inc R0 ram[1] <=8'b1000_0000; // jnc 0 ram[2] <=8'b1001_0010; // jmp 2
それでは実際に動かしてみましょう。/src/instructions.vの29〜31行目を以下のように書き換えます。
initial begin `include "condition1.asm" end
この処理はasmファイルをVerilogのコードに取り込むためのものです。この後も幾つかのasmファイルを紹介しますが、そのたびにinclude文の後のファイル名を書き換えてください。
GOWINのIDEを使って、SynthesizeとPlace & Route、そして最後にProgram DeviceでTang Nanoの評価モジュールに書き込んでください。
Copyright © ITmedia, Inc. All Rights Reserved.