// dffs_cntr.v dff with dff6 synchronous circuit `timescale 1ps/1ps module dff6(d, c, s, r, q, q_); input d; // q follows d when c goes 0 to 1 input c; // clock, state change on transition input s; // set q to 1 when s is zero, keep s high input r; // set q to 0 when r is zero, keep r high output q; // normal output output q_; // complement output wire d1, d1_, d2, d2_; nand #1 (d1, d1_, s, d2_); nand #1 (d1_, d1, c, r); nand #1 (d2, d2_, c, d1_); nand #1 (d2_, d2, r, d); nand #1 (q, q_, s, d1_); nand #1 (q_, q, r, d2); endmodule // dff6 module dff_cntr; wire d0, q0, q0_; wire d1, q1, q1_; wire d2, q2, q2_; wire d3, q3, q3_; wire a1, a2, a3; reg e, s, r, clk; dff6 dff0(d0, clk, s, r, q0, q0_); // instantiate dff6 dff6 dff1(d1, clk, s, r, q1, q1_); dff6 dff2(d2, clk, s, r, q2, q2_); dff6 dff3(d3, clk, s, r, q3, q3_); and #1 (a1, e , q0); and #1 (a2, a1, q1); and #1 (a3, a2, q2); xor #1 (d0, e , q0); xor #1 (d1, a1, q1); xor #1 (d2, a2, q2); xor #1 (d3, a3, q3); initial begin $display("dff_cntr testing dff6 16 counts"); clk = 1'b0; // clock s = 1'b1; // 0 to set r = 1'b0; // 0 to reset e = 1'b1; // enable counting forever #10 clk = ~clk; end always begin #5 r = 1'b1; #10 $display("s=%b, r=%b, clk=%b, time=%0t", s, r, clk, $time); #10 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #10 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #10 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #10 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #10 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #10 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #1 clk=1'b0; #2 r=1'b0; #4 r=1'b1; #7 $display("s=%b, r=%b, clk=%b, time=%0t", s, r, clk, $time); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b, time=%0t", q3, q2, q1, q0, clk, $time); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); #20 $display("q3=%b, q2=%b, q1=%b, q0=%b, clk=%b", q3, q2, q1, q0, clk); $display("clk=%b at time=%0t ",clk, $time); // just experimenting $finish; end endmodule // dff_cntr