聊一聊在SpinalHDL里时钟域中时钟的定制与命名。
时钟定制
相较于Verilog,在SpinalHDL里,其对时钟域有着更细致的描述,从而也能够更精细的控制和描述。而对于时钟域,我们往往关系的是:
- 时钟频率
- 复位电平:是高电平还是低电平
- 复位方式,是同步复位还是异步复位。
对于带有时序电路的逻辑而言,最常用的生成Verilog代码方式如下:
时钟域默认为异步高电平复位:
倘若要“定制”时钟域,那么往往采用下面的方式生成RTL代码:
这里在SpinalConfig里常用的用于“定制”时钟的有两个参数:
- defaultConfigForClockDomains
- defaultClockDomainFrequency
defaultConfigForClockDomains参数可指定时钟域的配置,ClockDomainConfig中可指定的参数包含:
- clockEdge: 指定有效时钟沿(RISING、FALLING)
- resetKind: 指定复位类型(ASYNC、SYNC)
- resetActiveLevel: 指定复位类型( HIGH,LOW)
- softResetActiveLevel:指定softReset类型( HIGH,LOW)
- clockEnableActiveLevel: 指定时钟使能信号电平( HIGH,LOW)
上述代码最终生成的RTL为:
可以看到,复位信号变成了同步高电平复位形式。通过这种时钟域配置的方式,可以做到一键修改适配,从而避免一遍又一遍的posedge、negedge啰嗦~,同时又避免自己在繁杂的Verilog代码里手误(真实遇到过别人代码里复位一会儿posedge、一会儿negedge、估计是写懵了)。
而defaultClockDomainFrequency则用于指定时钟频率,当你的代码里若调用类似这样的lib函数那么指定时钟频率就尤为重要了:
val timeout = Timeout(10 ms) //Timeout who tick after 10 ms
when(timeout){ //Check if the timeout has tick
timeout.clear() //Ask the timeout to clear its flag
}
时钟重命名
在当前的开发模式下,很难做到每个人都使用SpinalHDL,而当牵涉到多人合作时,时钟与复位信号的命名往往需达成一致,通过下面的方式可以修改默认时钟域的信号命名:
对应的RTL:
更通用一些,也可以根据复位信号的特征来指定名称:
END
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/Gx59nfA1vS_kdMD6DLTSjg
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。