2016-07-12 6 views
1

信号の立ち上がり遷移と立ち下がり遷移の回数を測定したい。私はクロックとして信号を使用しており、2つのカウンタを実装しています。 1つのカウンタはすべての立ち上がりエッジでインクリメントし、もう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/

クロックにアクセスできる場合は、クロックの立ち下がりエッジを検出してカウントする方がよいでしょう。 以下のコード例。 clock_edge_counterで得られたブロックのクロックを使用するために、その良好に

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 

は、エンドの出力(カウンタ)の使用は、同期ブロックであろう。

+0

説明Rahulに感謝します。 –

+1

あなたは歓迎です:) –

関連する問題