nao-milkの経験ブログ

25年間の半導体エンジニア経験で知り得た内容を記載したブログです。

SPI(マスタ側)対向モデルの記述例

f:id:nao-milk:20210328144055p:plain

対向モデルのSPI(マスタ側)の記述例です。

 

このモデルもUART同様、モデル内のACパラメータ(real)とタスクを実行する構成となっています。

 

タイミング

先にタイミング図を示します。

f:id:nao-milk:20210327210724p:plain

このSPIは、CSがネゲート時、CK(シリアルクロック)はLowとなり発振しません。

データもMSBファーストで通信します。

tsCS

 SPIデータシートによくあるAC特性だと思います。

 後述の記述例では、10nsとしています。

thCS

 SPIデータシートによくあるAC特性だと思います。

 後述の記述例では、10nsとしています。

tcCK

 SPIデータシートのクロック周波数やHigh幅+Low幅となります。

 MOSIの確定周期と同等となります。

tsMO

 SPIデータシートのデータセットアップ時間に当ります。

 これは、tpCKまたはtnCKと同等となります。

tpCK

 CK周期の変化からCKが立ち上がり時間となります。

tnCK

 CK周期の変化からCKが立ち下がり時間となります。

tlMI

 CK周期の変化からMISOのデータを取り込むタイミングを時間で指定します。

 

考え方

 データの変化点から tsMO分遅延してCKが変化する考え方になります。

 

記述例

以下に記述例を示します。

f:id:nao-milk:20210328144812p:plain

 

8行目から17行目までが上位階層で変更可能な設定値となります。

また、22行目のP_SPI_BITは1回(CS↓からCS↑)の転送ビット数となります。

 

CS動作

CSアサートがLowの時、16行目をHigh(現在の値)にします。

アサート論理がHighの場合は、Lowにしてください。

これは、CSの初期状態を設定するもので、33行目と50行目で反転させます。

 

CK動作

初期状態は17行目で設定します。これは、CSがネゲート状態時の論理となります。

動作中は、36~42行目のfork join文内で実行されます。

Low → High → Lowと動く場合の例となり、High → Low → Highとなる場合は、17行目のHighに設定し、tpCKとtnCKを逆の設定にすることで逆になります。

 

MOSI動作

初期値は不定値です。

動作中は、36~42行目のfork join文内で実行されます。

タスクAcSPIの引数TxDataをMSBファーストで出力します。

不定値やHi-ZなどもTxDataに代入しておくことでそのまま出力します。

 

MISO動作

本対向モデルの入力値になります。

tlMIのタイミングでRxDataに代入します。

タスクAcSPIを呼び出し時、引数RxDataの必要なビットを上位階層で使用できるようにタスク内では処理はしていません。

 

最後に

forkjoin文を使うことにより、自由にCKのエッジを変更しています。

タスクも準備しておき、上位階層(呼び出し元)で自由に使用できるようにしています。