Как сгенерировать N счетчиков внутри блока генерации для нагрузочного тестирования ПЛИС?

# #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 выводом экземпляра 0
  • en экземпляр 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