目錄
4、SDIO/SMC/SPI/QSPI/UART Clock
在介紹完《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