无法使用 verilog 生成多个脉冲输出?

Unable to generate multiple pulse outputs using verilog?

提问人:Deekshith Ranga Babu Tirumala 提问时间:11/15/2023 最后编辑:toolicDeekshith Ranga Babu Tirumala 更新时间:11/16/2023 访问量:106

问:

我正在尝试制作一个电路来产生不同脉冲的输出。输出脉冲在给定时间段内的给定值时间应具有高电平。信号需要在给定的重复输入次数内重复。我正在使用 intermedaite 变量计数器,并基于它更新输出。但是零脉冲被添加到每个周期的末尾。我是初学者。谁能说出我的方法中的错误或给我一个更好的方法代码。

module tb();
  wire pulse;
  reg clk,rst;
  reg [2:0] value;
  reg [2:0] period;
  reg [2:0] repeator;
  
  pulse_gen pg(clk,rst,value,period,repeator, pulse);
  initial begin
    $dumpfile("out.vcd");
    $dumpvars(1);
    clk=1;
    rst=1;
    #10;
    rst=0;value=3'b011;period=3'b011;repeator=3'b010;
    #180;
    $finish;
  end
  always 
    begin
      #10;
      clk=~clk;
    end
endmodule

设计.v

module pulse_gen(clk, rst, value, period, repeator, pulse);
  input clk, rst;
  input [2:0] value;
  input [2:0] period;
  input [2:0] repeator;
  output reg pulse;
  
  reg pulse_out;
  reg [2:0] value_temp;
  reg [2:0] period_temp;
  reg [2:0] repeator_temp;
  reg [2:0] counter;
  always @(value or period or repeator)
  begin
    value_temp<=value;
    period_temp<=period;
    repeator_temp<=repeator;
  end
  always @(posedge clk or rst)
    begin
      if(rst)
        begin
          counter<=3'b000;
          pulse_out<=0;
        end
      else
        begin
          if(repeator_temp>0)
            begin
              if(counter>period_temp)
                begin
                  counter<=3'b000;
                  repeator_temp<=repeator_temp-1;
                end
              if(value_temp>period_temp)
                begin
                pulse_out <= 0;
                end
              else
                begin
                  if(counter<value_temp)
                    begin
                    pulse_out <= 1;
                    end
                  else
                    begin
                      repeator_temp <= 3'b111;
                      
                    pulse_out <= 0;
                    end
                  
                  counter<=counter+3'b011;
                end
            end
          else
            begin
              
              pulse_out <= 0;
            end
        end
    end
  always @(pulse_out)begin
    pulse = pulse_out;
  end
endmodule

输出图:以上试验台的输出

预期输出在 6 个时钟周期内持续保持高电平。

信号 Verilog 计数器 数字

评论

0赞 Serge 11/15/2023
U 是 1 位宽(Reg 计数器)。因此,它只能在 0 和 1(也是 x 和 z)之间变化。您需要超过 1 位,即 reg[2:0] 计数器counter
0赞 Deekshith Ranga Babu Tirumala 11/16/2023
谢谢,它奏效了,但是,在信号末尾添加了未知零
0赞 Mikef 11/16/2023
我发现代码难以阅读,WRT 您尝试建模的行为,我认为您可以使用状态机以更易读且易于调试的风格来表达重复生成器的行为。有几个产生脉冲的状态,然后通过这些状态循环回一些次以创建多个脉冲序列。
0赞 Deekshith Ranga Babu Tirumala 11/16/2023
我是初学者,你能帮帮我吗?

答: 暂无答案