Memory-mapped I/OでUART
Memory-mapped I/O(MMIO)を使ってUART通信を行いたいので、既存のUARTモジュールをレジスタを介してデータを送受信できるように拡張する。
行いたい操作
MMIO UART Coreで行いたい操作は以下の通り。
divisorをセット(writeアクセス)
受信したバイトの読み込み(readアクセス)
受信バッファのデータの破棄(writeアクセス)
受信バッファがemptyかどうか確認(readアクセス)
送信バイトの書き込み(writeアクセス)
送信バッファがfullかどうか確認(readアクセス)
レジスタマップ
以下の4つのレジスタを介して通信を行う。
Offset 0レジスタ(受信データとステータスの読み込み)
読み込みのみ
bit 7-0: 受信データ(8bit)
bit 8: emptyステータス
bit 9: fullステータス
Offset 1(write ボーレートdivisorレジスタ)
読み書き可能
bit 10-0: 11bit divisor value
Offset 2(送信データレジスタ)
書き込みのみ
bit 7-0: 送信データ(8bit)
Offset 3(受信データの破棄)
書き込みのみ
このレジスタにデータを書き込むことで受信バッファの先頭データを破棄して次のデータを先頭に持ってくる
書き込むデータは「ダミーデータ」でOK
バスとMMIO UART Coreとの接続
https://gyazo.com/29857f093db9402a8dc11bc00dc8930e
https://gyazo.com/a19a43937d41fdb8a156888be38980f3
書き込みデータ
w_dataをそのまま各MMIOコアへ接続
アドレス(この資料では11bit)
11bit中の5bitをMMIOコア内のオフセットとして利用することとし、5bit分を各MMIOコアへ接続
11bit中の6bitを「チップセレクタ」と「出力データマルチプレクサ」へ渡す
チップセレクタ(CS)
アドレスの値によってどのMMIOコアを有効化するかを判定、有効化するMMIOコアのcsフラグ(chip selectフラグ)をアサートする
csがアサートされてるコアでのみ、write_enableフラグの処理が有効となる
出力データマルチプレクサ(返ってくるデータ)
各MMIOコアが返したr_dataをマルチプレクサへ渡してやり、アドレスの値によって返すr_dataを切り替える
write_enableフラグとread_enableフラグは各MMIOコアへ接続
入出力インターフェース
input clk
input reset
input read
input write
input (4:0)
(つづく)
メモ
https://gyazo.com/fe3786b41e363e0af9d5b60a8f438c6a