数字IC学习笔记(二)
宏定义,异步FIFO, 时钟来源,复位信号
1. `define宏定义的使用
- 宏定义的使用:
`define AAA = 1
assign a = b + `AAA
- 宏定义的用法和parameter参数相同,但
宏定义可以统一写到一个参数文件里
,`include进行调用;
`include "abc.v"
宏定义也可以通过判断编译时参数的选择,根据不同的配置来选择使用对应的宏定义
;(例如VERSION1,VERSION2,VERSION3,VERSION4)
`ifdef VERSION1
使用版本1的定义
`elsif VERSION2
使用版本2的定义
`else VERSION3
使用版本3的定义
`end
`ifndef VERSION4
如果编译时没有定义参数VERSION4
·undef AAA
取消对AAA的宏定义
2,异步FIFO原理
代码的读写地址,可以理解为FIFO读写的次数
always(posedge clk_r or negedge rst_n_r)
if(!rst_n_r)begin
addr_w_1d <= 'd0;
addr_w_2d <= 'd0;
end
else begin
addr_w_1d <= addr_w; //addr_w是由fifo写操作时钟域clk_w 产生
addr_w_2d <= addr_w_1d ; //打2拍消除亚稳态
end
assign fifo_empty = addr_w_2d == addr_r;
- 由于写地址addr_w,要经过读操作时钟clk_r打2拍后才能传输到addr_w_2d,所以存在明明FIFO里当前还有数据,但addr_w_2d未及时更新,因此判断FIFO为空;这种情况成为
虚空
.
always(posedge clk_w or negedge rst_n_w)
if(!rst_n_w)begin
addr_r_1d <= 'd0;
addr_r_2d <= 'd0;
end
else begin
addr_r_1d <= addr_r; //addr_r是由fifo读操作时钟域clk_r 产生
addr_r_2d <= addr_r_1d ; //打2拍消除亚稳态
end
assign fifo_full = (addr_w_2d - addr_r) == FIFO_DEEP; //FIFO_DEEP为FIFO深度
- 同理,由于读地址addr_r,要经过写操作时钟clk_w打2拍后才能传输到addr_r_2d,所以存在明明FIFO里还没满,但addr_r_2d未及时更新,因此判断FIFO为满;这种情况成为
虚满
.
虚满和虚空会导致异步FIFO提前拉起empty或full信号,但却保证异步FIFO不会丢失数据
3,时钟来源
- 3.1 振荡器(RC Osillator,RCO)
-
- 由电阻和电容组成,通电后产生时钟信号;
-
- 集成在芯片内部,
成本较低,精度较差
;
- 集成在芯片内部,
- 3.2 晶体/晶振
-
- 元器件, 通电后产生时钟信号;
-
- 集成在芯片外部,
成本较高,误差较小
;
- 集成在芯片外部,
- 3.3 锁相环(Phase Locked Loop,PLL)
-
- 需要输出低频的参考时钟,生成输出
高频
时钟
- 需要输出低频的参考时钟,生成输出
-
- 输入时钟一般由晶体/晶振或RCO电路提供
4,复位
从通电到时钟信号逐步稳定,这段时间内芯片不合适工作,因此需要由复位信号将电路复位住;
复位信号(Power On Reset,POR)通常上电时产生,逐渐拉高,升至高电平(1)后,表示时钟信号稳定,可以开始工作了;
异步复位:随时可以拉低复位信号进行复位
同步释放:拉高复位信号时,拉高的操作同步到当前时钟,防止出现亚稳态。
类似于建立时间和保持时间,复位信号的拉高也有要求。 时钟clock上升沿后的时间 t 1 t_1 t1后拉高,复位信号的上升沿和下一个时钟上升沿的间隔为 t 2 t_2 t2;要求 t 1 t_1 t1必须大于
recovery time
(恢复时间); 要求 t 2 t_2 t2必须大于removal time
(撤销时间);
recovery time:恢复时间。撤销复位时,恢复到非复位状态的电平必须在时钟有效沿到来之前的一段时间到来,才能保证时钟能有效恢复到非复位状态,此段时间为recovery time【1】。
removal time :撤销时间。撤销复位时,在时钟有效沿到来之后复位信号还需要保持的时间为撤销时间removal time【1】。
参考资料
【1】《数字IC设计入门》白栎旸
【2】静态时序分析之恢复时间recovery time和撤销时间removal time