Счетчик импульсов в Verilog

Я пытаюсь построить импульс, который становится высоким для 8 импульсов часов и понижается для отдыха. Таким образом, при включении и высоком тактовом импульсе импульс становится высоким, тогда как после 8 импульсов тактовый импульс становится низким. Как я могу реализовать и подойти к этому в Verilog. Вот что я сделал до сих пор.

module clkgenerator(
  input clk,
  input [3:0] count = 4'b0,
  input enable,
  output andpulse
   );
  always@(posedge enable and posedge clk)
  begin
    andpulse <= 1;
      if(count == 4'b1000);
        andpulse <= 0;
        count <= 4'b0;
      else
        count <= count + 1;
      end 
  endmodule

Но это броски и ошибка

Ошибка: C:\altera\14.0\clkgenerator.v(3): рядом с "=": синтаксическая ошибка, неожиданный '=', ожидающий ')'

Нужна помощь.

2 ответа

Этот код генерирует ВЫСОКИЙ выход за 8 тактов, поскольку он обнаруживает положительный фронт enable (как кажется, что проблема спрашивает).

Как понятно из описания вашей проблемы, логики и попытки, вам не нужно count в качестве входа (вы не можете инициализировать свой вход, потому что они запускаются снаружи модуля). И, как сказал @Mortada, вы не должны ставить enable в списке чувствительности блока всегда, и лучше определить положительный край enable сигнал внутри всегда блокируется. Положительный край enable означает => предыдущее значение enable было 0, а теперь 1. Кроме того, вы должны использовать начальный блок для инициализации ваших регистров. Так что следующий код должен подойти:

module clkgenerator(
   input clk,
   input enable,
   output reg andpulse
); 

reg [3:0] count;
reg previous_enable; //stores previous value of enable (1 clock earlier) 
reg pulse_enable; //enables the pulse if positive edge of enable is detected
initial // this block is used to initialize the registers
begin
  count <= 4'b0000;
  andpulse <= 1'b0;
  pulse_enable <= 1'b0;
  previous_enable <= 1'b0;
end
always@(posedge clk)
begin
if(enable > previous_enable) //if enable > previous_enable it means positive edge was detected
     pulse_enable <= 1'b1; //makes if condition that generates the pulse True for 8 clock cycles
if(pulse_enable)
begin
  andpulse <= 1;
  if(count == 4'b1000)
  begin
    andpulse <= 0;
    count <= 4'b0;
    pulse_enable <= 1'b0;
  end
  else
    count <= count + 1;
end
else
  count <= 1'b0;

previous_enable <= enable; //to be used in next stage
end //end of always block
endmodule

//This code is error free
  1. Вы должны объявить count и andpulse как регистры:

    module clkgenerator(
       input clk,
       input reg [3:0] count = 4'b0,
       input enable,
       output reg andpulse
    ); 
    
  2. Вы не должны включать enable в списке чувствительности блока Always. Вместо этого поместите его в условие if:

    always@(posedge clk)
    if(enable)
    begin
      andpulse <= 1;
      if(count == 4'b1000)
      begin
        andpulse <= 0;
        count <= 4'b0;
      end
      else
        count <= count + 1;
      end
    endmodule
    

Попробуйте это: изменить

   module clkgenerator(
  input clk,
  input [3:0] count = 4'b0,
  input enable,
  output andpulse
   );

чтобы:

module clkgenerator(clk,count, enable, andpulse);
input clk, enable;
input [3:0] count = 4'b0000;
output andpulse;

Не уверен, что это сработает.

Другие вопросы по тегам