2013-03-31 29 views
0

下面是代碼第一...門控時鐘產生

[email protected](posedge clk) 
begin 
if(cstate==idle) rclk<=1; 
else rclk<=0; 
end 

[email protected](negedge clk) 
rclk<=0; 

我想實現的是:在時鐘信號的上升沿每一次,如果信號cstate等於空閒(4'b0000 ),則rclk同時到達一個,否則爲零,每次clk的下降沿都會將rclk設置爲零。由於編譯器給出錯誤「rclk信號由多個驅動器驅動」,此代碼不可合成。

如何通過其他技術實現相同功能?

回答

1

它看起來像你想要一個時鐘門單元。基於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

+0

感謝您的幫助!我嘗試了組合方式,就像您發佈的組合方式沒有正常工作一樣。我猜想原因是由clk的EDGE觸發的rclk意味着它受到clk posedge之前的信號的影響。以一種組合的方式,你不會有這種效果。 – vitocarlos

+0

我按照以下方式修改了代碼:我將敏感列表從posedge clk更改爲clk,我認爲這將成爲組合電路。它在仿真中運行良好,但我想知道它是否可實現?謝謝你的時間! – vitocarlos

+0

always @ clk,實際上是一個組合電路,不會給你時鐘控制真正需要的干擾抑制。 – Morgan