1 CRG的SPEC參考
1.1 時鍾設計需求
(1)生成AHB時鍾,APB時鍾,RTC時鍾;(2)AHB最高時鍾頻率為98MHz;(3)APB時鍾為AHB同步時鍾,且可以配置AHB時鍾的1/2,1/4,1/8;(4)RTC時鍾單獨控制時鍾,時鍾頻率1KHz;(5)各外設時鍾可以單獨門控,滿足低功耗要求。
1.2 時鍾設計要點
(1)DFT可控,隔離,可觀測。(2)上電工作外部參考時鍾,PLL穩定后,時鍾自動切換。(3)低功耗要求,在系統不工作時,時鍾自動關閉。(4)各個外設時鍾均能門控。
1.3 時鍾設計電路
看上圖,首先進來的是8M時鍾,給PLL倍頻。OSC_OUT是OSC_IN取反得到的,這是外部時鍾要求的。經過無毛刺切換后,就產生sys_clk系統時鍾,然后進入一個分頻模塊;分頻之后的時鍾進入ICG,產生apb和ahb時鍾。這個ICG看做是一個buffer,對sys_clk做門控,時鍾路徑時鍾是sys_clk系統時鍾,注意這里出來是不是分頻時鍾,而是sys_clk出來的,分頻時鍾只是控制作用而已。
2 時鍾的無毛刺切換
2.1 毛刺的產生
兩個時鍾頻率可以彼此完全無關,或者它們可以是彼此的倍數。在任何一種情況下,都有可能在切換時在時鍾線上產生毛刺。時鍾線上的毛刺對整個系統是危險的,因為它可能被某些寄存器解釋為捕獲時鍾邊沿而被其他寄存器忽略。毛刺的處理分為兩種,當時鍾是彼此的倍數時是一種,完全無關的兩個時鍾處理又是一種。
2.2 倍數關系的時鍾毛刺解決方案
着一篇文章很值得參考!
其原理是,先gating住之前選擇的時鍾,然后再放開將要選擇的時鍾。下圖顯示了防止源時鍾相互倍數的時鍾開關輸出出現毛刺的解決方案。在每個時鍾源的選擇路徑中插入一個負邊沿觸發的D觸發器。
2.3 針對無關時鍾源的毛刺保護
先前避免時鍾開關輸出處的毛刺的方法需要兩個時鍾源彼此的倍數,在該實現中沒有處理異步信號的機制。當兩個時鍾源彼此完全無關時,異步行為的源可以是SELECT信號或從一個時鍾域到另一個時鍾域的反饋。同步器只是兩級觸發器,其中第一級通過鎖定數據來幫助穩定數據,這一級可以用上升沿,也可以用下降沿,用上升沿是為了節省時間然后將數據傳遞到下一級,后一級的DFF必須使用clock下降沿,因為是用AND門進行gating。
2.4 RTL代碼
module clk_sw( input wire clk_a, input wire clk_b, input wire rst_n, input wire sel, output wire clk_o ); reg clk_a_en ; reg clk_b_en ; always @(posedge clk_a or negedge rst_n) begin if(~rst_n) clk_a_en <= 1'b0 ; else clk_a_en <= ~sel & ~clk_b_en ; end always @(posedge clk_b or negedge rst_n) begin if(~rst_n) clk_b_en <= 1'b0 ; else clk_b_en <= sel & ~clk_a_en ; end assign clk_o = (clk_a & clk_a_en) | (clk_b & clk_b_en) ; endmodule