敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第7章 多時(shí)鐘域設(shè)計(jì)_第1頁(yè)
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第7章 多時(shí)鐘域設(shè)計(jì)_第2頁(yè)
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第7章 多時(shí)鐘域設(shè)計(jì)_第3頁(yè)
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第7章 多時(shí)鐘域設(shè)計(jì)_第4頁(yè)
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第7章 多時(shí)鐘域設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

7.多時(shí)鐘域設(shè)計(jì)一、沒有隱式端口的模塊二、定義一個(gè)時(shí)鐘域和復(fù)位域三、使用時(shí)鐘負(fù)沿和低有效復(fù)位四、示例:異步FIFO五、總結(jié)目錄1一、沒有隱式端口的模塊2一、沒有隱式端口的模塊1.1RawModule繼承自Module的模塊類會(huì)獲得隱式的全局時(shí)鐘與同步復(fù)位信號(hào),當(dāng)我們不需要這兩個(gè)隱式端口時(shí),則可以選擇繼承自RawModule,這樣在轉(zhuǎn)換成Verilog時(shí)就沒有隱式端口。3ModuleRawModule時(shí)鐘隱式時(shí)鐘無復(fù)位信號(hào)隱式同步復(fù)位無沒有隱式端口的模塊例子:含隱式端口importchisel3._

importchisel3.experimental._

importchisel3.stage.ChiselGeneratorAnnotation

classMyModuleextendsModule{

valio=IO(newBundle{

vala=Input(UInt(4.W))

valb=Input(UInt(4.W))

valc=Output(UInt(4.W))

})

io.c:=io.a&io.b

}moduleMyModule(

inputclock,

inputreset,

input[3:0]io_a,

input[3:0]io_b,

output[3:0]io_c

);

assignio_c=io_a&io_b;//@[MyRawModule.scala14:16]

endmodule一、沒有隱式端口的模塊4沒有隱式端口的模塊例子:無隱式端口importchisel3._

importchisel3.experimental._

importchisel3.stage.ChiselGeneratorAnnotation

classMyRawModuleextendsRawModule{

valio=IO(newBundle{

vala=Input(UInt(4.W))

valb=Input(UInt(4.W))

valc=Output(UInt(4.W))

})

io.c:=io.a&io.b

}moduleMyRawModule(

input[3:0]io_a,

input[3:0]io_b,

output[3:0]io_c

);

assignio_c=io_a&io_b;//@[MyRawModule.scala14:16]

endmodule一、沒有隱式端口的模塊5一、沒有隱式端口的模塊1.1RawModule這樣的模塊一般用于純組合邏輯。由于其不再有隱式的時(shí)鐘和復(fù)位信號(hào),因此在其類內(nèi)頂層不能出現(xiàn)使用時(shí)鐘的相關(guān)操作。RawModule子類純組合邏輯多時(shí)鐘域語法時(shí)序邏輯6二、定義一個(gè)時(shí)鐘域和復(fù)位域72.1withClockAndReset作用:創(chuàng)建一個(gè)新的時(shí)鐘和復(fù)位域,作用范圍僅限于它的傳名參數(shù)的內(nèi)部apply方法:defapply[T](clock:Clock,reset:Reset)(block:?T):T二、定義一個(gè)時(shí)鐘域和復(fù)位域withClockAndReset是chisel3包里的一個(gè)單例對(duì)象8在Verilog中:定義時(shí)鐘和復(fù)位信號(hào)的端口在always語句塊中進(jìn)行相應(yīng)選擇modulea(

inputclk,

inputrst_n

);

always(posedgeclkornegedgerst_n)

begin新的時(shí)鐘和復(fù)位信號(hào)2.1withClockAndReset二、定義一個(gè)時(shí)鐘域和復(fù)位域classMultiClockModuleextendsModule{

valio=IO(newBundle{

valclockB=Input(Clock())

valresetB=Input(Bool())

valstuff=Input(Bool())

})

valregClock1=RegNext(io.stuff)

withClockAndReset(io.clockB,io.resetB){

valregClockB=RegNext(io.stuff)

valm=Module(newChildModule)

}

valregClock2=RegNext(io.stuff)

}這個(gè)寄存器跟隨當(dāng)前模塊的隱式全局時(shí)鐘clock在該花括號(hào)內(nèi),所有時(shí)序元件都跟隨時(shí)鐘io.clockB和復(fù)位信號(hào)io.resetB這個(gè)寄存器跟隨當(dāng)前模塊的隱式全局時(shí)鐘clock92.1withClockAndReset二、定義一個(gè)時(shí)鐘域和復(fù)位域classMultiClockModuleextendsModule{

valio=IO(newBundle{

valclockB=Input(Clock())

valresetB=Input(Bool())

valstuff=Input(Bool())

})

valclockB_child=withClockAndReset(io.clockB,io.resetB){

Module(newChildModule)

}

clockB_child.io.in:=io.stuff

}工廠方法:defapply[T](clock:Clock,reset:Reset)(block:?T):T例化其它模塊在時(shí)鐘域外對(duì)其賦值102.2withClock和withReset二、定義一個(gè)時(shí)鐘域和復(fù)位域作用:分別用于構(gòu)建只有獨(dú)立時(shí)鐘和只有獨(dú)立復(fù)位信號(hào)的作用域apply方法:defapply[T](clock:Clock)(block:?T):Tdefapply[T](reset:Reset)(block:?T):TwithClock和withReset也是chisel3包里有單例對(duì)象11withClockAndResetwithClockwithReset獨(dú)立時(shí)鐘

獨(dú)立復(fù)位信號(hào)

二、定義一個(gè)時(shí)鐘域和復(fù)位域classChildModuleextendsModule{

valio=IO(newBundle{

valin=Input(Bool())

valclockChild=Input(Clock())

valout=Output(Bool())

})

withClock(io.clockChild){

//該寄存器跟隨時(shí)鐘io.clockChild,隱式復(fù)位信號(hào)reset

valregclock=RegNext(io.in,0.U)

io.out:=regclock

}

}classMultiClockTesterextendsModule{

valio=IO(newBundle{

valclockA=Input(Clock())

valresetA=Input(Bool())

valclockChild=Input(Clock())

valresetB=Input(Bool())

valstuff_in=Input(Bool())

valstuff_out=Output(Bool())

valoutregClock=Output(Bool())

valoutregClockA=Output(Bool())

valoutregClockB=Output(Bool())

})

//這個(gè)寄存器跟隨當(dāng)前模塊的隱式全局時(shí)鐘clock

valregClock=RegNext(io.stuff_in,0.U)

valclockA_child=withClockAndReset(io.clockA,io.resetA.asAsyncReset()){

//在該花括號(hào)內(nèi),所有時(shí)序元件都跟隨時(shí)鐘io.clockA

//所有寄存器的復(fù)位信號(hào)都是io.resetA

valregClockA=RegNext(io.stuff_in,0.U)

//這個(gè)寄存器跟隨當(dāng)前模塊的隱式全局時(shí)鐘clock

regClock:=regClockA

io.outregClockA:=regClockA

Module(newChildModule)

}clockA_child.io.clockChild:=io.clockChild

clockA_child.io.in:=io.stuff_in

io.stuff_out:=clockA_child.io.out

withReset(io.resetB){

//在該花括號(hào)內(nèi),所有時(shí)序元件都跟隨時(shí)鐘隱式時(shí)鐘clock,復(fù)位信號(hào)都是io.resetB

valregClockB=RegNext(io.stuff_in,0.U)

io.outregClock:=regClock

io.outregClockB:=regClockB

}

}123122.2withClock和withReset二、定義一個(gè)時(shí)鐘域和復(fù)位域一個(gè)寄存器只和它定義時(shí)所處的時(shí)鐘域有關(guān),即使在其他時(shí)鐘域被賦值,那么它還是跟隨自己被定義時(shí)的時(shí)鐘。時(shí)鐘域是可以嵌套的,當(dāng)前的時(shí)鐘域會(huì)覆蓋掉上一層的時(shí)鐘域。132.3復(fù)位信號(hào)的三種類型二、定義一個(gè)時(shí)鐘域和復(fù)位域Reset是抽象類型,具體是同步復(fù)位還是異步復(fù)位需要根據(jù)上下文推斷,也即既可以是同步,也可以異步。14復(fù)位信號(hào)BoolAsyncResetReset復(fù)位類型同步復(fù)位異步復(fù)位同步/異步當(dāng)我們不希望其自動(dòng)推斷抽象類型的時(shí)候,可以在定義模塊時(shí)通過混入以下特質(zhì),將reset的類型設(shè)置成我們想要的類型。混入RequireSyncReset特質(zhì)可以將模塊的隱式reset設(shè)置成同步復(fù)位信號(hào)。混入RequireAsyncReset

特質(zhì)可以將模塊的隱式reset設(shè)置成異步復(fù)位信號(hào)。二、定義一個(gè)時(shí)鐘域和復(fù)位域classSyncResetModuleextendsMultiIOModulewithRequireSyncReset{

valSyncResetReg=RegInit(false.B)

}classAsyncResetModuleextendsMultiIOModulewithRequireAsyncReset{

valAsyncResetReg=RegInit(false.B)

}classSyncResetModuleextendsMultiIOModulewithRequireSyncReset{

valSyncResetReg=RegInit(false.B)//resetisoftypeBool

}classAsyncResetModuleextendsMultiIOModulewithRequireAsyncReset{

valAsyncResetReg=RegInit(false.B)//resetisoftypeAsyncReset

}15為了方便的修改任何復(fù)位信號(hào)的類型,我們還可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換。使用reset.asBool()可以將復(fù)位信號(hào)從其他兩種類型轉(zhuǎn)換成Bool類型使用reset.asAsyncReset()可以將復(fù)位信號(hào)從其他兩種類型轉(zhuǎn)換成AsyncReset類型。二、定義一個(gè)時(shí)鐘域和復(fù)位域16三、使用時(shí)鐘負(fù)沿和低有效的復(fù)位信號(hào)17三、使用時(shí)鐘負(fù)沿和低有效的復(fù)位信號(hào)Chisel:默認(rèn)情況下,聲明的時(shí)序元件都是以時(shí)鐘的正沿和高有效的復(fù)位信號(hào)作為敏感變量。復(fù)位信號(hào):只需要加上取反符號(hào)或邏輯非符號(hào)。時(shí)鐘信號(hào):需要先用asUInt方法把Clock類型轉(zhuǎn)換成UInt類型,再用asBool轉(zhuǎn)換成Bool類型,此時(shí)可以加上取反符號(hào)或邏輯非符號(hào),最后再用asClock變回Clock類型。18Verilog:復(fù)位信號(hào):使用取反符號(hào)或邏輯非符號(hào)。時(shí)鐘信號(hào):使用posedge或negedge。modulea(

inputclk,

inputrst_n

);

always(negedgeclk)

begin

if(!ret_n)classNegativeClkRstextendsRawModule{

valio=IO(newBundle{

valin=Input(UInt(4.W))

valmyClk=Input(Clock())

valmyRst=Input(Bool())

valout=Output(UInt(4.W))

})

withClockAndReset((~io.myClk.asUInt.asBool).asClock,~io.myRst){

valtemp=RegInit(0.U(4.W))

temp:=io.in

io.out:=temp

}

}三、使用時(shí)鐘負(fù)沿和低有效的復(fù)位信號(hào)需要進(jìn)行多次類型轉(zhuǎn)換直接加上取反符號(hào)或邏輯非符號(hào)19四、示例:異步FIFO四、示例:異步FIFO下面是一個(gè)異步FIFO例子:數(shù)據(jù)位寬和深度都是參數(shù)化的,讀、寫地址指針的交互采用格雷碼和兩級(jí)寄存器采樣,以便改善亞穩(wěn)態(tài)。通過在Vivado2018.3里綜合后,可以得到以BRAM為存儲(chǔ)器的FIFO。21四、示例:異步FIFOclassFIFO(width:Int,depth:Int)extendsRawModule{

valio=IO(newBundle{

//write-domain

valdataIn=Input(UInt(width.W))

valwriteEn=Input(Bool())

valwriteClk=Input(Clock())

valfull=Output(Bool())

//read-domain

valdataOut=Output(UInt(width.W))

valreadEn=Input(Bool())

valreadClk=Input(Clock())

valempty=Output(Bool())

//reset

valsystemRst=Input(Bool())

})22四、示例:異步FIFOvalram=SyncReadMem(1<<depth,UInt(width.W))//2^depth

valwriteToReadPtr=Wire(UInt((depth+1).W))//toreadclockdomain

valreadToWritePtr=Wire(UInt((depth+1).W))//towriteclockdomain

//writeclockdomain

withClockAndReset(io.writeClk,io.systemRst){

valbinaryWritePtr=RegInit(0.U((depth+1).W))

valbinaryWritePtrNext=Wire(UInt((depth+1).W))

valgrayWritePtr=RegInit(0.U((depth+1).W))

valgrayWritePtrNext=Wire(UInt((depth+1).W))

valisFull=RegInit(false.B)

valfullValue=Wire(Bool())

valgrayReadPtrDelay0=RegNext(readToWritePtr)

valgrayReadPtrDelay1=RegNext(grayReadPtrDelay0)

binaryWritePtrNext:=binaryWritePtr+(io.writeEn&&!isFull).asUInt

binaryWritePtr:=binaryWritePtrNext

grayWritePtrNext:=(binaryWritePtrNext>>1).asUInt()^binaryWritePtrNext

grayWritePtr:=grayWritePtrNext

writeToReadPtr:=grayWritePtr

fullValue:=(grayWritePtrNext===Cat(~grayReadPtrDelay1(depth,depth-1),grayReadPtrDelay1(depth-2,0)))

isFull:=fullValue

when(io.writeEn&&!isFull){

ram.write(binaryWritePtr(depth-1,0),io.dataIn)

}

io.full:=isFull

}23四、示例:異步FIFO//readclockdomain

withClockAndReset(io.readClk,io.systemRst){

valbinaryReadPtr=RegInit(0.U((depth+1).W))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論