對于FPGA系統(tǒng)設計里,寄存器控制通道的設計是系統(tǒng)控制中必不可少的部分。今日且看SpinalHDL中如何優(yōu)雅地實現寄存器總線讀寫。
Bus Slave Factory
在SpinalHDL里,其Libraries里提供了關于總線相關的庫。包含AMBA3、AMBA4、AVALON等總線類型,并提供了bus slave factory工具:
通過bus slave factory,我們可以方便地實現寄存器讀寫,其提供了一系列寄存器讀寫方法。這里列舉幾個常用的方法(完整的方法列表可參照SpinalHDL-Doc):
read(that,address,bitOffset)
注冊寄存器讀操作到指定地址,比特偏移為bitOffset 。
write(that,address,bitOffset)
注冊寄存器寫操作到指定地址,比特偏移為bitOffset。
readAndWrite(that,address,bitOffset)
注冊寄存器讀寫操作到指定地址,比特偏移為bitOffset 。
readMultiWord(that,address)
注冊大位寬寄存器(超過總線數據位寬)讀操作到指定地址,其中address地址存放對應低比特,高比特地址向上累加。
writeMultiWord(that,address)
注冊大位寬寄存器(超過總線數據位寬)寫操作到指定地址,其中address地址存放對應低比特,高比特地址向上累加。
除此之外,bus slave factory還提供了printDataModel函數用于打印寄存器列表。而且在生成RTL時,其會自動檢測寄存器地址是否存在沖突。
AXI4-Lite總線實現
這里以AXI4-Lite總線舉例,通過AXI4-Lite總線讀寫三組寄存器:
en:單比特信號,可讀可寫。
plus:單比特信號,可讀寫,寫1自動清零。
cnt:64比特信號,可讀。
這里給出完整的代碼結構:
這里代碼5~10行代碼聲明模塊端口,第12行代碼規(guī)范AXI4-Lite端口名稱。代碼第15~18行通過slave factory實現AXI4-Lite寄存器讀寫。代碼第19行打印輸出寄存器列表。
由于plus寫1清零,因此代碼14行用于實現清零操作。
通過下面的語法生成RTL代碼:
在生成RTL代碼的同時,會打印寄存器列表:
仿真結果
SpinalHDL里提供了AXI4-Lite總線的基礎仿真庫,這里直接調用其仿真庫,完整的仿真代碼如下:
通過gtkWave觀察波形:
可以看到,功能符合我們的設計,寫寄存器0x4信號plus拉高1個時鐘周期后自動清零。 這里簡單幾行代碼實現了AXI4-Lite總線控制寄存器讀寫,對于我們在真正的項目實現里,能夠極大簡化我們的工作量和bug產生。盡管現在各個大廠或許有專門的總線控制寄存器讀寫代碼生成工具,但SpinalHDL這種形式從本質上解決了Verilog描述的重復性工作。
寫在最后
雖然SpinalHDL這種slave factory工具能夠讓我們在工程中快捷的實現想要的功能,但對于初學者來說,理解掌握AXI4-Lite這些標準的總線協(xié)議時序還是非常有必要的(Verilog or SpinalHDL實現都行嘍)~
編輯:lyn
-
FPGA
+關注
關注
1630文章
21777瀏覽量
604733 -
寄存器
+關注
關注
31文章
5359瀏覽量
120816
原文標題:SpinalHDL—優(yōu)雅地實現總線寄存器讀寫
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論