Lチカ再び、オリジナル4ビットCPUで外部出力制御を行う:オリジナルCPUでバイナリコード入門(14)(2/2 ページ)
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第14回では、オリジナル4ビットCPU「DL166」に外部出力デバイスとなるLEDをつないで制御し、Lチカを行う。
実際に動かしてみる
それでは、実際に動かしてみましょう。/src/instructions.vの29〜31行目を以下のように書き換えます(リスト2)。
initial begin `include "brink7.asm" end
連載第9回では、Tang Nanoの基板上に搭載されている6個並びのLEDの1つを点滅させるためにleds[0]にはTang Nanoに搭載されているGoWinのFPGAチップの10番ピンがアサインされていました。今回は、それを32番ピンに変更するために、/src/instructions.cstの28行目を以下のように書き換えます(リスト3)。
IO_LOC "leds[0]" 32;
それでは、実際に動かしてみましょう。GoWinのIDEで、SynthesizeとPlace & Routeそして最後にProgram DeviceでTang Nanoの評価モジュールに書き込んでください。
図3はLEDのアノード側(抵抗付きの端子)をTang Nanoの32番に、カソード側をGNDに接続してblink7.asmを実行した様子です。
図3だとLEDドットマトリクスの一番下の段がちょうど4番地を実行しようとしているところです。レジスタR6の値を見てみると、それはLEDドットマトリクスの上から7段目ですが最下位ビットは光ってないですよね。しかし外付けのLEDは光っています。
これはどういうことか言うと、Tang Nanoに搭載されている6個のLEDに対応させるためにDL166というかinstructions.vは負論理にHDLが組まれているので論理が逆さまになってしまいます。Tang Nanoに搭載されている6個のLEDは、アノードが全て共通でプラス電源に接続されており、カソード側が信号線によって制御されているため負論理、信号線が0になったときLEDが点灯する回路になっています。
ですからinstructions.vではそれに対応したHDL記述になっています。それに対して外付けのLEDは32番ピンが1になったときに点灯するような接続になっていますので、レジスタR6の最下位ビットが0の時点灯し、1の時消灯するわけです。
ちなみに、Tang Nanoの基板に搭載されているLEDと同様の動作をさせるなら外付けのLEDを逆に差し替えるだけでできます。アノード側を3V3に、カソード側を32番に差し替えてください。そうするとドットマトリクスのレジスタR6の最下位ビットが点灯すると外付けLEDも点灯するようになります。ちなみに3V3は+3.3Vのことで、図2に示したTang Nanoのピン配置図でいうところの右側の一番下にあります。ですから外付けLEDを差し替えるときはGNDを1つまたぐ格好となります。
正論理と負論理
コンピュータが外部機器をコントロールする際、負論理が良いか正論理が良いかという議論は昔から行われていいます。筆者の経験で言えば、CPUとROMやRAMとのアドレス線やデータ線は正論理のことが多いですね。それに対して、外部機器を接続する際によく用いられるのが負論理であるオープンコレクタです。ちなみにCMOSやFETを用いる場合はオープンドレインと呼ばれます。
オープンコレクタはコンピュータ側からの出力回路の1つなんですが、コンピュータからこの回路の入力に1を与えると出力側が短絡します。これはNPN型バイポーラトランジスタの例ですが、この回路は受け側である外部出力デバイスでプルアップ抵抗が施されます。ですので、コンピュータの出力が0の時はプルアップ抵抗により外部出力機器には1が伝わります。すなわち電位が高い状態ですね。一方コンピュータの出力が1の時にはトランジスタは出力側がGNDに短絡しますので、外部出力機器は0を受け取ります。低電位ということですね。このようにNPN型バイポーラトランジスタでオープンコレクタ出力回路を構成した場合、コンピュータの出力と外部出力機器とでは論理が反転しますね。
ここで大切なのは、プルアップ抵抗の抵抗値と電圧を何Vでプルアップするかということですが、これらは外部機器の都合によって異なります。もしオープンコレクタ出力回路を用意したコンピュータと外部出力機器が離れているのなら、プルアップ抵抗は小さい値の方が外来ノイズにより惑わされることは少なくなります。ただし、その分オープンコレクタ回路のトランジスタの負担は大きくなります。またプルアップ電圧に関して外部出力機器の入力の電圧範囲に合うように設定します。このあたりは、組み込みの技術者には大切なところですので機会があれば記事にまとめたいと思います。
おわりに
今回は外部出力機器制御の最初のステップとしてDL166にLEDをつないでみました。いかがでしょうか。なんかTang Nanoの基板上のLEDが光るのとは異なり、電子工作っぽい雰囲気になったのではないでしょうか。わくわくしてきますね。これを機にバイナリコーディングに親しんで頂ければ幸いです。
バイナリコーディングの連載はこの第14回をもって最終回とさせて頂きます。次の連載は4ビットCPUから、ついに8ビットに拡張したCPUによる演習記事を用意しています。新連載もぜひ楽しみにしていてください。(連載完)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「オリジナルCPUでバイナリコード入門」バックナンバー
- ≫連載「FPGAにニューラルネットワークを実装する」
- ≫連載「注目デバイスで組み込み開発をアップグレード」バックナンバー
- オリジナルCPU「DL166」にセンサーを接続する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第13回では、オリジナル4ビットCPU「DL166」にタクトスイッチやフォトセンサーをつないで、そこから得られる値をDL166で読み込めるようにする。 - 外部入力で取り込んだ値によってプログラムを制御する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第12回では、外部入力を取り込みその値によってプログラムを制御することに挑戦する。 - 今どきの学生には受けなかった「ナイトライダー」を再現する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第11回では、1980年代の米国テレビドラマ「ナイトライダー」に登場するドリームカーの電飾の再現に挑戦する。 - 条件分岐を使ったバイナリコードでLチカをより複雑に
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第10回では、条件分岐を使ったバイナリコードに挑戦する。 - たかがLチカされどLチカ、バイナリコードでLEDを点滅させる
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第9回では、プログラミング演習の定番であるLチカを題材にバイナリコードを動かしてみる。 - 2行で書けるバイナリコードを動かしてみよう
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。今回の第8回からバイナリコードのプログラミング演習がスタートする。まずは、最も短いレベルとなる2行で書けるバイナリコードを動かしてみる。 - オリジナルCPU「DL166」の命令セットの動作を確認する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第7回は、「Tang Nano 9K」に移植したオリジナルCPU「DL166」の命令セットの動作を確認する。 - オリジナルCPU「DL166」のレジスタをLEDドットマトリックスで見える化する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第6回は、「Tang Nano 9K」に移植したオリジナルCPU「DL166」のレジスタをLEDドットマトリックスで見える化する。 - 「Tang Nano」にインテル系IDEで開発したオリジナルCPUのソースコードを移植する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第5回は、新たな教材「Tang Nano 9K」に、インテル系IDEで開発したオリジナルCPU「DL166」のソースコードを移植する。 - 新たな教材となる「Tang Nano 9K」を使ってLEDマトリクスを制御する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第4回は、バイナリコーディングを学ぶための新たな教材となる「Tang Nano 9K」とVerilog-HDLコードを使ってLEDマトリクスを制御する。 - 【バイナリコーディング演習】FPGAボードでLチカとPWMによるLED点灯を試す
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第3回は、オリジナル4ビットCPUを用いたバイナリコーディングの前段階の演習として、入手が容易なFPGAボードを使ってVerilog-HDLで簡単な回路プログラムを組んでみる。