所以我是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
答案 0 :(得分:0)
您可以更改与时钟边缘重合的重置。您需要将重置保持一段时间。