Code from 4 person hacking session on 11/11.
The following code may or may not work properly - It appears to give relatively sane counter output in GTKWAVE.
// FALLING EDGE D FLIP FLIP MODULE:
//==============================================
module d_ff_gates (d, clk, rst, q, q_bar);
input d, clk, rst;
output q, q_bar;
wire n1,n2,n3,q_bar_n;
wire cn,dn,n4,n5,n6;
// First Latch
not (n1,d);
nand (n2,d,clk);
nand (n3,n1,clk);
nand (dn,q_bar_n,n2);
nand (q_bar_n,dn,n3, !rst);
// Second Latch
not (cn,clk);
not (n4,dn);
nand (n5,dn,cn);
nand (n6,n4,cn);
nand (q,q_bar,n5);
nand (q_bar,q,n6, !rst);
endmodule
// FALLING EDGE D FLIP FLIP TESTBENCH:
//==============================================
module d_ff_gates_tb;
reg d, clk;
wire q, q_bar;
d_ff_gates dut(d, clk, q, q_bar);
initial
begin
d=0; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
d=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
end
initial
begin
$dumpfile ("waves.lxt");
$dumpvars (0, d_ff_gates_tb);
end
endmodule
// 4 BIT COUNTER MODULE:
//==============================================
module upcounter (rst, clk, enable, q, qb);
input rst, clk, enable;
output [3:0] q, qb;
wire d0, d1, d2, d3; // input wires
wire a0, a1; // and wires
//q[1] = 1'b0; q[2] = 1'b0; q[3] = 1'b0; // init q
xor (d0, q[0], 1'b1); // d0 = q0 xor 1
d_ff_gates dff0(d0, clk, rst, q[0], qb[0]);
xor (d1, q[1], q[0]); // d1 = q1 xor q0
d_ff_gates dff1(d1, clk, rst, q[1], qb[1]);
and (a0, q[1], q[0]);
xor (d2, q[2], a0); // d2 = q2 xor (q1 && q0)
d_ff_gates dff2(d2, clk, rst, q[2], qb[2]);
and (a1, q[2], q[1]);
xor (d3, q[3], a1); // d3 = q3 xor (q2 && q1 && q0)
d_ff_gates dff3(d3, clk, rst, q[3], qb[3]);
endmodule
// 4 BIT COUNTER TESTBENCH:
//==============================================
module upcounter_tb;
reg rst, clk, enable;
wire [3:0] q, qb;
upcounter dut(rst, clk, enable, q, qb);
initial
begin
rst = 1;
enable = 0;
clk=0; #1;
rst = 0;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
clk=0; #1;
clk=1; #1;
end
initial
begin
$dumpfile ("waves.lxt");
$dumpvars (0, upcounter_tb);
end
endmodule