連載
» 2023年09月21日 07時00分 公開

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

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

[今岡通博MONOist]

はじめに

 読者の皆さん、あらためてこんにちは。筆者自身の事情で久しぶりに原稿を書くのでこんな感じのあいさつではじめます。私はIPA(情報処理推進機構)とセキュリティ・キャンプ協議会の主催事業である「セキュリティ・キャンプ」に、2023年8月のお盆前に上京して講師として参加してきました。

 もう少し詳しく言うと、セキュリティ・キャンプそのものではなく、そのスピンアウト事業であるセキュリティ・ネクストキャンプ(以下、ネクストキャンプ)の講師です。セキュリティ・キャンプ、ネクストキャンプとも国内在住の学生向けの情報セキュリティに関する教育イベントですが、セキュリティ・キャンプが13〜22歳以下が対象であるのに対し、さらなる高度な教育を行うネクストキャンプは25歳まで受講できます。2023年のネクストキャンプは終了しましたが2024年以降も開催されると思いますので(国の予算も入っていますので実のところその年度にならないと確定しません)、もし、読者の皆さんご自身や知人または教員をされている方がいらっしゃれば、生徒や学生にぜひ応募を薦めて頂ければありがたいです。

セキュリティ・ネクストキャンプ2023のWebサイト セキュリティ・ネクストキャンプ2023のWebサイト[クリックでWebサイトへ移動]

 このネクストキャンプで、本連載で取り扱っているオリジナル4ビットCPU「DL166」をテーマに講義をしてきました。筆者の担当講義の紹介文は以下のようになっています。

N3・N9『オリジナルCPUを創る』

講義概要:
オリジナル4ビットCPU(DL166)を提示し、このCPUを記述したVerilog-HDLのソースコードを追うことでCPUの内部を理解します。その後、PC上で動作するシミュレターを用いてCPUの挙動を動的に解析します。演習ではこの4ビットCPUをベースに8ビットCPUにアップグレードする演習に挑戦してもらいます。これらにより、CPUに潜む様々な脆弱性を認識するための視点を提供します。

 実際に講義を行ってみて、25歳以下の学生と接する中でいろいろと気付きもあり大変有意義でした。これから本連載を展開して行く中で、読者の皆さまにも共有していけるかと思いながら、この原稿を書いております。

⇒連載「オリジナルCPUでバイナリコード入門」バックナンバー

前準備

 今回から始めるバイナリプログラミング演習ですが、前回の記事で紹介した命令セットの検証で用いたプロジェクトを用います。まずは以下のGitHubから必要なファイルをダウンロードしてください。

⇒DL166の命令セットのプロジェクトがあるGitHubはこちら

 それと、Tang Nano搭載のFPGAの製造元であるGOWIN SemiconductorのIDE(統合開発環境)が必要です。また、ターゲットとなる実機はTang Nanoに8×8のLEDドットマトリックスを搭載したものです。連載第4回『新たな教材となる「Tang Nano 9K」を使ってLEDマトリクスを制御する』を参考にしてください。

 先ほどのGitHubにはプロジェクトが丸ごと入っていますので、ローカルのPCにダウンロードしてから展開すれば、instruction.gprjというファイルが見つかります。このファイルをダブルクリックするとGOWINのIDEが立ち上がると思います。

 前回の記事で用いたVerilog-HDLのコードに多少変更があるので、それに触れておきます。/src/instructions.vの11〜16行目までが変更されています(リスト1)。

    assign leds[0]=!regs[6][0];
    assign leds[1]=!regs[6][1];
    assign leds[2]=!regs[6][2];
    assign leds[3]=!regs[6][3];
    assign leds[4]=1;
    assign leds[5]=!c_flag;
リスト1 変更したVerilog-HDLのコード

 Tang Nanoの評価ボードに搭載されている6個のLEDのうち4個を、DL166のレジスタR6にアサインしました。この際、LEDへの接続回路が負論理になっているので、レジスタのそれぞれのビットを反転させてアサインしています。また、あふれ検出のフラグc_flagをleds[5]にアサインし直しています。c_flagも値を反転させてLEDにアサインしています。以前はleds[0]でした。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.