バイナリと16進数とASCIIの関係

バイナリと16進数とASCIIの関係

 デジタル回路設計ではバイナリを主に使いますが、UARTなどの通信回路を設計する初心者が混乱するのがASCIIです。

 ASCIIとは日本語ではアスキーと読みます。American Standard Code for Information Interchangeの略です。たまにアスキーコードと言ってしまうのですが、略の中にすでにコードが入っていますね。

 ASCIIはもともと7ビットの文字コードです。昔、漢字をコンピュータで扱う事が無かった時代の文字コードです。文字コードというのは、その文字をバイナリで表現した時のコードです。例えば、ひらがなの「あ」という文字を画面に表示したときに、コンピュータの中では「あ」という文字を扱いません。コンピュータやデジタル回路では2進数で計算、通信をしますので、「あ」という文字を2進数に変換する必要があります。そこで、各国で文字に数値を割り当てており、それを2進数にして使っているのです。

 ASCIIはアメリカの文字コードですが、コンピュータの基本コードになっています。日本語は「あ」という文字を「全角」、「a」という文字を「半角」という事はご存じだと思います。日本語キーボードにも「全角/半角」というキーボードがあります。

 この「半角」のときに、ASCIIの文字コードになっています。たとえば、半角の「A」は41(hex)です。「a」は61(hex)です。全部をここで列記しませんので、wiki等でASCII表を調べてみてください。ここで混乱する人が多いのです。「a」は16進数の0a(hex)ではないのです。この時の0a(hex)は値です。ASCIIの「a」は「a」という文字が61(hex)だという事です。この違いを理解しておかないと、UARTの通信がまったく成立しなくなります。

 たとえば、FPGAを設計していて、仕様の中にUARTがあったとします。その時UARTはFPGAメーカーが提供しているIPを使ってFPGAに組み込むことができます。しかし、もしUARTがASCII通信であったなら、バイナリからASCIIに変換する回路を設計する必要があります。

 UARTは次のように通信します。

 この場合、通信速度であるボーレートや黄色部分のスタートビット、ストップビットなどを仕様で取り決めておかないと、通信は成立しません。そして、これらのパラメータはFPGA各社が提供しているUARTのIPでも設定項目としてあります。

 この場合の緑のデータが01100001(bin)の時(図とはMSBが逆なので注意)どんな通信になるのでしょうか? 01100001は2進数なので、UARTのTxやRxの信号線をオシロスコープで捉えたなら、図のように緑の順番でLSBが先頭になって01100001の波形が見えるでしょう。これを16進数にすれば、61(hex)です。おそらく、FPGA各社のIPから出てくる信号は8ビットに直っているはずなので、この61(hex)が出力されるはずです。これを図で示すと次のようになります。

 この61(hex)というのは何でしょうか? これはUARTの仕様書で定めるしかないのです。UARTの仕様書で「バイナリ通信」と記されていれば、61(hex)はそのまま61(hex)です。「ASCII通信」と記されていれば、61(hex)が示すASCII文字である「a」になります。つまり、ブロック図で示すと仕様によって、以下のようになります。

一般的にUARTはASCII通信で行う事の方が多いので、上図「ASCII通信の時」に示すようにASCII<->Binaryの変換回路が必要になります。

 そして、ASCII通信時に大切な事が一つあります。ASCIIの文字コード表を見ると00~1f(hex)まではエスケープ文字という特殊なコードになっています。たとえば、09(hex)は「HT」という文字で「¥t」で示されています。これは表示されない文字を意味しています。09(hex)でいえば、キーボードの「TAB」キーです。これらの特殊なコードをどのように扱うのか。というのも仕様で決める必要があります。

 特に問題となるのがキーボードのエンターキーの扱いである、LFコードとCRコード、デリートキーであるDELコードなどです。これらをどのようにするのか。というのは仕様で決めておく必要があります。

 このようにバイナリとASCIIの違いを理解して、UART回路を設計する必要があります。