Memory-mapped I/OでUART
#fpga #verilog #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
FPGA Prototyping by SystemVerilog Examplesより
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://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.reddit.com%2Fr%2FAskElectronics%2Fcomments%2Fc75jta%2Fis_it_possible_to_perform_mmio_on_an_i2c_slave%2F&psig=AOvVaw00f8rmkUDsMoMJi4z5hAUj&ust=1601813433841000&source=images&cd=vfe&ved=0CA0QjhxqFwoTCNCO-e6zmOwCFQAAAAAdAAAAABAD
https://gyazo.com/fe3786b41e363e0af9d5b60a8f438c6a