流 FIFO 控制器 (Stream FIFO Controller)——可以“耍無賴”的 FIFO
在幀 (FRAME) 或包 (PACKET) 應用的設計中,經常需要同步傳遞幀描述信息和在幀校驗出錯的時候做丟棄處理。
上游模塊 先寫“數據緩存”,在寫入一幀數據完成后,再寫“描述緩存”,寫入幀描述信息,如幀長度、幀校驗結果等。
下游模塊 先讀“描述緩存”,讀出幀描述信息,再讀“數據緩存”,根據幀描述信息對幀數據做相應處理,如丟棄等。
上述應用設計,如果使用“Stream FIFO”,可以有下面優點:
簡化設計——可以把幀描述信息和幀數據都放在一個 FIFO 中 FIFO 寫側可以在幀數據寫入之后把幀描述信息,即幀頭,插入到幀數據之前——“插隊”;FIFO 讀側可以順序地先讀出幀頭,再讀出幀數據。
提高吞吐率——可以在 FIFO 寫側一拍丟幀 幀數據寫入 FIFO 后,如果幀尾數據校驗出錯需要丟棄,它可以直接在 FIFO 寫側丟棄,即下一幀數據是直接從上一個錯幀的第一個位置開始填充。比較而言,普通 FIFO 需要把全部錯幀數據讀出來丟棄。
項目地址:Laotzu
易用的類似 FIFO 接口 參數化數據寬度和 FIFO 深度 參數化幀頭長度 增強的同步數據有效指示 增強的首數據預讀加速功能(可關閉)
Name | I/O | Description |
---|---|---|
w_rst_n | I | Reset in write-side1 is normal0 is reset |
w_clk | I | Clock in write-side |
w_ctrl [2:0] | I | Write control0 is NOP1 is write data2 is eof with writing data3 is eof without writing data4 is write head5 is write final head6 is discard frame7 is NOP |
w_full | O | 1 is FIFO full |
w_error | O | Error in write-side1 is error0 is normal |
w_counter [] | O | FIFO counter in write-side |
r_rst_n | I | Reset in read-side1 is normal0 is reset |
r_clk | I | Clock in read-side |
r_en | I | Read enable1 is read0 is NOP |
r_valid | O | 1 is data valid in read-side |
r_error | O | Error in read-side1 is error0 is normal |
r_counter [] | O | FIFO counter in read-side |
w_ram_addr [] | O | Write address for dual-port RAM |
w_ram_en | O | Write enable for dual-port RAM1 is enable0 is disable |
r_ram_addr [] | O | Read address for dual-port RAM |
r_ram_en | O | Read enable for dual-port RAM1 is enable0 is disable |
Name | Description |
---|---|
FWFTEN | First Word PRe-fetch enable1 is enable0 is disable |
ADDRWIDTH | Address bus width |
FIFODEPTH | FIFO depth |
HEADSIZE | HEAD size |
FIFO 寫側最小幀的時間需要大于 FIFO 讀側時鐘 4 倍周期,即
原因解釋如上圖所示,FIFO 讀計數在幀尾出現跳變,即 FIFO 寫側在發出下面命令后,寫指針才被更新到 FIFO 讀側,通知有新的數據被寫入到 FIFO,可以讀取了。
HEADSIZE = 0 w_ctrl = 2, or w_ctrl = 3
HEADSIZE = 1 w_ctrl = 5
寫指針從寫時鐘域傳到讀時鐘域,并且是跳變信號,所以不能使用傳統 Gray 碼的方式處理。設計中采用了“濾波”的方式,過濾掉了跨時鐘域傳遞出現的的雜亂信號?!笆褂脳l件”就表示了從信號跳變開始到信號穩定的時間。
新聞熱點
疑難解答