時鐘使能電路是同步設計的重要基本電路,在很多設計中,雖然內部不同模塊的處理速度不同,但是由于這些時鐘是同源的,可以將它們轉化為單一的時鐘電路處理。在FPGA的設計中,分頻時鐘和源時鐘的skew不容易控制,難以保證分頻時鐘和源時鐘同相。故此推薦采用使用時鐘使能的方法,通過使用時鐘使能可以避免時鐘“滿天飛”的情況,進而避免了不必要的亞穩態發生,在降低設計復雜度的同時也提高了設計的可靠性。
我們可以利用帶有使能端的D觸發器來實現時鐘使能的功能。
在上圖中clk1x是CLK的四分頻后產生的時鐘,clk1x_en是與clk1x同頻的時鐘使能信號,用clk1x_en作為DFF的使能端,D端的數據只有在clk1x_en有效地時候才能打入D觸發器,從而在不引入新時鐘的前提,完成了下圖電路一致的邏輯功能。
在某系統中,前級數據輸入位寬為8,而后級的數據輸出位寬32,我們需要將8bit的數據轉換成32bit的數據,因此后級處理的時鐘頻率為前級的1/4,若不使用時鐘時能,則就要將前級時鐘進行4分頻來作為后級處理的時鐘,這種設計方法會引入新的時鐘域,為了避免這種情況,我們采用了時鐘時能的方法來減少設計的復雜度。
module gray ( input clk, input rst_n, input [7:0] data_in, output reg [31:0] data_out, output reg clk1x_en ); reg [1:0] cnt; reg [31:0] shift_reg; always @ (posedge clk,negedge rst_n) begin if(!rst_n) cnt <= 2'b0; else cnt <= cnt +1'b1; end always @ (posedge clk,negedge rst_n) begin if(!rst_n) clk1x_en <= 1'b0; else if(cnt ==2'b01) clk1x_en <= 1'b1; else clk1x_en <= 1'b0; end always @ (posedge clk,negedge rst_n) begin if(!rst_n) shift_reg <= 32'b0; else shift_reg <= {shift_reg[23:0],data_in}; end always @ (posedge clk,negedge rst_n) begin if(!rst_n) data_out<= 32'b0; else if(clk1x_en==1'b1)//僅在clk1x_en為1時才將shift_reg的值賦給data_out data_out<=shift_reg; end endmodule
編輯:hfy
-
FPGA
+關注
關注
1626文章
21665瀏覽量
601828 -
D觸發器
+關注
關注
3文章
164瀏覽量
47862 -
時鐘電路
+關注
關注
10文章
236瀏覽量
50696
發布評論請先 登錄
相關推薦
評論