文章目录
CRG模块
CRG是芯片里的时钟和复位生成模块,全称是 Clock Reset Generator 。CRG模块提供整个系统所需要的时钟和复位信号。本文主要介绍一下CRG时钟系统和复位系统的基本模块和概念。
CRG时钟系统
CRG的时钟部分一般都包括时钟源、锁相环(PLL )、时钟分频、片上时钟控制器(OCC )、时钟门控(ICG)、时钟切换、时钟buffer等电路结构。
-
时钟源 一般来自外部的晶振。常见的外部晶振有32.768KHz时钟和24MHz时钟(这个频率可变)。32.768KHz时钟一般提供给RTC模块等,用于产生系统时钟、时间戳等。24MHz时钟一般用做PLL的参考时钟。
-
锁相环(PLL) 基于晶振提供的基准时钟,生成稳定的高频时钟。
-
时钟分频 (Divider) 将锁相环输出的高频时钟进行分频,从而满足不同模块的时钟需求。
-
片上时钟控制器(OCC,On--chip Clock Controller) OCC是插在SoC上的逻辑电路,用来做DFT测试。在自动测试机台上对芯片进行全速测试时,根据scan信号控制选通ATE时钟或芯片内部时钟。
-
时钟门控(ICG,Integrated Clock Gating) ICG通常是用于控制打开和关闭时钟,从而降低功耗。一般模块级的ICG是手动加,寄存器级别的ICG是综合工具自动加。
-
时钟切换 一般分为clk mux和clk switch。
clk mux是组合逻辑 ,用于静态切换,动态切换的话会出现 glitch ,如下图所示。
clk switch,时序逻辑 ,可用于动态切换。在两个电平相反的时候切换时钟,肯定有毛刺;电平相同的时候,即使不产生毛刺,时钟切换后的第一个时钟的周期或占空比也不是理想的。所以为避免毛刺的产生,需要在两个时钟都为低电平时进行切换。一种典型的无毛刺时钟切换电路如下所示。
该电路利用时钟下降沿对时钟选择信号 sel_clk 进行缓存。同时一个时钟选择信号对另一个时钟进行反馈控制,保证同一时刻只能有一路时钟有效。最后采用或操作将两路时钟合并,完成时钟切换的过程。
- 时钟buffer 增强时钟信号的驱动能力。
CRG复位系统
在芯片设计中,复位逻辑是一个很重要的部分。复位是让芯片进入一个能稳定操作且确定的初始状态,从而避免芯片在上电后进行某个随机的状态而死机,或者是运行过程中出现了问题,能通过看门狗等方式产生复位而恢复初始状态。
芯片中的复位源一般分为 片外reset 源和 片内 reset源。
片外的reset源一般有来自PMIC的power reset,来自系统板上的pad reset,jtag reset等。片内的reset源有watchdog timeout reset,software reset及其他硬件机制产生的reset等。一个模块的reset可能由几种或者全部reset源控制。
复位的类型包括同步复位、异步复位、异步复位同步释放。
同步复位
同步复位是指复位信号只有在时钟有效沿到来时,才能有效。同步复位的verilog代码如下:
cpp
always @(posedge clk) begin
if (!rst_n) begin
out <= 1'b0;
end
else if (load) begin
out <= in;
end
end
其综合得到的电路如下 :
同步复位的优点
-
同步复位一般能确保电路是100%同步的,有利于时序分析,综合出来的最高频率一般较高;
-
同步复位会综合成更小的触发器,特别在该复位信号被触发器的输入逻辑门控时;
-
同步复位确保复位只发生在有效时钟沿。时钟可以作为过滤掉复位毛刺的手段;
在一些设计中,复位必须由一组内部条件产生。推荐在这样的设计中使用同步复位信号,这样可以将时钟之间的复位毛刺过滤掉。
同步复位的缺点
大多数逻辑器件库中的DFF只有异步复位端口,所以使用同步复位,综合器会在寄存器的数据输入端插入组合逻辑,一是会耗费组合逻辑资源,二是综合器无法分辨复位信号和其他数据信号,需要判断综合出的复位信号是否满足设计需求。
复位信号的有效时间必须大于时钟周期,才能保证被可靠地识别,完成复位。所以有时需要脉冲展宽器,以保证复位信号能出现再时钟有效沿处。
门控时钟电路情况:同步复位需要时钟来复位电路。在使用门控时钟时可能出现问题。在复位信号发出时,时钟可能关闭,在这种情况下只能使用异步复位,并在时钟恢复前移除复位信号。
异步复位
异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。使用异步复位的触发器在设计时就加入了一个独立的复位引脚,通过有效的复位信号即可将触发器进入复位初始状态。
下面是带有异步复位信号的触发器的verilog代码:
c
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
out <= 1'b0;
end
else if (load) begin
out <= in;
end
end
上述代码所综合出的电路结构如下:
异步复位的优点
-
异步复位最大的优点是不增加数据路径的延迟,保证数据路径上是干净的,这对于时序很紧张的数据路径来说非常友好。
-
大多数器件库的DFF都有异步复位端口,采用异步复位可以节省逻辑资源。
-
最明显的优势是有没有时钟都可以复位,在芯片上电或者门控时钟也能正常复位触发器。
异步复位的缺点
-
在复位信号释放的时候可能会出现亚稳态问题:复位释放在时钟有效沿附近;
-
容易受到毛刺的影响
异步复位同步释放
与数据信号需要满足的建立时间和保持时间类似,复位信号也需要满足恢复时间(recovery time)和撤销时间(removal time):
-
恢复时间:指的是异步复位被设置为无效后,在下一个时钟有效沿到来之前需要保持稳定的最短时间。类似于同步电路中的setup time。
-
撤销时间:指在时钟有效沿来临之后,异步复位信号需要继续保持有效的最短时间。类似于同步电路中的hold time。
如果不满足异步复位信号的恢复时间和撤销时间,那么可能产生亚稳态。因此需要在异步复位信号释放时对其进行同步(异步复位同步释放),即使用复位同步器,结构如下图所示:
verilog代码如下:
csharp
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rst_dff1 <= 1'b0;
rst_dff2 <= 1'b0;
end else begin
rst_dff1 <= 1'b1;
rst_dff2 <= rst_dff1;
end
end
assign masterrst_n = rst_dff2;
首先,当异步复位信号有效时,两个触发器都会被复位为0值,进而驱动主复位信号masterrst_n通过复位缓冲树,再到达设计中的其他触发器,然后整个设计都异步复位(即所谓"异步复位")。
当复位信号被置为无效时,第一个复位寄存器将在时钟的控制下被置为1,随后下一个周期,第二个复位寄存器也会被置为1,最终花费了两个时钟有效沿移除了主复位信号,进而整个设计开始正常工作(即所谓"同步释放")。
上述两个过程合起来称为异步复位同步释放。
如有侵权,请联系删除