如何在附加的Verilog-HDL代码中重置此D型计数器

时间:2016-02-28 13:27:47

标签: verilog

我试图创建一个d型计数器,当q0 = 0,q1 = 0且q2 = 1时复位。

当计数器达到此值但未重置时,我可以使值ADM触发吗?任何帮助表示感谢!

   // DEFINING D TYPE FLIP FLOP
  module D_FF(q,qb,d,clk,rst,pst);// pst or preset sets output q to 0(when pst=1)
                                 // rst resets to 1 takes priority 

 output q,qb;
 input d,clk,rst,pst;
 reg q;
 assign qb = ~q;
 always @ (posedge clk or negedge rst or negedge pst)
   case ({rst,pst })
     2'b00: q <= d;
     2'b01: q <= 0;
     2'b10: q <= 1;
     2'b11: q <= d;
   endcase
endmodule

下面的代码包含一个注释掉的重置分配我不明白为什么它不起作用:/。     ////////////////计数器代码///////////////////////////

module BIT_COUNTER(clk,reset,pst,q0,q1,q2,ADM);

wire d1,d2,d3;

input clk,reset,pst;
output q0,q1,q2,ADM;

D_FF dt0(q0,d1,d1,clk,reset,pst);

D_FF dt1(q1,d2,d2,d1,reset,pst);

D_FF dt3(q2,d3,d3,d2,reset,pst);


assign ADM = ( (q0 == 0) & (q1 == 0) & (q2 == 1));

// WHY CANT I RESET HERE USING ASSIGN ?
//assign reset = ( (q0 == 0) & (q1 == 0) & (q2 == 1));




endmodule

我使用测试平台对其进行了模拟,ADM将触发但不会重置

// Test Bench design to test the circuit under simulation..
module test;

reg clk,reset,pst; 


 BIT_COUNTER counter(clk,reset,pst,q0,q1,q2,ADM);




initial
  begin


    clk = 0;
    pst = 1;
    reset = 0;

   #10 pst = 0;





      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk;
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk;
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk; 
      #10 clk = ~clk;
    end  // end of test block.

endmodule  // end of test module.



 enter code here

2 个答案:

答案 0 :(得分:1)

StackExchange's Electrical Engineering网站上有一个非常相似的问题,因此我会重复使用answer {。}}。

  

两大问题:

     
      
  1. 不要让翻牌自己异步重置。这包括间接通过组合逻辑。它可能在模拟中起作用   (在你的情况下似乎没有),但在FGPA / ASIC脉冲有   太短暂的良好变化,可能是亚稳态。添加   创造更清洁脉搏的延迟是一种创可贴;它可以工作   您尝试的条件然后意外失败与不同的路由,   寄生或其他偏差。保持一切也很重要   异步设置/复位信号无故障,否则冒险   意外的设定/重置或亚稳态。

  2.   
  3. 不建议将菊花链计数器(其中一个触发器的q用作另一个触发器的时钟)用于实际设计。   他们可能会有糟糕的时机和错误的输出。真正的失败者   时钟到q的延迟,你可以模拟Verilog中的延迟   非阻塞延迟(例如q <= #1 ~q;)。串起一堆这个   在一起,你会发现价值需要更长的时间来解决。   菊花链计数器适合学习,但如果所有的翻转都是最好的   由完全相同的时钟驱动。与第1点不同,很小   菊花链计数器不太可能引起重大问题,但是最好   不要参与使用它们的做法。

  4.         

    保持设计在一个时钟域内同步。

在这个特定的情况下,我不知道你是否想要一个计数器从0-> 1-> 2-> 3-> 0或0-> 1-> 2-> 3- 3-将4-大于0。如果你只想要它去三,那么你只需要两个触发器就可以将一个触发器添加到一个2位宽的三个溢出中并变为零。如果你想要最多四个,那么你想要一个同步重置。

正如sharvil指出的那样,resetbit_counter的输入,因此bit_counter及其子模块不允许驱动它。您可以添加其他信号。

最后一点是你的D_FF看起来很奇怪,我不确定你的合成器会如何对待它。普通的D-FF使用if语句优先级,特别是异步复位/预置。

always @ (posedge clk or negedge rst or negedge pst) begin
  if (!rst) begin
    q <= 1'b0;
  end
  else if (!pst) begin
    q <= 1'b1;
  end
  else begin
    q <= d;
  end
end

答案 1 :(得分:0)

我同意格雷格所说的一切。但是,对于您来说,在Verilog中编写3位计数器是多么容易,它可能(或可能不)具有指导意义。你真的应该瞄准这种风格,而不是你采用的风格。这种风格更具可扩展性,强大,高效,可重复使用......

module BIT_COUNTER(clk,reset,pst,q0,q1,q2,ADM);

  input clk,reset,pst;
  output q0,q1,q2,ADM;

  reg [2:0] q;

  always @(posedge clk or posedge reset)
    if (reset == 1'b1)
      q <= 3'b0;
    else
      if (pst == 1'b1)
        q <= 3'b111;
      else
        if (q == 3'b100)
          q <= 3'b0;
        else
          q <= q + 1'b1;

  assign {q2, q1, q0} = q;

  assign ADM = ((q0 == 1'b0) & (q1 == 1'b0) & (q2 == 1'b1));

endmodule

http://www.edaplayground.com/x/F2T

警告1:我不确切地知道你的目标是什么,所以这可能不是你想做的。

警告2:我不喜欢异步重置和预设。我认为你需要一个复位信号(同步或异步),它将设计置于已知状态。 (不要太担心这是否意味着将触发器初始化为0或1 - 只需调用它&#34;重置&#34;)。在上面的示例中,重置是异步的。如果您还需要预设信号(作为设计正常操作的一部分),那么这应该是同步的。因此我就这样编码了。