Actions

FPGAExercise5code

From HacDC Wiki

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