聊一聊在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 mswhen(timeout){ //Check if the timeout has tick timeout.clear() //Ask the timeout to clear its flag}》》时钟重命名
在当前的开发模式下,很难做到每个人都使用SpinalHDL,而当牵涉到多人合作时,时钟与复位信号的命名往往需达成一致,通过下面的方式可以修改默认时钟域的信号命名:
对应的RTL:
更通用一些,也可以根据复位信号的特征来指定名称:
原文标题:时钟域“定制”
文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !