【问题标题】:How to get outputs/pulses when counter reaches two particular values?当计数器达到两个特定值时如何获得输出/脉冲?
【发布时间】:2021-07-12 18:01:26
【问题描述】:

我创建了一个最多计数为 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

这是输出波形。

【问题讨论】:

    标签: verilog system-verilog


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 2011-06-02
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2012-05-22
      相关资源
      最近更新 更多