沼津高専 電子制御工学科
MIRSMG3D シリアル通信回路仕様書
MIRSMG3D-MTCB-0005
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.3.20 片瀬 内堀 初版


目次






1.はじめに

このドキュメントの対象はMG3のFPGA内の通信回路である。
このドキュメントで解説されているシンボルはSERIAL_symbolである。



2.回路の役割

この回路はMG3においてモータ制御ボードと通信を行うために作られている。



3.通信仕様

基本的には一般的なRS-232C、調歩同期シリアル通信に準拠させてある。
以下に通信の基本仕様を示す。
Table 1 通信仕様
通信方式 全二重非同期シリアル通信
通信レート 19.2kbps
データ長 8bit
パリティ
ストップビット 1bit
フロー制御 ハード/ソフト共に無し
割込み 使用可
ブレーク信号 受信、送信可能

通信は基本的な3線式の全二重調歩同期シリアル通信が行われ、フロー制御は行われていない。
受信完了、送信完了などの割込みが実装されており、IERでこれを有効にすることで割込み駆動させることが可能となる。
この基本仕様はハード的に固定されていて、変更する際には回路の変更が必要となる。



4.レジスタ仕様

基本的には一般に広く普及したシリアル通信IC 8250に準拠させている。
以下に通信回路のレジスタ構成を示す。
Table 2 レジスタ一覧
レジスタ名 役割
THR/RBR 送受信バッファレジスタ
IER 割込みイネーブルレジスタ
IIR 割込みIDレジスタ
LSR ステータスレジスタ




4.0 レジスタの更新順番

各レジスタはそれぞれ状態を参照しているので、変化する順番を考慮しないとデバイスドライバを作成する際の重大な落とし穴となる可能性がある。
また、どのレジスタから割込み要因が発生するかを理解していないと
4.5 その他回路部のIRQにD-FFが接続されている理由の理解の妨げとなってしまう。
(受信割込みの割込み要因はTHR/RBRより発生するが、オーバランはLSRより発生する。これにより二つの割込みの間には1clockのタイムラグがある。)
レジスタの変化する順番は次のようになっている。

これからわかるように、IIRを読む際は先にLSRを変更してはならない。
また、悠長なことをしているとTHR/RBRが更新されて(次のデータが届いてしまい)、LSRが上書きされてしまう。



4.1 THR/RBR (Transmitter Holding Register / Receiver Buffer Register)

動作時のISAバス側からアクセスする際、書き込み時は送信バッファ、読み込み時は受信バッファとして動作する。
実際に送受信を行う回路が、このレジスタを中心に構成されており、この通信回路の中枢部分である。
送信回路と受信回路はそれぞれ独立した回路と専用のバッファを持っており、全二重の構成となっている。
実際にこのレジスタがどちらの役割を果たすかはISAバスのIOR/IOWによって判断している。
なお、FPGAのゲート数節約のため、バッファは1byteのみの実装となっている。
ボーレート、パリティ、データ長、ストップビット、フロー制御を変更したい場合はこれらの回路に手を加えることになる。
内部回路には一部冗長なところがあるが、これは想定外の使われ方をした際、誤動作を防ぐ目的である。
是非、自らの手で回路のスリム化に挑戦して欲しい。



4.2 IER (Interrupt Enable Register)

割込み許可フラグを与えるレジスタであり、対応するビットを立てることによりCPUに割込みの要求動作を行うようになる。
以下に各ビットの意味を示す。
Table 3 IER
IER 1:割込み許可 0:割込み禁止
0bit 受信割込み許可
1bit 送信割込み許可
2bit ステータス割込み許可




4.3 IIR (Interrupt Identification Register)

現在発生している割り込みの種類(割込みID)を表すレジスタである。
同時に複数の割込みが発生した場合、優先度の高い割込みのみ通知される。
後述するLSRの出力を受け、それぞれのステータスを割込みIDに変換している。
よってLSRを変更するとそれに連動してIIRも変更されるのでデバイスドライバを作成する際には注意すること。
なお、FPGAのリソース節約のため、割込みが許可されていない時でも割込みIIRは更新されている。
以下に対応する割込みIDを示す。
Table 4 IIR
IIR 優先度 割込みID
0x01 1 割込み無し
0x02 2 送信割込み
0x04 3 受信割込み
0x06 4 ステータス割込み




4.4 LSR (Line Status Register)

THR/RBRのエラー出力など全てを取り込み、情報を処理し、各ステータスビットに反映させている。
受信完了、オーバーラン、フレーミングエラーは0を書き込んで手動でクリアするようになっている(この仕様はLSRの状態確認とクリアの間にタイムラグを生じさせるので、ステータスの変化を読み落とす可能性がある。デバイスドライバの作成の際にはこのタイムラグを最小限にするように注意する必要がある)。
また、送信完了フラグ、送信可能フラグ、ブレーク受信については現在の状態を正しく表している。(手動でクリアできない)
本来ならば違うレジスタの機能であるが、FPGAのリソースを節約するためにBit7にはブレーク送信が割り当てられており、1である間、ブレーク信号が送信され続ける。
以下に各ビットの働きを示す。
Table 5 LSR
LSR
0 受信バッファにデータ有(受信完了)
1 オーバーランエラー
2 使用されていない
3 フレーミングエラー
4 ブレーク受信
5 送信バッファが空(次のデータを送信可能)
6 送信シフトレジスタが空(送信完了)
7 ブレーク送信(1:実行 0:解除)




4.5 その他回路

通信回路のシンボルを開いてみると分かるが、内部には前述したレジスタのシンボルの他にも幾つか回路が構成されている。
ここではそれらの説明を行う。
まず、Fig.1に示す回路はISAに接続するための仕組みである。
アドレスデコーダ部、データ部、制御線から構成されている。
アドレスデコーダ部はISAバスのアドレス信号からどのレジスタを有効にするのかを決めている部分である。
本体ならば4byteの選択なので2bitで十分だったが、通信回路単体でFPGAに書込み、デバッグできるように20bitのアドレス線全てを有効にしている。
データ部はISAバスの信号線(8bit)を橋渡ししている。
制御線はCLK、RESET、IOR、IOWの4本であり、それぞれIOR、IOWがActiveになることで、アドレスデコーダ部で選択されたレジスタに読み込み/書き込みが行われる。
なお、IOR、IOWは負論理なので注意。
RESETはISAバスのハードウェアリセットで、電源投入時に一定時間Activeになる。
なお、RESETは正論理である。
次に、Fig.2に示す回路は、割込みをISAバスの仕様に則って出力するためのものである。
IERの各割込み許可信号とそれに対応する各割込み発生要因とのANDを取り、それらのORを取ることで複数ある割込み要因からたった一つの割込み信号を作り出している。
また、出力に並べられたD-FF×2は、受信エラーが発生した際などに、「正常に動作を終了した」割込みと「受信したデータが不正であった」割込みなど、同時に発行される二つの割込みを一つに纏める役目がある。
なお、ISAバスの仕様では割込み信号はActive-Low、Non Active時はハイインピーダンスとされている。

Fig.1 ISAバス接続部
Fig.1 ISAバス接続部

Fig.2 IRQ
Fig.2 IRQ




5.改良案

  • バッファをFIFO構成のものとしてオーバーランの発生や割込みの発生を減らす。
  • ボーレート、パリティ、データ長を指定可能にする。
  • フロー制御を導入する。
  • LSRの読み込みとクリアの間にタイムラグを生じさせないようにするため、読み込むと自動でクリアされるようにする。
  • ゲート数を節約するように作り直す。
    • 冗長な部分の是非を検討する。
    • プロトコルは半二重なので回路も半二重にできるか検討する。



6.おわりに

以上で通信回路の説明を終える。
詳しい内部回路は実際にファイルを開いてみると分かり易い。
もし内部構造が分からなかった場合、機能ごとに纏めてあるので個々の部品の解析から始めて欲しい。ただし、全体の動作は上で説明しているので、ドレも何かしらこの機能だろうと予測を立てて見てみて欲しい。



関連文書