十二 · 2021年11月08日

时钟域“定制”

聊一聊在SpinalHDL里时钟域中时钟的定制与命名。

时钟定制

相较于Verilog,在SpinalHDL里,其对时钟域有着更细致的描述,从而也能够更精细的控制和描述。而对于时钟域,我们往往关系的是:

  • 时钟频率
  • 复位电平:是高电平还是低电平
  • 复位方式,是同步复位还是异步复位。

对于带有时序电路的逻辑而言,最常用的生成Verilog代码方式如下:

image.png

时钟域默认为异步高电平复位:

image.png

倘若要“定制”时钟域,那么往往采用下面的方式生成RTL代码:

image.png

这里在SpinalConfig里常用的用于“定制”时钟的有两个参数:

  • defaultConfigForClockDomains
  • defaultClockDomainFrequency

defaultConfigForClockDomains参数可指定时钟域的配置,ClockDomainConfig中可指定的参数包含:

  • clockEdge: 指定有效时钟沿(RISING、FALLING)
  • resetKind: 指定复位类型(ASYNC、SYNC)
  • resetActiveLevel: 指定复位类型( HIGH,LOW)
  • softResetActiveLevel:指定softReset类型( HIGH,LOW)
  • clockEnableActiveLevel: 指定时钟使能信号电平( HIGH,LOW)

上述代码最终生成的RTL为:

image.png

可以看到,复位信号变成了同步高电平复位形式。通过这种时钟域配置的方式,可以做到一键修改适配,从而避免一遍又一遍的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,而当牵涉到多人合作时,时钟与复位信号的命名往往需达成一致,通过下面的方式可以修改默认时钟域的信号命名:

image.png

对应的RTL:

image.png

更通用一些,也可以根据复位信号的特征来指定名称:

image.png

END

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/Gx59nfA1vS_kdMD6DLTSjg
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息