在SpinalHDL里,其lib庫處處可見Stream的身影,而在常用的邏輯設計里,尤其接口的處理中,握手信號的處理也是老生常談的話題。而在接受設計里,SpinalHDL中的“一別兩寬”式設計方式,著實讓我贊同。
》》Stream
Stream本質上是一個帶數據的握手協議:
在數字邏輯電路里,無論是普通的模塊接口之間,還是標準的AMBA、Avalon等總線,都處處可見Stream的身影:
》》握手之殤,糾纏不清
無論是新手還是老手,對于Stream這種握手形式的邏輯處理還是挺煩的。Stream這種握手形式的邏輯僅僅是添加一級寄存器還是頗顯得繁瑣的,需要小心翼翼的處理。更遑論當設計里還牽涉到數據的處理。這種在處理功能邏輯的同時又要考慮握手信號的處理時在設計邏輯電路時還是顯得頗頭大的,畢竟“一心二用”還是頗有不便……
仔細想想,在接口信號處理時,功能性的設計往往是組合邏輯頗多,而為了更好的滿足時序約束,往往需要添加寄存器來優化時序,單獨處理或許并不顯得復雜,但當把兩者混在一塊兒便極易“按起葫蘆浮起瓢”,導致設計功能性錯誤了。倘若糾纏不清令人頭大,那一別兩寬呢?把功能邏輯和為了優化時序的pipeline分開豈不是設計極其簡單。
》》Stream pipeline
Stream的pipeline處理在SpinalHDL里提供了很好的封裝:
Stream接口的pipeline里有三種類型:
m2sPipe: 為兩個Stream接口之間的valid,payload之間添加一級寄存器。
s2mPipe:為兩個Stream接口之間的ready路徑添加一級寄存器。
s2mPipe().m2sPipe():在兩個Stream接口之間的valid,payload、ready之間均添加一級寄存器。
上面的三種接口pipeline方式能夠很好的滿足接口中的時序優化。SpinalHDL里也提供了相應簡單的連接符(箭頭指向誰誰就是目的端)。關于這里面的源代碼分析可參見文章《打個拍,握個手可以么》。
》》功能處理
有了前面Stream接口的pipeline方式,在Stream接口信號中的處理功能性邏輯時,我們便可以采用組合邏輯的方式進行處理。舉個簡單的例子,在邏輯設計里對輸入的Stream信號中的payload如果大于0x80加1輸出,小于0x80減1輸出。那么這里便可以僅以組合邏輯的形式進行處理:
在上面的邏輯處理里,整個設計均采用組合邏輯的形式進行處理。
》》合二為一
有了上面的那些,那么合二為一便很容易了。功能處理采用組合邏輯,時序處理采用pipeline。“一別兩寬”之后,合二為一便好了:
》》寫在最后
就個人使用來講,在SpinalHDL的設計里,這種方式極大的簡化了電路設計的復雜度。理解了Stream的使用,那么對于SpinalHDL中lib的大多數功能也能夠有一個很好的了解與使用。
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
AMBA
+關注
關注
0文章
68瀏覽量
14980 -
數字邏輯電路
+關注
關注
0文章
106瀏覽量
15812
發布評論請先 登錄
相關推薦
評論