ZYNQ 時鐘子系統

目錄

1、System Clock Diagram

2、CPU Clock

3、DDR Clock

4、SDIO/SMC/SPI/QSPI/UART Clock

5、USB/Etherent/CAN Clock

6、GPIO/I2C Clock

7、PL Clock

7、Clock Control Registers


 

在介紹完《ZYNQ 啓動分析》和《ZYNQ 復位子系統》後,我認爲需要對 ZYNQ 的時鐘樹進行了解,ZYNQ 時鐘的來源,以及 PLLs,Clock Gating,等,這樣一方面能夠直觀的知道並控制 CPU 時鐘頻率,對 Power 控制能夠起到指導作用,同時能夠更好的對系統進行認識並優化,而且在對外設編程的時候,時鐘分頻也一定需要配置,所以需要了解整個時鐘;(先別急着寫代碼,系統每個模塊跑多少 HZ 都不清除,這合適麼,哈哈....)

 

1、System Clock Diagram

時鐘樹框架如下所示:

A、看到最左邊外部晶振輸入 PS_CLK,直接作用到 3 個內部 PLLs:ARM PLL、I/O PLL、DDR PLL;

B、左下根據鎖存到的 boot strap pin 來判斷,在啓動過程是否需要 Bypass PLL(注意:這裏是否 Bypass 只有 1 bit,也就是說,啓動階段的 Bypass,要 Bypass,就會同時 Bypass 這 3 個 PLLs,要麼都啓用。但是在啓動完成後,通過配置 ARM_PLL_CTRL、DDR_PLL_CTRL、IO_PLL_CTRL 寄存器,可以單獨控制 Bypass 3 個 PLL 中的哪一個或哪幾個,);

C、時鐘經過 PLL 後,直到 PLL Lock 信號後,輸出到後級的 MUX 選擇器,上面這個 MUX 選擇器選擇哪一路時鐘作爲系統 CPU 的時鐘域,下面這個 MUX 選擇哪個 PLL 出來的時鐘作用到後級外設部分;

D、每一路時鐘都接 6-bit 可編程的分頻器,按照具體的需要進行時鐘分頻,分別直接供給 CPU Clock Domain,DDR Clock Domain,Peropherals Clock Domain 和 PL 端

E、當然,每一路都有 Clock Gating,門控時鐘,來按照需要進行時鐘的開啓或者關閉的控制,以按需配置達到功耗的最佳;

系統級的時鐘相互框架如下所示:

可以看到細分了 CPU Clock domain,DDR Clock,FPGA

 

2、CPU Clock

ZYNQ 中 CPU Clock 信號確定如下所示,CPU 時鐘域中,根據使用地方不同,存在 4 個時鐘:

CPU_1x

CPU_2x

CPU_3x2x

CPU_6x4x

注意,這幾路時鐘的頻率不同,但是還是屬於同一個時鐘域,也就是同步的;

現在我們要來解釋一下 CPU_1x、CPU_2x、CPU_3x2x、以及 CPU_6x4x 的含義;

CPU 時鐘域提供了兩種可選的時鐘模式:

6:2:1

4:2:1

這是什麼意思呢?上一個圖就知道了:

看到了吧:

在 6:2:1 模式下如果 CPU_1x 爲 133MHz,那麼 CPU_2x 爲它的 2 倍,即 266MHz,CPU_3x2x 爲 133MHz 的 3 倍,即 399MHz(≈400MHz),CPU_6x4x 是 133MHz 的 6 倍,即 798MHz(≈800MHz)

在 4:2:1 模式下如果 CPU_1x 爲 150MHz,那麼 CPU_2x 爲它的 2 倍,即 300MHz,CPU_3x2x 爲 150MHz 的 2 倍,即 300MHz,CPU_6x4x 是 133MHz 的 4 倍,即 600 MHz

而且每一路的時鐘作用域也寫清楚了,最高頻率時鐘 CPU_6x4x 作用到 CPU 的主頻,SCU 單元(Cache 一致性)等;CPU_3x2x 時鐘用於 APU 的 Timers;CPU_2x 用於外設,中央互聯單元時鐘等;CPU_1x 用於外設 AHB 和 APB 接口總線;

現在回到 CPU Clock 的第一個圖:

1、最左邊的 3 個 PLLs 經過兩個 MUX 選擇器,輸出到後級,這個選擇器的輸出由系統控制寄存器(System Level Control Registers 即 slcr 寄存器組)的 ARM_CLK_CTRL 寄存器的 bit 4 和 bit 5 決定(slcr.ARM_CLK_CTRL[SRCSEL]);

2、PLL 後的時鐘進入 6-bit 的分頻器,即 ARM_CLK_CTRL 的 bit[13:8] 來確定時鐘分頻(slcr.ARM_CLK_CTRL[DIVSOR]);

3、分頻器的輸出作用到 Clock Ratio Generator 模塊,這個模塊的輸入最上面有個 CLK_621_TRUE[0],CLK_621_TRUE[0] 如果配置爲 0,那麼使用的是 4:2:1 的模式,如果爲 1,那麼是 6:2:1

4、Clock Ratio Generator 模塊的 4 路輸出分別接了 4 個與門,用來做 Clock Gate,也就是門控時鐘,可以通過 ARM_CLK_CTRL 的 bit  [24],bit  [25],bit  [26],bit  [27] 分別控制是否使能對應的時鐘輸出;

這裏官方給出了一個注意:

爲了改善 CPU/DDR 的高頻時鐘的質量,在 slcr.ARM_CLK_CTRL[DIVSOR] 分頻係數最好使用偶數

所有的 CPU Clock domain 的時鐘,都是同步的;

AMBA Bus 的時鐘來源如下所示,都是 CPU 域的,也就是 CPU 通過 AMBA Bus 訪問外設的寄存器的時鐘,如果要使用該外設的話,需要開啓對應的 AMBA Bus 的時鐘;可以看到,他們可以單獨控制開啓或者關閉;

系統範圍的時鐘配置示例如下,兩個例子,一個是外部輸入 33.33MHz 另一個是外部輸入 50MHz,使用的 6:2:1的配比模式:

這張表中,假定了各個 PLL 的倍頻係數:

第一個裏面假定倍頻係數爲 ARM_PLL=40、DDR PLL=32、I/O PLL=30;

第一個裏面假定倍頻係數爲 ARM_PLL=20、DDR PLL=16、I/O PLL=20;

其實呢,這些個 PLL 的倍頻係數是可以配置的,在 slcr.ARM_PLL_CTRL[PLL_FDIV]、slcr.DDR_PLL_CTRL[PLL_FDIV]、slcr.IO_PLL_CTRL[PLL_FDIV] 寄存器進行配置;

 

3、DDR Clock

DDR 的時鐘如下所示,由 DDR 的 PLL 倍頻而來,經過兩個可配置的 6-bits 寄存器來進行分頻,在輸出到 Clock Gate 門控來控制 DDR_2x 和 DDR_3x 是否輸出;

 

4、SDIO/SMC/SPI/QSPI/UART Clock

典型的 SDIO/SMC/SPI/QSPI/UART 外設部分的時鐘如下所示:

上面的一個圖適用 SDIO/SMC/SPI/QSPI/UART 這幾個外設,不過是不同的外設,配置的 SRCSEL 寄存器、分頻寄存器不一樣;

 

5、USB/Etherent/CAN Clock

他們都有自己的時鐘電路,詳細參考 UG585

 

6、GPIO/I2C Clock

輸入時鐘域爲 CPU_x1 更多的細節參考 UG585 中對應模塊的設計圖;

 

7、PL Clock

PL 端可以接受來自 PS 端的 4 路時鐘輸入,這 4 路時鐘相互異步,下面是它的配置圖;

每一路時鐘通過選擇時鐘源和分頻係數,最後得到獨立的 4 路時鐘:

FCLK 0

FCLK 1

FCLK 2

FCLK 3

 

 

7、Clock Control Registers

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章