FC2ブログ

[LM32]wb_spi.vがSEL_I未サポート(MicoSystem v3.4.0.80)

構造体、共用体を使って、SPIコアのレジスタへBYTEでもBITでも両方アクセス可能にしたい。

struct st_spi { /* struct SPI */
 :
union { /* CTRL */
unsigned int DWORD;
struct {
unsigned int RESV1 :21;
unsigned char SSO :1;
unsigned char RESV4 :1;
unsigned char IE :1;
unsigned char IRRDY :1;
unsigned char ITRDY :1;
unsigned char RESV5 :1;
unsigned char ITOE :1;
unsigned char IROE :1;
unsigned char RESV6 :3;
} BIT;
} CTRL;
 :
};


ところが、SPI.CTRL.BIT.IE = 0; のようにbitアクセスすると、目的のbitのみの操作が出来ない。
micosystem_spi_not_support_for_SEL
上の波形で、一番上のled_out_regの値を逐一変えて、順番にレジスタアクセス動作を見ている。
SPI.CTRL.BIT.IE = 0;したのが、led_out_reg=19のところ。

この波形の通り、bit操作するためには、まずは対象のアドレス(SPIコアControllレジスタ)の値を読みだして、
その値を基準にして、操作対象のbitのみを変更している(と理解)。
波形図では見えないが、SPI_DAT_Oはreg_controlのリード値=0x140が出ていた。

Mico32は32bitデータバスなので、SEL[3:0]を使って、アクセス対象のBYTEを指定する。
IEビットはbit8なので、SEL_I[1]のみがHになる。
そのため、上の波形におけるSPI_SEL_Iは、fから2([1]のみHになった)へ値が変わっている。
この動作は正しい。

期待の動作は、reg_control[8]のみH->Lへ変化するはずが、[6]も変化してしまっている。
MicoSystemが生成したwb_spi.vを見たら、SPI_SEL_Iは未接続。
SEL_I制御が効いてないから、無関係のbitまで変更してしまった。これが原因だ。

よくよく見ると、MicoSystemで生成したSPIコアは、WISHBONEのSEL_I信号に未対応だって。
SPIコアデータシートpage8 I/O Portsにしっかり書いてあるが。
MicoSystemで生成されるRTLはWISHBONE完全準拠かと勝手に思ってた。

wb_spi.vをSEL信号対応に修正しよう。
スポンサーサイト



カレンダー
01 | 2015/02 | 03
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード