在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何根據(jù)自己設(shè)計中的寄存器配置總線定義來生成一套寄存器配置模版

Spinal FPGA ? 來源:Spinal FPGA ? 2024-03-04 13:56 ? 次閱讀

編 者 按

無論是FPGA還是ASIC,系統(tǒng)設(shè)計中總會存在配置寄存器總線的使用,我們會將各種功能、調(diào)試寄存器掛載在寄存器總線上使用。在SpinalHDL中,BusIf那套總線模型庫寫的還是相當(dāng)不錯的,能夠同時生成對應(yīng)的代碼和文檔(在公司里也做過一些修改,能夠直接生成整個系統(tǒng)的寄存器文檔而不僅僅是單個模塊的寄存器文檔)。今天就手把手來基于SpinalHDL中的BusIf來看如何根據(jù)自己設(shè)計中的寄存器配置總線定義來生成一套寄存器配置模版。

HPI總線

今天以下面一套簡單的寄存器總線為例進行設(shè)計:

caseclass Hpi(addrWidth:Int,dataWidth:Int,useStrb:Boolean) extends Bundle with IMasterSlave {
val wr,rd=Bool()
val addr=UInt(addrWidth bits)
val wdata=Bits(dataWidth bits)
val strb= useStrb generate(Bits(dataWidth/8bits))
val rvalid=Bool()
val rdata=Bits(dataWidth bits)

overridedef asMaster(): Unit = {
out(wr,rd,addr,wdata)
in(rvalid,rdata)
if(useStrb) out(strb)
}
}

HPI總線很簡單,wr用于標(biāo)識寫指令、rd用于標(biāo)識讀指令。addr用于指示讀/寫地址。wdata用于輸入待寫入的數(shù)據(jù)。strb如果使能則用于標(biāo)識對應(yīng)寫指令的位選信號。而rvalid則用于指示讀返回數(shù)據(jù)有效,rdata則表示讀返回數(shù)據(jù)(這里就不畫時序圖了)。

設(shè)計一套自己的HpiInterface

針對上面的HPI總線,這里我們基于BusIf設(shè)計一套自己的配置寄存器總線模板。

BusIf都做了什么

對于寄存器配置總線,其總線信號定義,協(xié)議交互定義總是各有千秋的,BusIf無法對寄存器配置總線的這些定義做提前預(yù)知。然而對于寄存器配置總線的用途,則相對明確,無非就是實現(xiàn)不同數(shù)據(jù)類型(像UVM中定義的寄存器模型)的讀寫操作。那么,當(dāng)我們基于BusIf定義一套自己的配置寄存器模板時,所需要做的就無非是:

實現(xiàn)配置寄存器交互協(xié)議的邏輯實現(xiàn)

告訴BusIf如何什么情況下觸發(fā)了某個寄存器的讀/寫操作

HpiInterface

這里先貼上一個完整的代碼,隨后進行逐行解析

faef404e-d8a9-11ee-a297-92fbcf53809c.png

這里我們定義的寄存器總線相對來講較為簡單,故只有30~31行是用來進行配置寄存器總線協(xié)議時序的處理的。

line3

override defgetModuleName:String = moduleName.name

利用隱式參數(shù)獲取模塊名,BusIf中并無顯示使用。

line5~6

override defwriteAddress():UInt = bus.addr
override defreadAddress():UInt = bus.addr

這里用來告知BusIf配置寄存器總線的寫地址,讀地址分別是什么,在HPI總線中均為bus.addr

line8~9

override defreadHalt():Unit = {}
override defwriteHalt():Unit = {}

這里用來填寫發(fā)生讀阻塞或者寫阻塞時的響應(yīng)動作,HPI總線中沒有阻塞的概念,直接不做任何處理即可(由于配置寄存器總線接口層協(xié)議我們會自己實現(xiàn),BusIf中當(dāng)前版本內(nèi)部無使用的地方,故直接填空即可)。

line11

override defbusDataWidth:Int = bus.dataWidth

這里用來告知BusIf配置寄存器總線的數(shù)據(jù)位寬

line13~18

override val withStrb:Boolean = bus.useStrb
val wstrb:Bits = withStrb generate(Bits(strbWidth bit))
val wmask: Bits = withStrb generate(Bits(busDataWidth bit))
val wmaskn: Bits = withStrb generate(Bits(busDataWidth bit))
initStrbMasks()
if(bus.useStrb){wstrb:=bus.strb}

這里用于設(shè)置配置寄存器總線是否有使用掩碼功能。line13用于告知BusIf是否使用掩碼,而line14~17則是一套針對掩碼的BusIf設(shè)置(直接copy即可)。在line18行如果使能了掩碼功能,則通過用bus.strb來驅(qū)動 wstrb來告知BusIf配置寄存器總線對應(yīng)的寫掩碼。

line20~26

overrideval askRead: Bool = bus.rd
overrideval askWrite: Bool = bus.wr
overrideval doWrite: Bool = bus.wr
overrideval doRead: Bool = bus.rd
overrideval readData: Bits = Bits(bus.dataWidth bits)
overrideval writeData: Bits =bus.wdata
overrideval readError: Bool = Bool()

askRead:告知BusIf什么情況下配置寄存器產(chǎn)生了讀請求(如果總線類型是Stream那種握手型的,則只需填valid即可,可參照regif下的AxiLite4BusInterface)。在當(dāng)前版本中,askRead在BusIf中并未有使用

askWrite:告知BusIf什么情況下配置寄存器產(chǎn)生了寫請求,同上

doWrite:告知BusIf當(dāng)前時鐘是否出發(fā)了寄存器寫操作

doRead:告知BusIf當(dāng)前時鐘是否發(fā)生了寄存器讀操作

readData:為BusIf聲明一個對應(yīng)總線數(shù)據(jù)位寬的信號,BusIf會將讀結(jié)果返回到當(dāng)前信號上。

writeData:告知BusIf如果發(fā)生寫數(shù)據(jù),寫入的數(shù)據(jù)是什么

readError:聲明一個Bool類型,BusIf會將是否有讀錯誤發(fā)生通過該信號進行表示。

line28

setReservedAddressReadValue(BigInt("deaddead",16))

此處用于設(shè)置當(dāng)總線讀了未使用的地址時,應(yīng)當(dāng)返回何值。當(dāng)然也可以不必在這里進行統(tǒng)一設(shè)置,可以在真正的例化位置為每個模塊設(shè)置一個不同的值。

line30~31

bus.rdata:=RegNext(readData)
bus.rvalid:=RegNext(bus.rd,False)

該處則用于處理Hpi總線的協(xié)議時序,我們僅需處理接口層面上的時序即可。

使用HpiInterface

定義好之后,使用就和regif文檔里的例子一樣了,下面給出一個例子:

fafef476-d8a9-11ee-a297-92fbcf53809c.png

這里定義了data0,data1,data2三個寄存器。data0,data1可讀可寫,data2只讀。

值得注意的是這里針對data0,data1采用了不同形式的API,對于data0,使用field來注冊會生成reg0_data0,其是帶有復(fù)位處理的,這里不希望其有復(fù)位邏輯,故這里添加了removeInitAssignments()

DIY時間

來看下在BusIf中針對讀邏輯是怎么處理的:

fb19a42e-d8a9-11ee-a297-92fbcf53809c.png

從FPGA的角度來看的話,這個askRead判斷是沒有必要,徒增延遲,看起來不那么優(yōu)雅,而且在Hpi總線使用時往往是要求地址按位寬對齊的,所以完全可以將地址判斷抹去低比特,由于這里readGenerator定義成了private,外部無法重載,這里給出一個在HpiInterface中進行DIY的例子:

val discardAddrWidth = log2Up(busDataWidth / 8)

def hitDoWriteOverride() = {
orderdRegInsts.foreach(regInst => {
regInst.hitDoWrite.removeAssignments()
regInst.hitDoWrite := writeAddress()(bus.addrWidth - 1downto discardAddrWidth) === regInst.addr / (busDataWidth / 8) && doWrite
})
}

def reworkReadGenerate() = {
readError.removeAssignments()
readData.removeAssignments()
switch(readAddress()(bus.addrWidth - 1downto discardAddrWidth)) {
orderdRegInsts.foreach(regInst => {
if(!regInst.allIsNA) {
is(regInst.addr / (busDataWidth / 8)) {
readData := regInst.readBits
readError := Bool(regInst.haveWO)
}
}
})
default{
readData := getReservedAddressReadValue
readError := True
}
}
}

component.addPrePopTask(() => {
hitDoWriteOverride()
reworkReadGenerate()
})

這里對讀和寫均做了一些優(yōu)化。對于寫操作進行地址判定時將會抹去地址相應(yīng)地比特的判斷。而對于讀操作,也會抹去相應(yīng)地址位,同時也刪除了askRead的判斷。

感興趣的小伙伴可自行擴展定制,比如將HPI的讀返回拆成兩排分級譯碼以獲取更好的時序等等。



審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1640

    文章

    21897

    瀏覽量

    611310
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5396

    瀏覽量

    122582
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19354
  • HPI
    HPI
    +關(guān)注

    關(guān)注

    0

    文章

    36

    瀏覽量

    14680

原文標(biāo)題:手把手創(chuàng)建自己的寄存器配置模版

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    怎樣去配置FMC總線寄存器

    目錄1、硬件2、初始化時序3、配置FMC總線寄存器3.1 控制寄存器3.2 時序寄存器3.3 命令寄存
    發(fā)表于 01-26 07:35

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內(nèi)的組成部分。
    發(fā)表于 03-08 14:26 ?2.2w次閱讀

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思 數(shù)據(jù)寄存器數(shù)據(jù)寄存器包括累加AX、基址寄存器BX、計數(shù)
    發(fā)表于 03-08 14:38 ?1.3w次閱讀

    MAXQ3180入門:寄存器配置

    MAXQ3180入門:寄存器配置 雖然多相、多功能電能計量AFE芯片MAXQ3180具有很多配置寄存器,但僅需配置幾個
    發(fā)表于 03-28 09:20 ?1233次閱讀

    MPC860寄存器配置

    MPC860 的系統(tǒng)接口單元(SIU)控制系統(tǒng)啟動、初始化、運行、保護和外部系統(tǒng)總線。這些功能是靠許多寄存器實現(xiàn)的。這篇文檔將詳細說明各個寄存器配置情況。
    發(fā)表于 06-08 17:54 ?53次下載
    MPC860<b class='flag-5'>寄存器</b><b class='flag-5'>配置</b>

    采用PCI9052芯片的配置寄存器及加載其驅(qū)動程序的開發(fā)

    的大小為256字節(jié),分為頭標(biāo)區(qū)和設(shè)備有關(guān)區(qū)。直接影響設(shè)備特性的配置寄存器在頭標(biāo)區(qū),其他部分則因設(shè)備而異。PCI總線配置空間通常與PCI接口芯片相關(guān)。該
    發(fā)表于 04-04 18:14 ?1819次閱讀
    采用PCI9052芯片的<b class='flag-5'>配置</b><b class='flag-5'>寄存器</b>及加載其驅(qū)動程序的開發(fā)

    GC1064寄存器配置參考文件下載

    GC1064寄存器配置參考文件下載
    發(fā)表于 05-21 16:17 ?9次下載

    IO口配置常用的8個寄存器 1.6

    IO,分別用大寫字母表示,即 x=A/B/C/D/E/F/G/H/I,端口X配置位0~15。OTYPER 寄存器,該寄存器僅用于輸出模式,在輸入模式(MODER[1:0]=00/11 時)下不起作用。該
    發(fā)表于 11-29 13:51 ?10次下載
    IO口<b class='flag-5'>配置</b>常用的8個<b class='flag-5'>寄存器</b> 1.6

    GPIO寄存器

    每組IO口有10個寄存器組成,如果芯片有GPIOA~GPIOI,9個組那么共有90個寄存器如果配置個IO口需要2個位,那么剛好32位
    發(fā)表于 12-08 17:06 ?5次下載
    GPIO<b class='flag-5'>寄存器</b>

    STM32寄存器點燈

    配置寄存器使STM32最小系統(tǒng)板上的LED燈點亮根據(jù)原理圖,要使D2點亮,需要將PC13拉低,分為以下步驟:使能GPIO的時鐘配置GPIO13為輸出模式
    發(fā)表于 12-08 17:21 ?3次下載
    STM32<b class='flag-5'>寄存器</b>點燈

    2021-04-17 STM32串口寄存器庫函數(shù)配置

    STM32串口寄存器庫函數(shù)配置方法STM32常用寄存器和庫函數(shù)串口配置般步驟(串口實例)常用的串口相關(guān)
    發(fā)表于 12-28 19:13 ?7次下載
    2021-04-17  STM32串口<b class='flag-5'>寄存器</b>庫函數(shù)<b class='flag-5'>配置</b>

    配置STM32寄存器控制GPIO點亮LED

    STM32點亮LED 寄存器方式IO簡介1、每個IO可以自由編程,但是IO口寄存器必須按照32位字被訪問。2、每個IO端口都有7個寄存器來控制。CRL 【0-7】端口配置
    發(fā)表于 01-13 16:15 ?3次下載
    <b class='flag-5'>配置</b>STM32<b class='flag-5'>寄存器</b>控制GPIO點亮LED

    如何在VHDL實現(xiàn)個簡單的寄存器

    存儲的位數(shù)上有所不同,具體取決于系統(tǒng)的配置。在本教程,我們將學(xué)習(xí)如何在 VHDL 實現(xiàn)個簡單的寄存器
    發(fā)表于 07-29 16:48 ?4901次閱讀
    如何在VHDL<b class='flag-5'>中</b>實現(xiàn)<b class='flag-5'>一</b>個簡單的<b class='flag-5'>寄存器</b>

    振弦采集模塊配置工具VMTool生成寄存器

    振弦采集模塊配置工具VMTool生成寄存器
    的頭像 發(fā)表于 01-16 10:45 ?773次閱讀
    振弦采集模塊<b class='flag-5'>配置</b>工具VMTool<b class='flag-5'>生成</b><b class='flag-5'>寄存器</b>值

    寄存器分為基本寄存器和什么兩種

    寄存器是計算機中用于存儲數(shù)據(jù)的高速存儲單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴展寄存器兩種類型。 、基本
    的頭像 發(fā)表于 07-12 10:31 ?1892次閱讀
    主站蜘蛛池模板: 88av视频在线观看 | 97视频hd| 亚洲福利一区二区三区 | 成人免费视频一区 | 人人爽天天碰天天躁夜夜躁 | 午夜黄色网址 | 中文字幕一区二区三区在线播放 | 亚洲已满18点击进入在线观看 | 两性色午夜视频免费国产 | 四虎在线网址 | 日本一区二区三区免费看 | 久操免费在线视频 | 色aaa| 欧美一级在线全免费 | 五月深爱婷婷 | 亚洲欧洲一区二区三区在线观看 | 国产黄色在线视频 | 欧美伊人久久大香线蕉综合69 | 午夜亚洲国产精品福利 | 亚洲精品久久久久影 | 女人张开腿让男人桶免费网站 | 成人午夜啪啪免费网站 | 色偷偷成人网免费视频男人的天堂 | 亚洲国产精品自在现线让你爽 | 日本黄色录像视频 | 午夜性刺激免费视频观看不卡专区 | 在线观看免费视频网站色 | 嫩草影院永久入口在线观看 | 福利精品 | 久久午夜影视 | 成人xx视频免费观看 | 91极品视频在线观看 | 18性夜影院午夜寂寞影院免费 | 种子天堂bt磁力在线资源 | 欧美黄色片在线播放 | 在线黄视频网站 | 全免费一级午夜毛片 | 中文字幕在线第一页 | 在线天堂bt种子资源 | 女人大毛片一级毛片一 | 激情五月深爱五月 |