结构Verilog计数器初始化

时间:2016-10-13 01:38:06

标签: verilog

所以我是verilog的新手,我正试图用结构verilog制作一个计数器。计数器由4个D型触发器组成。
触发器的功能已经过验证,这不是问题所在。

我发现的问题是,在开始模拟时,线l1(连接d到q_bar)是未定义的。
这可以通过重置触发器并给q_bar定义一个值来解决。 /> 但是,当涉及到FF1时,复位不起作用,因为它是同步复位,并且当复位为高时没有时钟上升沿。

所以我的问题是,如何重置触发器,甚至更好的方法是初始化触发器的输出?

这是我的代码:

module sr_latch(q, q_bar, r, s);
   output q;
   output q_bar;
   input  s;
   input  r;

   nor #1(q_bar, s, q);
   nor #1(q, r, q_bar);
endmodule 


module d_latch(clk,q,q_bar,d);
  output q, q_bar;
  input clk,d;
  wire d_bar,r,s;

  sr_latch A(q, q_bar, r, s);

  not (d_bar, d);
  and (s, d, clk);
  and (r, d_bar, clk);

endmodule


module d_type_ff (clk, d, q, q_bar);
  output q, q_bar;
  input clk, d;
  wire d1, d2, clk_bar;

  d_latch Master(clk_bar, d1, d2, d);
  d_latch Slave(clk, q, q_bar, d1);

  not(clk_bar, clk);

endmodule

module d_type_ff_rst (clk, d, q, q_bar, reset);
    output q;
    output q_bar;
    input clk, d, reset;
    wire d_in, rst_bar;

    d_type_ff A(clk, d_in, q, q_bar);

    not(rst_bar, reset);
    and(d_in, rst_bar, d);

endmodule

module counter_S (clk, reset, enable, count);
  input clk, reset, enable;
  output  [3:0] count;       //MSB count[3]
                            //LSB count[0]
  wire l1, l2, l3, l4;

  d_type_ff_rst FF0 (clk, l1, count[0], l1, reset);
  d_type_ff_rst FF1 (l1, l2, count[1], l2, reset);
  d_type_ff_rst FF2 (l2, l3, count[2], l3, reset);
  d_type_ff_rst FF3 (l3, l4, count[3], l4, reset);


endmodule

和测试平台

module counter_tm();
wire [3:0] count;
reg clk, reset, enable;


counter_S DUT(clk, reset, enable, count);

 always #10 clk <= ~clk;


initial
begin

  clk <= 1'b0;
  reset = 1'b1;
  enable = 1'b1;

  #10
  reset = 1'b0;


end
endmodule

1 个答案:

答案 0 :(得分:0)

您可以更改与时钟边缘重合的重置。您需要将重置保持一段时间。