Как получить выходы/импульсы, когда счетчик достигает двух определенных значений?

#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