2016-07-12 50 views
1

我想測量信號上升轉換和下降轉換的次數。我使用信號作爲時鐘並實現了2個計數器。一個計數器在每個上升沿遞增,另一個在每個下降沿遞增。我將這兩個計數器的結果相加以得到最終計數值。如何編寫可計算信號上升和下降的可綜合RTL

有沒有更好的方法來實現這個邏輯?什麼是最健壯的方法?

module clock_edge_counter (
clock_edge_count, // Output of the counter , 
clk  ,   // clock Input 
stop , 
reset 
); 

parameter CNTR_WIDTH = 16; 

input clk ; 
input stop ; 
input reset ; 

output [CNTR_WIDTH:0] clock_edge_count; 
wire [CNTR_WIDTH:0] clock_edge_count; 


reg [CNTR_WIDTH-1:0] clock_negedge_edge_count; 
reg [CNTR_WIDTH-1:0] clock_posedge_edge_count; 


always @(posedge clk or posedge reset) 
if (reset) begin 
    clock_posedge_edge_count <= 0; 
end 
else if (!stop) begin 
    clock_posedge_edge_count <= clock_posedge_edge_count + 1; 
end 

always @(negedge clk or posedge reset) 
if (reset) begin 
    clock_negedge_edge_count <= 0; 
end 
else if (!stop) begin 
    clock_negedge_edge_count <= clock_negedge_edge_count + 1; 
end 


assign clock_edge_count = clock_negedge_edge_count + clock_posedge_edge_count; 

endmodule 

回答

3

這個方法在理論上沒有錯,但使用信號作爲時鐘不是標準做法。這將邏輯引入到時鐘生成中,這對於物理設計或後端流程和工具來說很麻煩(不是不可能)。

[有與所述邏輯的至少一個額外的逆變器一起的輸入信號將帶來]在下面的鏈接

例如 - Proper way for signal edge detection in Verilog

如果信號是異步的,從外部模塊產生你可以同步它,然後使用邊緣檢測器邏輯。然後使用該輸出觸發計數。 https://www.doulos.com/knowhow/fpga/synchronisation/

如果有訪問時鐘,那麼最好是讓時鐘檢測信號的下降沿和上升沿,並用它來計數。 下面的示例代碼。

module clock_edge_counter (
clock_edge_count, // Output of the counter , 
clk  ,   // clock 
detect , // signal to be checked 
stop , 
reset 
); 

parameter CNTR_WIDTH = 16; 

input clk ; 
input detect; 
input stop ; 
input reset ; 

output [CNTR_WIDTH:0] clock_edge_count; 
reg [CNTR_WIDTH:0] clock_edge_count; 


reg     detect_d; 

always @(posedge clk or posedge reset) 
begin 
if (reset) 
    detect_d <= 0 ; 
    else 
    detect_d <= detect; // delay signal by one cycle 
end 

always @(posedge clk or posedge reset) 
if (reset) begin 
    clock_edge_count <= 0; 
end 
//      rising edge  or falling edge  (xor logic) 
else if (!stop && ((!detect && detect_d) || (detect && !detect_d))) 
    begin 
    clock_edge_count <= clock_edge_count + 1; 
end 

endmodule 

也在端使用的輸出(計數器)的將在一個同步塊中,所以它能夠更好地使用所產生的塊的時鐘在clock_edge_counter。

+0

感謝Rahul的解釋。 –

+1

歡迎您:) –