这是这个系列桔里猫:RISCV AI SOC实战(一,概述及架构设计)的第二篇文章。会讲清楚SOC里面的时钟管理与时钟有关的方方面面,先讲讲时钟的基础知识,再讲本设计中时钟的工作原理。注意的是为了聚焦,本篇文章只讲与时钟本身有关的事儿,另一个非常热门的问题,跨时钟域信号如何处理往后将专门开文章讲。
一、SOC中常见的时钟基础知识
一般对于SOC来讲,可以无中生有产生时钟的时钟源有四个。很多SOC这四个时钟源都有,但实际设计的时候其实也可以灵活选择,不需要4个全有。总的来讲,晶振要比RC振荡器稳定和准确。晶振接在芯片外边,用PCB集成。RC直接接在芯片内部。
- HSE, 高速外部时钟。High Frequency Source external。这个一般会接晶振。一般在4~16MHz。
- HSI,高速内部时钟。这个是有RC振荡器产生的,频率一般8M左右,不是很稳定。
- LSE,低速外部时钟。这个也是要接外部晶振的,频率为32.768KHz。那你一定要问了,为什么是这么一串奇怪的数字。它是2的15次方。分频15次恰好是1HZ。1秒1次。用于RTC。
- LSI,低速内部时钟。这个也是RC振荡器产生的,也可以给RTC,时钟频率玄学的在40KHz左右。
除了上述四个无中生有的时钟,一般来讲需要跑>16MHz时钟的芯片里,还有一个用来倍频的玩意儿。为什么要用PLL呢?因为外部晶振常见的就16MHz以下。虽然我也在某宝买过200MHz的晶振,但一方面,价格非常贵,不适合产品控制成本,另一方面,这么快的时钟从片外输入不是很稳定。
- PLLCLK,高速的倍频时钟。PLL是做在芯片内部的一个模块,你不需要清楚内部原理,但是你需要知道它可以产生稳定的倍频时钟。例如一头接在16MHz的HSE上,PLLCLK就能获得32MHz, 64MHz等等高速时钟。
二、本设计中的时钟管理
时钟和时钟频率会极大影响功耗。由于我们是边缘端低功耗的芯片,故一共需要两个时钟域。本设计中的时钟域连接关系如下图。

主时钟域:计算核心组和数据外设组位于主时钟域。该时钟域在运行时速度较快,一般来讲运行于8M-100M之间。
常开时钟域:主要用于系统外设组。频率值是32.768KHz。
一共需要外接两个晶振,一个是16MHz的HSE, 另一个是32.768KHz的LSE。所有时钟均有CLKGEN模块来管理。
三、时钟管理CLKGEN模块设计
该时钟管理模块其实分为两部分的,用来产生高速时钟的HCLKGEN和用来产生低速时钟的LCLKGEN。

如上图所示,对于本设计来讲,没有放LSI时钟。只有其他四个时钟源HSE,LSE,PLL,HSI。这个模块其实内部也没有太多东西,主要就是多路选择器,用于选择对应的时钟。对于LCLK需要选择片内还是片外。对于HCLK需要选择HSE,PLL还是HSI。同时要为了更灵活的时钟配置,需要配置两个分频器,得到对应的时钟频率。
需要注意的点主要是以下几个
- 上电时一般来讲会先使用片内的HSI,因为起振更快。最后再切换到HSE,因为更稳定。
- 如果比较极致的做法是把HCLKGEN单独作为一个外设挂到主时钟域而不是像此处合成一个模块放在常开时钟域。
- IP级的power gating一般会做在IP内部,例如RISC-V和AI CORE内部,而不是做在这个系统级的CLKGEN里面。
总结
本文简单讲了SOC中常用的时钟以及时钟管理模块的简单设计。时钟是影响芯片功耗的一大重要因素,所以还是要按照实际情况精心设计。本设计采用的是比较粗暴简单的两个时钟域,因为应用场景决定了主时钟域其实可以很长时间power gating。实际比较精细的设计会存在多个时钟域,例如RISCV啊,AI核心啊总线都用单独的时钟。所以还需具体问题具体对待。但基本原理应该已经讲的差不多了。
















