Счетчик импульсов в 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
Вы должны объявить count и andpulse как регистры:
module clkgenerator( input clk, input reg [3:0] count = 4'b0, input enable, output reg andpulse );
Вы не должны включать 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;
Не уверен, что это сработает.