Неожиданное поведение реализации счетчика Verilog

Счетчик сделал на верилоге и реализовал аппаратно. Но я не могу объяснить поведение Код:

module clock_test(clk_in,led,rst);
input wire clk_in;
input wire rst;
output wire [7:0] led;

reg [23:0] counter = 24'b0;

assign led = counter[23:16];

always @(posedge clk_int)  begin
    if(rst) begin
     counter <= 0;
  end
else begin
     counter <= counter +1;
   end
 end
 endmodule // clock_test

Аппаратно, когда я нажимаю rst, светодиоды останавливаются в момент подсчета. Он не становится точно нулевым. Подтвердите rst, и вы увидите какой-то случайный шаблон, отличный от нуля, который не изменится, пока я не отпущу rst.

Мой вопрос: когда блок if(rst) begin выполняется, counter устанавливается в 0. Поскольку светодиоды назначаются как комбинированная логика из counter, разве это не должно отражаться немедленно?


person Jay Aurabind    schedule 21.01.2013    source источник
comment
Счетчик работает правильно, когда rst низкий? Часы на всегда блоке неверны. Должно быть clk_in, а не clk_int.   -  person Greg    schedule 22.01.2013
comment
Да, это была опечатка, и я действительно заставил ее работать, и меня беспокоит поведение аппаратного обеспечения :)   -  person Jay Aurabind    schedule 22.01.2013


Ответы (2)


Поскольку у вас есть синхронный сброс, значение сброса не вступит в силу до следующего фронта тактового сигнала после подтверждения сброса.

Когда вы утверждаете сброс, это также останавливает часы? Это кажется наиболее вероятной причиной, поскольку в противном случае ваш код выглядит правильно (за исключением синтаксической ошибки, отмеченной Грегом).

person Brian Magnuson    schedule 21.01.2013

Похоже, что clk опечатан, и это был сброс синхронизации, а не асинхронный.

Попробуй это :

module clock_test(
  input        clk_in,
  input        rst,
  output [7:0] led
);

reg [23:0] counter;

assign led = counter[23:16];

always @(posedge clk_in or posedge rst)  begin
  if(rst) begin
    counter <= 0;
  end
  else begin
    counter <= counter +1;
  end
 end
 endmodule // clock_test

NB: вы используете активный высокий сброс (1 означает сброс). Если вы на самом деле используете активный низкий уровень (0 применяет сброс), вам необходимо изменить следующее:

always @(posedge clk_in or negedge rst)  begin
  if(~rst) begin
    counter <= 0;
person Morgan    schedule 22.01.2013
comment
Сделать это асинхронным удалось! Большое спасибо @Munkymorgy и @BrianMagnuson, все ваши предположения были верны. Конструкция фактически остановила clk из экземпляра плитки управления цифровыми часами DCM_SP (специфично для Xilinx FPGA), потому что rst также был подключен к входу сброса DCM_SP! На самом деле я вырезал из него некоторый код Xilinx FPGA. Вот полная версия: pastebin.com/NZXcEyxj Еще раз всем спасибо! :) - person Jay Aurabind; 22.01.2013
comment
Нет проблем, Джей, поскольку вы новичок в StackOverflow, могу ли я предложить, что если у вас есть правильный ответ, вы должны его принять. Могу ли я предложить Брайана Магнусонса, поскольку он был первым. голосование за другое будет с радостью принято. - person Morgan; 22.01.2013