版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中國(guó)科學(xué)院新疆天文臺(tái)財(cái)務(wù)處招聘?jìng)淇碱}庫(kù)及1套完整答案詳解
- 精準(zhǔn)扶貧培訓(xùn)課件
- 2026年濟(jì)源職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試備考題庫(kù)帶答案解析
- 2026年廈門銀行南平分行招聘?jìng)淇碱}庫(kù)及答案詳解1套
- 2026年山西國(guó)際商務(wù)職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試備考試題帶答案解析
- AD認(rèn)知量表的居家安全評(píng)估可視化關(guān)聯(lián)
- AD認(rèn)知康復(fù)治療的量表效果可視化追蹤
- 2026年山東協(xié)和學(xué)院?jiǎn)握芯C合素質(zhì)考試備考題庫(kù)帶答案解析
- 2026年天津鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試備考試題帶答案解析
- 2026年浙江建設(shè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試模擬試題帶答案解析
- 220kV升壓站調(diào)試施工方案
- 新人教版數(shù)學(xué)六年級(jí)下冊(cè)全冊(cè)課本練習(xí)題可編輯可打印
- 教育管理社會(huì)調(diào)查分析報(bào)告
- 小學(xué)生心理健康咨詢個(gè)案輔導(dǎo)記錄
- YYT 0771.2-2009 動(dòng)物源醫(yī)療器械 第2部分 來源、收集與處置的控制
- QCT265-2023汽車零部件編號(hào)規(guī)則
- 快電子期末50題參考答案
- (高清版)TDT 1071-2022 園地分等定級(jí)規(guī)程
- 江陵亞東建材水泥有限公司 年產(chǎn)150萬噸水泥研磨及年產(chǎn)50萬噸礦渣粉-復(fù)合摻合料生產(chǎn)線項(xiàng)目環(huán)評(píng)報(bào)告
- 市政工程安全文明施工組織設(shè)計(jì)樣本
- 樁基中的鋼筋籠工程量EXCLE表計(jì)算
評(píng)論
0/150
提交評(píng)論