它看起來像你想要一個時鐘門單元。基於1個週期寬的使能信號,產生一個與輸入時鐘具有相同高時間的時鐘脈衝。
這樣做的一個簡單的方式可能是:
assign rclk = (cstate==idle) ? clk : 1'b0 ;
這很容易被合成assign rclk = (cstate==idle) & clk ;
cstate == idle
將會毛刺這就是爲什麼它通常會通過觸發器允許的答案被使用在使用前解決。
使用時鐘門單元可以阻止您在(rclk)時鐘線上創建毛刺。爲此,在rtl中實例化你的庫時鐘門單元是很常見的。在RTL它可能是類似於:
reg result;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
result <= 1'b0;
end
else begin
result <= (cstate == idle);
end
end
assign rclk = (result) ? clk : 1'b0 ;
這意味着結果將是每個時鐘週期穩定,不從比較允許通過的毛刺。
壓縮擴大答案
我又包括以下波形我的榜樣,我更換了一個簡單的計數器溢出其重置本身的狀態比較。不是比較匹配2'b10;這意味着時鐘出現在下面的計數上(2'b11)。如果時鐘完全出現在你的比較匹配的相同時間內,那麼你的時鐘沒有毛刺抑制,並且可能會產生不可靠的硬件。
reg [1:0] counter = 0;
always @(posedge clk)
counter <= counter+1;
reg result;
wire result_a = (counter == 2'b10);
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
result <= 1'b0;
end
else begin
result <= result_a;
end
end
assign rclk = (result) ? clk : 1'b0 ;
![Example waveform of Clock Gate](https://i.stack.imgur.com/AAIuS.png)
感謝您的幫助!我嘗試了組合方式,就像您發佈的組合方式沒有正常工作一樣。我猜想原因是由clk的EDGE觸發的rclk意味着它受到clk posedge之前的信號的影響。以一種組合的方式,你不會有這種效果。 – vitocarlos
我按照以下方式修改了代碼:我將敏感列表從posedge clk更改爲clk,我認爲這將成爲組合電路。它在仿真中運行良好,但我想知道它是否可實現?謝謝你的時間! – vitocarlos
always @ clk,實際上是一個組合電路,不會給你時鐘控制真正需要的干擾抑制。 – Morgan