デュアルポートメモリのハードウェアによるエンディアン変換
オーバーヘッドを伴うソフトウェアによるエンディアン変換が不要
●はじめに
二つのCPUシステム間のデータの授受の為にアクセス口(ポート)を2個有するメモリを介し、
何れのシステムからもアクセス可能にしたものがデュアルポートメモリ(DPM:Dual Port Memory)システムです。
その際「二つのCPUシステム」がそれぞれリトルエンディアンとビッグエンディアンである事が往々にしてあります。
その場合にはDPMのエンディアンを何れか一方のCPUシステムに合わせ、データの意味を合わせる為に他方のCPUシステムでエンディアン変換を行なう事になります。
なお、エンディアンに関する詳細説明は、インターネット上に数多くの資料があるので、ここでは触れません。
本稿で重要なのは、エンディアン変換とは、DPM上の任意のアドレスのデータは何れのCPUシステムから見ても同じデータ(値)になる様にする事です。
それには、ソフトウェア(S/W)(*注1)で行なう方法とハードウェア(H/W)、及びその併用で行なう方法があります。
エンディアン変換は対象とするデータ幅が8ビット、16ビット、32ビット、64ビット等でデータ信号線の扱いが異なります。
メモリアクセス時にデータ幅を示す信号が有ればH/Wのみによるエンディアン変換は容易ですが、その様な信号が無いのが一般的です。
それ故、H/Wでのエンディアン変換はDPMと同じビット幅のデータのアクセスのみに限定し、それ以外のビット幅のデータについてはS/Wでエンディアン変換をする、
いわばH/WとS/Wの併用が一般的です。
その場合、S/W屋さんから見るとS/WとH/Wの処理分担が判り難く、トラブルの原因になる事がまま有ります。
又、S/Wによるエンディアン変換はオーバーヘッドが大きくなるので、システムとしては全てH/Wでエンディアン変換するのがスマートです。
S/Wによるエンディアン変換方法についてはインターネット上で数多く見られますが、H/Wで行なう方法は余り見掛けません。
そこで、本稿ではDPMシステムのエンディアン変換をH/Wのみで行なう方法の概要について述べます。
これにより、S/W処理の為のオーバーヘッドが無く、トラブルも少ないスマートなDMPシステムを作る事ができる様になります。
なお、DPMコントローラについては別途 2CPUシステムにおけるデュアルポートメモリ(DPM)設計方法
にまとめてありますので、ご興味があればご覧下さい。
*注1:厳密にはファームウェアと呼ぶべき場合が多いですが、主題の観点では何れでも良いのでソフトウェア(S/W)で統一します。
●DPMシステムの具体例
判り易くする為に、図1 DPMのデータバス構成を用いて具体例で説明します。
これ以外の種々のシステムでも基本的な考え方は同じなので、容易にアレンジして適用できる筈です。
(クリックで拡大)
図1 DPMのデータバス構成
・CPU_Aシステム:データ幅32ビット、ビッグエンディアン(BE) DPMとエンディアンが同じなので、エンディアン変換は不要
・CUU_Bシステム:データ幅32ビット、リトルエンディアン(LE) DPMとエンディアンが異なるので、エンディアン変換が必要
・DPM :データ幅32ビット、ビッグエンディアン(BE)
・MPX :CPU_A又はCPU_Bの何れのデータバスをDPMのデータバスに接続するかを切り替えるマルチプレクサ
・アドレスデコーダ:CPU_Bのアドレスをデコードしてアクセスするデータが8、16、32ビットデータの何れの空間かを判定し、
データビット幅指定信号 cs_d8、cs_d16、cs_d32 を生成する。
●エンディアン変換の手順
@DPMを8ビットデータ専用空間、16ビットデータ専用空間、32ビットデータ専用空間に分けます。
各々のDPM上でのTOPアドレスは base8、base16、base32 とします。
空間の境界は32ビットバウンダリです。
S/Wは所要データをビット幅に応じて各空間に割り当て、各ビット幅に応じたアクセスしかしないものとします。
ACPU_B側ではアドレスデコーダでアドレス信号をデコードし、cs_d8、cs_d16、cs_d32 信号を生成します。
Bエンディアン変換部で、 cs_d8、cs_d16、cs_d32 に応じて図2〜図4の鎖線の楕円で囲まれた箇所に示すデータバス信号のアサイン、即ちデータバスの接続制御を行ないます。
なお、各図中のメモリアドレスを示すのに使用している n はアドレスがDPMのサイズを越えない範囲で任意の自然数です。
クリックで拡大
図2 8ビットデータのデータバス信号アサイン
クリックで拡大
図3 16ビットデータのデータバス信号アサイン
クリックで拡大
図4 32ビットデータのデータバス信号アサイン
手順はこれだけです。
後は状態遷移図とステートマシンを正確に作成してHDL化するだけなので、通常のDPM制御回路と大差無く、意外に簡単な事が判ると思います。
本方法のポイントは@のデータビット幅に応じてDPM空間を分割する点に有ります。
●補足
- 上記のシステム具体例はあくまでも一例であり、実際のシステムは千差万別なので、上記の例を適宜カスタマイズして応用して下さい。
- アドレスデコーダに使用できるFPGA(又はCPLD)の使用可能な論理素子数の範囲で、且つ、32ビットバウンダリの境界を満足する限りは、
図5 DPMメモリマップの細分化 に示す様に、DPMのメモリマップを細分化して任意のアドレス(任意順番、混在可能)を8ビット、16ビット、32ビットデータの何れかにする事ができます。
但し、メモリマップの定義をS/WとH/Wでくい違いが生じないよう、正しく共有・管理する必要があります。
図5 DPMメモリマップの細分化
- システム具体例ではDPMメモリ上に構造体や共用体を定義する場合は、ビット幅の異なるデータの混在はできないので注意して下さい。
一方、前項の要領でメモリマップを細分化できる場合には、データビット幅の異なるデータが混在する構造体や共用体の定義をする事が可能です。
- DPM空間の分割境界はHDLではジェネリック文で定義し、S/Wの変更要請に容易に応えられる様にしておくべきです。
- データビット幅がDPMの32ビットに対して、CPU_B側が16ビット幅連続2回のアクセスで32ビットデータアクセスする様な場合には、
MPXでデータバスを切り替える事が可能ですが、16ビットのデータバッファを設けてDPMライト時は最初のデータをバッファにライトし、
2回目のライトアクセス時にDPMに32ビットデータとして一括ライト、DPMリード時は最初のリード時に32ビット一括で行ない、その内2回目にリードするデータをバッファに保存し、
2回目リード時はこれをリードするとDPMアクセスは1回で済むのでスマートです。
- 上記のデータバッファを用いる方法は、CPU_B側の2回のアクセス間にCPU_A側のアクセスが入らないという点でも有利です。
但し、DPMコントローラでCPU_B側の連続2回アクセス間にCPU_A側のアクセスが入らない様にする事は可能です。
- DPMアクセスのS/WをC言語等の高級言語で書く場合に、正しくコンパイルスイッチがされておらず、意図したデータ幅でのアクセスがされず、不具合の原因になる事があります。
正しく動作しない場合はアセンブラレベルでコードをチェックする事を推奨します。
以上 (初版 2018/09/06)
−−−−− 本ページはここまで −−−−−