自学内容网 自学内容网

SpinalHDL之结构(四)

本文作为SpinalHDL学习笔记第六十四篇,介绍SpinalHDL的时钟域(Clock domains)

目录:

1.简介(Introduction)

2.例化(Instantiation)

⼀、简介(Introduction)

在SpinalHDL中, 时钟和复位信号能结合起来构成时钟域(clock domain)。时钟域可以应⽤于设计的某些区域中, 例化在这些区域中的所有同步单元都会隐式地使⽤这些时钟域。

时钟域的应⽤的⼯作模式类似于堆栈, 这意味着你在⼀个给定的时钟域中仍然可以在本地施加另⼀个时钟域。

需要注意的是, ⼀个寄存器在它被创建的时候捕捉时钟域, ⽽非它被赋值的时候。所以请确保在你所希望的ClockingArea中创建寄存器。

⼆、例化(Instantiation)

定义时钟域的语句如下所⽰(使⽤EBNF语句):

ClockDomain(
clock: Bool
[, reset: Bool]
[, softReset: Bool]
[, clockEnable: Bool]
[, frequency: IClockDomainFrequency]
[, config: ClockDomainConfig]
)

在这个定义中包含五个参数:

以下例⼦给出在设计中定义特定时钟域的实例:

val coreClock = Bool()
val coreReset = Bool()
//定义新的时钟域
val coreClockDomain = ClockDomain(coreClock, coreReset)
//在设计的某个区域内应⽤该时钟域
val coreArea = new ClockingArea(coreClockDomain) {
val coreClockedRegister = Reg(UInt(4 bits))
}

Verilog:

wire coreClock;
wire coreReset;
reg [3:0] coreArea_coreClockedRegister;
reg [7:0] counter;
always @(posedge coreClock or posedge coreReset) begin
if(coreReset) begin
coreArea_coreClockedRegister <= 4'b0000;
end else begin
if(io_cond1) begin
coreArea_coreClockedRegister <= 4'b0010;
end
end
end

当⼀个Area不需要时钟时(⻔控), 也可以直接应⽤时钟域:

class Counters extends Component {
val io = new Bundle {
val enable = in Bool()
val freeCount, gatedCount = out UInt (4 bits)
}
val freeCounter = CounterFreeRun(16)
io.freeCount := freeCounter.value
val gatedClk = ClockDomain.current.readClockWire 

原文地址:https://blog.csdn.net/m0_59092412/article/details/142381053

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!