TfCtrl
TF カードブロック入出力コントローラ v2 (docs/tfcard.md「プロトコル仕様」)
リセット後に自動で初期化シーケンス (CMD0 → CMD8 → CMD55/ACMD41 ポーリング → CMD58) を実行し,完了後は要求 IF (valid/ready + LBA + write) で CMD17 単発リード / CMD24 単発ライトを受け付ける. 512 バイトを stream_if でやりとりし,CRC16 を検査 (リード) または 付与 (ライト) して完了時にエラー種別を報告する.
- 発行コマンドは CMD0/CMD8/CMD55/ACMD41/CMD58/CMD17/CMD24 のみ. erase 系・マルチブロック系は FSM 上存在しない
- ライトは「トークン 0xFE → 512 バイト → CRC16 → データ応答 → ビジー解除待ち」 の順に進む.データ応答は下位 5 bit で判定する (00101 = 受理,01011 = CRC 不一致,01101 = 書き込みエラー)
- バッファレス: データバイトは 1 バイトごとに stream の handshake を待ち, その間 SCK を停止する (SPI はマスタペースのため合法).BSRAM 面バッファは 不要 (docs/tfcard.md「インタフェース」)
- CCS=0 (バイトアドレッシング旧世代) は初期化時に unsupported として拒否する
- CRC 不一致はデータストリーム後の完了報告で通知する (リトライは利用側判断)
初期化失敗時は o_init_done が立たず o_init_err に種別が残る (復帰はリセット).
Parameters
| InitDivider | u32 | 初期化クロック分周比 (337.5 kHz) |
|---|---|---|
| FastDivider | u32 | データ転送クロック分周比 (13.5 MHz) |
| PowerUpBytes | u32 | 電源投入クロック供給のバイト数 (74 クロック以上 → 10 バイト = 80 クロック) |
| NcrMaxBytes | u32 | R1 応答待ちの上限バイト数 (NCR) |
| Acmd41MaxPolls | u32 | ACMD41 ポーリング上限回数 (337.5 kHz で約 1.2 s 相当) |
| TokenMaxBytes | u32 | データトークン待ちの上限バイト数 (13.5 MHz で約 155 ms 相当) |
| WriteBusyMaxBytes | u32 | CMD24 書き込み busy 待ちの上限 (13.5 MHz で約 267 ms 相当) |
Ports
| i_clk | input | clock | クロック (27 MHz) |
|---|---|---|---|
| i_rst | input | reset | リセット |
| i_req_valid | input | logic | ブロック入出力要求 |
| i_req_lba | input | logic<32> | 論理ブロックアドレス |
| i_req_write | input | logic | 1 でブロックライト (CMD24) |
| o_req_ready | output | logic | 要求受付可能 |
| o_init_done | output | logic | 初期化完了 |
| o_init_err | output | TfTypes Error | 初期化エラー (失敗時に latch) |
| o_done | output | logic | ブロック入出力完了 (1 サイクルパルス) |
| o_err | output | TfTypes Error | 完了時のエラー種別 (o_done で有効) |
| data | modport | stream_if source | リードデータ (512 バイト/ブロック) |
| i_wr_valid | input | logic | ライトデータ有効 |
| i_wr_data | input | logic<8> | ライトデータ |
| o_wr_ready | output | logic | ライトデータ受付 (1 サイクル) |
| o_sclk | output | logic | TF SCK |
| o_mosi | output | logic | TF MOSI |
| o_cs_n | output | logic | TF CS# |
| i_miso | input | logic | TF MISO |