在FPGA設計中,我們通常采用的都是“自頂向下”的設計方法,即現有頂層設計,再有細節設計。比如先有整個項目的功能框圖、數據流程圖等,然后再細分功能到一級模塊,每個一級模塊再細分到二級、三級甚至更低級別的模塊。除了每個模塊的設計,如何把模塊連接起來?也是一個很有趣且重要的話題,這就是我們通常說的內部模塊接口。這里先介紹幾種常見的內部模塊接口。
AXI接口
目前xilinx或者intel提供的IP core中的接口越來越多的都支持AXI接口,這種接口是業界非常通用的接口,使用的頻率也非常的高,關于這個接口的說明,網上有很多資料,本文不在這里介紹該接口相關的信息。
采用這種接口有什么好處呢?顯然IP的移植性非常好,只要是使用AXI接口的設計,都可以直接調用這樣的IP,不需要做任何接口上的修改,也不會出現對接口理解上的差異,確實很方便。尤其是你的模塊需要和外部模塊對接的時候,這里的外部可能是外部的客戶、外部的合作伙伴等,標準的接口也能減少對接的溝通成本。
AXI接口筆者覺得也有一些缺點,接口相對比較復雜。如果我們的FPGA設計只是公司或者部門內使用,不需要對外,甚至都不需要重用的時候,那有沒有一些更加簡單的接口呢?這里重點介紹2種內部模塊間通用接口,最后再說明這樣接口的好處。
req-ack接口
先看時序圖,這種接口通常是請求方有數據要發送之前,先發送一個req請求信號,同時保持數據不變,一直等待響應方的應答。當響應方處理完數據后,給一個ack應答信號,表示一次數據傳送完成。
這種接口的應用場景是什么呢?它一般應用在低速、無緩存數據傳輸場景。當2個模塊之間的接口傳輸數據的性能較低,且有相互依賴,就可以采用這類接口。從時序圖可以看出,在req階段,整個data是不會變化,直到有ack后,再發送下一個數據。數據的傳輸依賴請求和響應雙方的配合,彼此牽制。另外,發送發等當前數據處理完成后,才會有一下次數據發送,所以這類場景無需數據緩存,比較節省資源,但是性能較低。
流式接口
先看時序圖,該接口共有5個信號, data_vld(數據有效信號)、 data(數據本身)、 data_sop(表示數據開始)、 data_eop(表示數據結束)、 data_index(和data相關的其他信號,位寬和格式可以用戶自定義,往往在data_sop = 1或者data_eop = 1的時候有效,或者在整個data_vld = 1期間保持不變)、 data_afull(數據反壓信號,通知對端不要再發送data)。
這種接口信號,非常的像fifo的寫接口信號,通過這種接口在發送數據的過程中,只要對端不反壓就可以不停的發送。這種接口實現簡單,模塊之間高度解耦,性能較好。
也有人會想,用這樣的私有接口,為什么不用標準axi_stream接口呢?確實這2種接口已經非常非常的相似了,唯一的不同就是反壓的處理,私有接口是不反壓的時候數據就可以無限制的發送,即發數據依賴data_afull = 0。但是axi_stream接口的vld和ready之間是沒有相關關系的,協議規定不能相互依賴,這點這內部處理起來就稍稍麻煩點點。
另外即使afull = 1以后,一般都還可以繼續發送2-3拍數據,時序處理起來也非常的簡單。而axi_stream中的vld和ready之間是嚴格的時序關系,必須同時為1,數據才能正常發送,時序處理起來相對麻煩。
總結
當有對外的接口時,應該還是要采用業界標準的接口,但是模塊內部的設計,還是要遵循設計簡單、實用可靠、無依賴,性能高的基本原則。
-
FPGA
+關注
關注
1630文章
21786瀏覽量
605071 -
FPGA設計
+關注
關注
9文章
428瀏覽量
26574 -
接口
+關注
關注
33文章
8685瀏覽量
151651 -
AXI
+關注
關注
1文章
128瀏覽量
16679
發布評論請先 登錄
相關推薦
評論