2016-07-12 17 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

Спасибо за объяснение Рахул. –

+1

приветствуется :) –