# #verilog #counter #xilinx #quartus #intel-fpga
Вопрос:
Мне нужно оценить максимальное количество 16-разрядных счетчиков, которые может вместить плата FPGA. Я создал 16-разрядный модуль счетчика с enable ( en
) и terminal count ( TC
) и создал его внутри generate
блока в модуле верхнего уровня. Однако мне нужно сгенерировать эти счетчики в цепочке, где TC
вывод одного из них действует как разрешение для следующего счетчика в цепочке. Я не могу понять логику этого. Кто-нибудь может мне помочь ?
16-разрядный код счетчика:
module counter_16 (clk, Q, TC, en); input clk, en; output [15:0] Q; output TC; wire clk, en; reg [15:0] Q = 0; //initial value for the output count reg TC; always @(posedge clk) begin if(en == 1) begin Q lt;= Q 1; end TC = amp;Q; //TC is 1 when all bits of Q is high end endmodule
Модуль формирования счетчика:
module counter_generator #( parameter n = 10 ) (output [15:0] cnt_out, output TC, input clk, en); wire [n-1:0] temp_en; temp_en[0] lt;= 0; wire [15:0] temp_out; generate genvar i; for(i=1;ilt;=n;i=i 1) begin : counter_identifier counter_16 counter_16_gen ( .clk(clk), .Q(temp_out), .TC(temp_en[i-1]), .en(en)); end endgenerate endmodule
Ответ №1:
Первое, что нужно сделать, это начать цикл с 0, а не с 1, чтобы индексы сигналов выровнялись.
Создайте сигнал tc_out
n
шириной в биты и подключите его непосредственно к TC
порту в блоке генерации, используя индекс [i]
. TC
к примеру, 0 подключен tc_out[0]
и т. Д. Это просто, и это помогает нам с en
подключениями.
Создайте сигнал temp_en
, который также n
имеет ширину в битах, и подключите его непосредственно к en
порту в блоке генерации. Ключ состоит в том, чтобы назначить этот сигнал tc_out
сигналу, как показано ниже.
en
экземпляра 0 управляетсяen
вводомcounter_generator
en
экземпляр 1 управляетсяTC
выводом экземпляра 0en
экземпляр 2 управляетсяTC
выводом экземпляра 1- и т.д.
Наконец, создайте массив n
16-разрядных проводов temp_out
и подключите его непосредственно к Q
порту в блоке генерации.
module counter_generator #( parameter n = 10 ) ( output [15:0] cnt_out, output TC, input clk, en ); wire [n-1:0] tc_out; wire [n-1:0] temp_en = {tc_out[n-2:0], en}; wire [15:0] temp_out [n]; assign TC = temp_out[n-1]; generate genvar i; for (i=0; ilt;n; i=i 1) begin : counter_identifier counter_16 counter_16_gen ( .clk (clk), .Q (temp_out[i]), .TC (tc_out [i]), .en (temp_en [i]) ); end endgenerate endmodule