#verilog #system-verilog
Вопрос:
Я создал счетчик, который считает до 30. У меня есть выходной сигнал out
. При двух конкретных подсчетах, т. Е. Когда счетчик достигает 10 ( first
) и когда счетчик достигает 15 ( second
), я хочу, чтобы выход стал низким. Каким-то образом мне здесь не хватает базовой логики, так как только при одном определенном счете (либо при 10, либо при 15) я могу сделать вывод нулевым.
Вот код
module user_def_pulse(
output integer counter,
output reg out,
input clk, reset
);
parameter no_of_counts = 30;
parameter first = 10;
parameter second = 15;
initial
begin
counter = 0;
out = 1'b0;
end
always @(posedge clk)
begin
if (reset)
begin
counter <= 1'b0;
end
else if (counter == no_of_counts)
begin
counter <= 1'b0;
out <= 1'b0;
end
else
begin
if ((counter == first) || (counter == second))
out <= 1'b0;
else
begin
counter <= counter 1;
out <= 1'b1;
$display($time," The value of counter is %d", counter);
end
end
end
endmodule
Вот испытательный стенд
module user_def_pulse_tb(
);
parameter time_period = 10;
wire [31:0] COUNTER;
wire OUT;
reg CLK, RESET;
user_def_pulse udp1 (.counter(COUNTER), .out(OUT), .clk(CLK), .reset(RESET));
initial
begin
CLK = 1'b0;
RESET = 1'b1;
#20 RESET = 1'b0;
end
always
#time_period CLK = ~CLK;
endmodule
Вот форма выходного сигнала.
Ответ №1:
Проблема с вашим кодом заключается в том, что он перестает увеличивать счетчик, как только он достигает first
значения. Вам нужно продолжать увеличивать счетчик. Я переместил приращение за пределы if ((counter == first) || ...
предложения.
always @(posedge clk) begin
if (reset) begin
counter <= 1'b0;
end else if (counter == no_of_counts) begin
counter <= 1'b0;
out <= 1'b0;
end else begin
counter <= counter 1;
$display($time," The value of counter is %d", counter);
if ((counter == first) || (counter == second)) begin
out <= 1'b0;
end else begin
out <= 1'b1;
end
end
end