Собственно задача измерение времени и частоты.
Нужно посчитать число импульсов высокой частоты проходящей во временные ворота.
Высокую частоту делаю в PLL.
Сделал пробный проект с таким счетчиком:
Код
module piezo_test (
input clk,
input clk_en,
input reset,
output [47:0]cntout
);
wire en_sync;
enable_sync enable_sync_inst
(
.enable_in (clk_en),
.clk (clk),
.reset (reset),
.enable_out (en_sync)
);
sync_counter_en #(2) sync_counter_en_inst
(
.clk (clk),
.reset (reset),
.enable_sync (en_sync),
.cnt (cntout[1:0])
);
sync_counter #(46) sync_counter_inst
(
.clk (cntout[1]),
.reset (reset),
.cnt (cntout[47:2])
);
endmodule
// enable synchronizer with counter and asynchronous RESET
module enable_sync
(
input enable_in,
input clk,
input reset,
output enable_out
);
reg [2:0] reclocker;
always @ (posedge clk, posedge reset)
begin
if (reset)
begin
reclocker <= 0;
end
else
begin
reclocker <= {reclocker[1], reclocker[0], enable_in};
end
end
assign enable_out = reclocker[2];
endmodule
// synchrous counter with synchrous enable
module sync_counter_en #(parameter WIDTH = 8)
(
input clk,
input reset,
input enable_sync,
output reg [WIDTH-1:0] cnt
);
always @ (posedge clk, posedge reset)
begin
if (reset)
cnt <= 0;
else if (enable_sync)
cnt <= cnt + 1'b1;
end
endmodule
// synchrous counter
module sync_counter #(parameter WIDTH = 8)
(
input clk,
input reset,
output reg [WIDTH-1:0] cnt
);
always @ (posedge clk, posedge reset)
begin
if (reset)
cnt <= 0;
else
cnt <= cnt + 1'b1;
end
endmodule
По порядку идут реклокер, делитель на 4, длинный счетчик. Разбивал на куски чтобы поднять частоту заполнения.
Констрейны сделал вот такие:
Код
create_clock -period 2.500 -name hifreq [get_ports {clk}]
create_generated_clock \
-divide_by 4 \
-source [get_ports {clk}] \
-name clkdiv \
[get_registers {sync_counter_en_inst|cnt[1]}]
TimeQuest показал почти 700МГц по входу и 150 для поделенной частоты.
Таких счетчиков мне надо 150 штук )
Когда я их размножил то таймквест выдал ограничение по частоте заполнения 160 МГц вместо 700 как было для одного счетчика. Частоту эту он положил конечно на глобальный клок но тем не менее.
Ограничение было по параметру Minimum Pulse Width.
Как я понимаю это связано с тем что он хочет довести клок синхронно до всех счетчиков, а даже у глобальной цепи есть свои задержки.
В результате дизайн был аккуратно слеплен могучей кучкой по центру плисины.
Вопросы:
1) Как объяснить квартусу что мне не нужна синхронизация всех счетчиков вместе? А надо только чтобы регистры каждого счетчика получали свои клоки синхронно (т.е. были расположены рядом), а их задержки относительно друг друга мне неинтересны.
2) Где прочитать подробное толкование всех времянок рассчитываемых TimeQuest-ом? С временными диаграммами и подробным описанием.
Спасибо!