0% found this document useful (0 votes)
306 views

Verilog Basic Programs

The document describes various digital logic circuits implemented using Verilog, including: 1. A full adder circuit modeled using half adders. 2. A full subtractor circuit modeled using half subtractors. 3. An 8-to-1 multiplexer circuit modeled using 2-to-1 multiplexers. 4. A 4-to-16 decoder circuit modeled using a 3-to-8 decoder. 5. A BCD adder circuit. 6. A 4-bit parallel multiplier circuit. The document also provides test benches to simulate and verify the functionality of each circuit.

Uploaded by

souhith
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
306 views

Verilog Basic Programs

The document describes various digital logic circuits implemented using Verilog, including: 1. A full adder circuit modeled using half adders. 2. A full subtractor circuit modeled using half subtractors. 3. An 8-to-1 multiplexer circuit modeled using 2-to-1 multiplexers. 4. A 4-to-16 decoder circuit modeled using a 3-to-8 decoder. 5. A BCD adder circuit. 6. A 4-bit parallel multiplier circuit. The document also provides test benches to simulate and verify the functionality of each circuit.

Uploaded by

souhith
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 70

12/01/2015

DATAFLOW & STRUCTURAL MODELING


1. Full Adder
module ha (input a, b, output sum, carry);
xor g1 (sum, a, b);
and g2 (carry, a, b);
endmodule

a. Using only Half Adders (Position / Ordered Association)


module fa_ha (input a, b, cin, output sum, carry);
wire w1,w2,w3;
ha HA1 (a, b, w1, w3),
HA2(cin, w1, sum, w2),
HA3(w2, w3, carry,);
endmodule

b. Using only Half Adders (Named Association)


module fa_ha (input a, b, cin, output sum, carry);
wire w1,w2,w3;
ha HA1 (.a(a), .b(b), .sum(w1), .carry(w3)),
HA2 (.a(cin), .b(w1), .sum(sum), .carry(w2)),
HA3 (.a(w2), .b(w3), .sum(carry), .carry());
endmodule

Test Bench
module fa_tb;
reg a,b,cin;
wire sum,carry;
fa f1(.a(a),.b(b),.cin(cin),.sum(sum),.carry(carry));
initial
begin
a=0;b=0;cin=0;
$monitor("a=%b,b=%b,cin=%b,sum=%b,carry=%b",a,b,cin,sum,carry);
#5 cin = 1;

#5 b = 1;
#5 cin = 0;
#5 a = 1;
#5 cin = 1;
#5 b = 0;
#5 cin = 0;
end
endmodule

2. Full Subtractor
module hs (input a,b, output d, bo);
wire w1;
not g1 (w1, a);
xor g2 (d, a ,b);
and g3 (bo, w1 ,b);
endmodule

a. Using only Half Subtractor (Position / Ordered Association)


module fs_hs (input a, b, c, output diff, borrow);
wire w1,w2,w3;
hs HS1(a, b, w1, w3),
HS2(w1, c, diff, w2),
HS3(w2, w3, borrow, );
endmodule

b. Using only Half Subtractor (Named Association)


module fs_hs (input a, b, c, output diff, borrow);
wire w1,w2,w3;
hs HS1(.a(a), .b(b), .d(w1), .bo(w3)),
HS2(.a(w1), .b(c), .d(diff), .bo(w2)),
HS3(.a(w2),.b(w3),.d(borrow),.bo());
endmodule

3. 8 : 1 Multiplexer using only 2 : 1 Multiplexers


a. Using only vectors
module mux_2_1(input [1:0]i, input s, output y);
assign y = s ? i[1] : i[0];
endmodule
module mux_8_1 (input [7:0]i, input [2:0]s, output y);
wire [5:0]w;
mux_2_1 m1 (.i(i[1:0]), .s(s[0]), .y(w[0])),
m2 (.i(i[3:2]), .s(s[0]), .y(w[1])),
m3 (.i(i[5:4]), .s(s[0]), .y(w[2])),
m4 (.i(i[7:6]), .s(s[0]), .y(w[3])),
m5 (.i(w[1:0]), .s(s[1]), .y(w[4])),
m6 (.i(w[3:2]), .s(s[1]), .y(w[5])),
m7 (.i(w[5:4]), .s(s[2]), .y(y));
endmodule

b. Using scalars & Vectors


module mux_2 (input a, b, s, output y);
assign y=s ? b : a;
endmodule
module mux_8 (input[7:0]i, input[2:0]s, output y);
wire y1,y2,y3,y4,y5,y6;
mux_2 m1 (.a(i[0]), .b(i[1]), .s(s[0]), .y(y1)),
m2 (.a(i[2]), .b(i[3]), .s(s[0]), .y(y2)),
m3 (.a(i[4]), .b(i[5]), .s(s[0]), .y(y3)),
m4 (.a(i[6]), .b(i[7]), .s(s[0]), .y(y4)),
m5 (.a(y1), .b(y2), .s(s[1]), .y(y5)),
m6 (.a(y3), .b(y4), .s(s[1]), .y(y6)),
m7 (.a(y5), .b(y6), .s(s[2]), .y(y));
endmodule
Test Bench

4. 4 : 16 Decoder using 3 : 8 Decoder


3 : 8 Decoder
module dec_3_8 (input a, b, c, en, output [7:0]y);
wire w1,w2,w3;
not g9 (w1, a),
g10 (w2, b),
g11 (w3 ,c);
and g1 (y[0], w1, w2, w3, en),
g2 (y[1], w1, w2, c, en),
g3 (y[2], w1, b, w3, en),
g4 (y[3], w1, b, c, en),
g5 (y[4], a, w2, w3, en),
g6 (y[5], a, w2, c, en),
g7 (y[6], a, b, w3, en),
g8 (y[7], a, b, c, en);
endmodule

4 : 16 Decoder
module dec_4_16 (input a, b, c, d, output [15:0]y);
wire w1;
not g1(w1,a);
dec_3_8 d1 (.a(b), .b(c), .c(d), .en(w1), .y(y[7:0])),
d2 (.a(b), .b(c), .c(d), .en(a), .y(y[15:8]));
endmodule

5. BCD ADDER

module bcd_adder(input [3:0]a,b, input cin, output [3:0]s, output co);


wire w0,w1,w2,w3,w4,w5,w6,w7;
assign cin = 0;
fa_4bit fa1 (.a(a), .b(b), .cin(cin), .s({w3,w2,w1,w0}), .co(w4));
and g1(w5, w1, w3),
g2(w6, w2, w3);
or g3(w7, w4, w5, w6);
fa_4bit fa2 (.a({w3,w2,w1,w0}), .b({cin,w7,w7,cin}), .cin(cin), .s(s), .co());
assign co = w7;
endmodule

Test bench

module bcd_adder_tb;
reg [3:0]a,b;
reg cin;
wire [3:0]s;
wire co;
bcd_adder fa1(.a(a),.b(b),.cin(cin),.s(s),.co(co));
initial
begin
a = 4'b0000;b = 4'b0000;cin = 0;
$monitor("a=%b, b=%b, cin=%b, sum=%b, carry=%b",a,b,cin,s,co);
#5 b = 4'b0001; a = 4'b1001;
#5 b = 4'b0010;
#5 b = 4'b0011;
#5 b = 4'b1001;
#5 b = 4'b0010;
#5 b = 4'b0110;
#5 b = 4'b0011; a = 4'b0111;
#5 a = 4'b0111;
#5 b = 4'b0110;
#5 b = 4'b1000;
#5 b = 4'b0010;
#5 b = 4'b1001;
end
endmodule

6. 4 bit Parallel Multiplier

module mult4bit (input [3:0]x, y, output [7:0]m);


wire [3:0]p1,p2,p3,p4,s1,s2;
wire c1,c2;
assign p1 = x & {4{y[0]}},

p2 = x & {4{y[1]}};
fa_4bit fa1(.a({1'b0,p1[3:1]}), .b(p2), .cin(1'b0), .s(s1), .co(c1));
assign p3 = x & {4{y[2]}};
fa_4bit fa2(.a({c1,s1[3:1]}), .b(p3), .cin(1'b0), .s(s2), .co(c2));
assign p4 = x & {4{y[3]}};
fa_4bit fa3(.a({c2,s2[3:1]}),.b(p4),.cin(1'b0),.s(m[6:3]),.co(m[7]));
assign m[0] = p1[0],
m[1] = s1[0],
m[2] = s2[0];
endmodule

Test bench
module mult4bit_tb;
reg [3:0]x,y;
wire [7:0]m;
mult4bit mul1(.x(x), .y(y), .m(m));
initial
begin
x = 4'b0000;y = 4'b0000;
$monitor("x=%b, y=%b, m=%b",x,y,m);
#5 x = 4'b1001; y = 4'b1001;
#5 x = 4'b0010;
#5 x = 4'b0011;
#5 x = 4'b1001;
#5 x = 4'b0010;
#5 x = 4'b1110;
#5 x = 4'b0011; y = 4'b0111;
#5 x = 4'b0111;
#5 x = 4'b0110;
#5 x = 4'b1011;
#5 x = 4'b0010;
#5 x = 4'b1001;
#5 x = 4'b0011; y = 4'b1111;
#5 x = 4'b0111;

#5 x = 4'b0110;
#5 x = 4'b1011;
#5 x = 4'b1010;
#5 x = 4'b1001;
end

13/01/2015

BEHAVIORAL MODELING
1. Examples to understand the execution of statements in procedural
blocks
a. Test 3
module test3;

module test3;

initial

initial

begin

begin

#0 $display("Block 1 St 1");

#1 $display("Block 1 St 1");

#0 $display("Block 1 St 2");

#0 $display("Block 1 St 2");

#2 $display("Block 1 St 3");

#2 $display("Block 1 St 3");

end

end

initial

initial

begin

begin

$display("Block 2 St 1");

#0 $display("Block 2 St 1");

#0 $display("Block 2 St 2");

#2 $display("Block 2 St 2");

#4 $display("Block 2 St 3");

#4 $display("Block 2 St 3");

end

end

endmodule

endmodule

Output

Output

Block 2 St 1

Block 2 St 1

Block 1 St 1

Block 1 St 1

Block 2 St 2

Block 1 St 2

Block 1 St 2

Block 2 St 2

Block 1 St 3

Block 1 St 3

Block 2 St 3

Block 2 St 3

b. Test 4
module test4;

module test4;

integer a,b,c,d,e,f;

integer a,b,c,d,e,f;

initial

initial

begin
a = 20;
$display("%d", a);

begin
a = 20;
$display("%d", a);

#5 b = 50;

#5 b = 50;

$display("%d",b);

$display("%d",b);

end

end

initial

initial

begin

begin

#10 c = 55;

#10 c = 55;

$display("%d",c);

$display("%d",c);

#15 d = 70;

#15 d = 70;

$display("%d",d);

$display("%d",d);

end

end

initial

initial

begin

begin

#20 e = 75;

e = 75;

$display("%d",e);

$display("%d",e);

#45 f = 80;

#5 f = 80;

$display("%d",f);

$display("%d",f);

end

end

endmodule

endmodule

Output

Output

a = 20

a = 20

b = 50

e = 75

c = 55

b = 50

e = 75

f = 80

d = 70

c = 55

f = 80

d = 70

14 / 01 / 2015
2. 2:1 Multiplexer
module mux2to1_bh(input a,b,sel, output reg y);
always@(a,b,sel)
begin
if(sel)
y = b;
else

y = a;
end
endmodule
testbench
module mux_2_tb;
reg a,b,s;
wire y;
mux_2 m1(.a(a),.b(b),.s(s),.y(y));
initial
begin
a=0;b=0;s=0;
$monitor("a=%b,b=%b,s=%b,y=%b",a,b,s,y);
#5 s = 1;
#5 a = 1;
#5 s = 0;
#5 b = 1;
#5 s = 1;
#5 a = 0;
#5 s = 0;
end
endmodule

3. Full Adder
a. Using if else ladder ( Blocking Assignment Statements )
module fa_bh4(input a,b,cin, output reg sum,carry);
always@(a,b,cin)
begin
if(a==0 && b==0 && cin==0)
begin
sum = 0;
carry = 0;
end
else if(a==0 && b==0 && cin==1)
begin
sum = 1;

carry = 0;
end
else if(a==0 && b==1 && cin==0)
begin
sum = 1;
carry = 0;
end
else if(a==0 && b==1 && cin==1)
begin
sum = 0;
carry = 1;
end
else if(a==1 && b==0 && cin==0)
begin
sum = 1;
carry = 0;
end
else if(a==1 && b==0 && cin==1)
begin
sum = 0;
carry = 1;
end
else if(a==1 && b==1 && cin==0)
begin
sum = 0;
carry = 1;
end
else
begin
sum = 1;
carry = 1;
end
end
endmodule

b. Using case statement ( Blocking Assignment Statements )


module fa_bh5(input a,b,cin, output reg sum,carry);
always@(a,b,cin)
begin
case({a,b,cin})
3'b000:begin
sum = 0; carry = 0;
end
3'b001:begin
sum = 1; carry = 0;
end
3'b010:begin
sum = 1; carry = 0;
end
3'b011:begin
sum = 0; carry = 1;
end
3'b100:begin
sum = 1; carry = 0;
end
3'b101:begin
sum = 0; carry = 1;
end
3'b110:begin
sum = 0; carry = 1;
end
3'b111:begin
sum = 1; carry = 1;
end
endcase
end
endmodule
c. Using if else ladder and operators ( Blocking Assignment Statements )
module fa_bh6(input a,b,cin, output reg sum,carry);

always@(a,b,cin)
begin
if(!a & !b & !cin)
begin
sum = 0;
carry = 0;
end
else if(!a & !b & cin)
begin
sum = 1;
carry = 0;
end
else if(!a & b & !cin)
begin
sum = 1;
carry = 0;
end
else if(!a & b & cin)
begin
sum = 0;
carry = 1;
end
else if(a & !b & !cin)
begin
sum = 1;
carry = 0;
end
else if(a & !b & cin)
begin
sum = 0;
carry = 1;
end
else if(a & b & !cin)
begin

sum = 0;
carry = 1;
end
else
begin
sum = 1;
carry = 1;
end
end
endmodule
Test Bench
module fa_tb;
reg a,b,cin;
wire sum,carry;
fa f1(.a(a),.b(b),.cin(cin),.sum(sum),.carry(carry));
initial
begin
a=0;b=0;cin=0;
$monitor("a=%b,b=%b,cin=%b,sum=%b,carry=%b",a,b,cin,sum,carry);
#5 cin = 1;
#5 b = 1;
#5 cin = 0;
#5 a = 1;
#5 cin = 1;
#5 b = 0;
#5 cin = 0;
end
endmodule

4. 4 : 1 Multiplexer
a. Using case statement
module mux4to1_bh_case(input a,b,c,d, input [1:0]s, output reg y);
always @(a,b,c,d,s)
begin

case(s)
2'b00:y=a;
2'b01:y=b;
2'b10:y=c;
default:y=d;
endcase
end
endmodule
Testbench
module mux4to1_bh_tb;
reg a,b,c,d;
reg [1:0]s;
wire y;
mux4to1_bh_case m1(.a(a),.b(b),.c(c),.d(d),.s(s),.y(y));
initial
begin
a=0;b=0;c=0;d=0;s=2'b00;
$monitor("a=%b, b=%b, c=%d, d=%d, s=%b, y=%b",a,b,c,d,s,y);
#5 a = 1;
#5 s = 2'b01;
#5 b = 1;a = 0; d = 1;
#5 s = 2'b10;
#5 b = 0;
#5 c = 1;
#5 c = 0;b = 1;
#5 s = 2'b11;
#5 a = 1;
#5 b = 0;d = 0;
end
endmodule

5. 3 : 8 Decoder
a. Using if else statement
module dec3to8_if(input [2:0]a, output reg [7:0]y);
always@(a)

begin
if(a==3'b000)
y = {7'b0,1'b1};
else if(a==3'b001)
y = {6'b0,1'b1,1'b0};
else if(a==3'b010)
y = {5'b0,1'b1,2'b0};
else if(a==3'b011)
y = {4'b0,1'b1,3'b0};
else if(a==3'b100)
y = {3'b0,1'b1,4'b0};
else if(a==3'b101)
y = {2'b0,1'b1,5'b0};
else if(a==3'b110)
y = {1'b0,1'b1,6'b0};
else
y = {1'b1,7'b0};
end
endmodule
b. Using case statement
module dec3to8_case(input [2:0]a, output reg [7:0]y);
always@(a)
begin
case(a)
3'b000:y=8'b00000001;
3'b001:y=8'b00000010;
3'b010:y=8'b00000100;
3'b011:y=8'b00001000;
3'b100:y=8'b00010000;
3'b101:y=8'b00100000;
3'b110:y=8'b01000000;
3'b111:y=8'b10000000;
default:y=8'b00000000;
endcase

end
endmodule
Test Bench
module dec3to8_bh_tb;
reg [2:0]a;
wire [7:0]y;
dec3to8_if dec(.a(a),.y(y));
initial
begin
a = 3'b000;
$monitor("a = %b, y = %b",a,y);
#5 a = 3'b001;
#5 a = 3'b010;
#5 a = 3'b011;
#5 a = 3'b100;
#5 a = 3'b101;
#5 a = 3'b110;
#5 a = 3'b111;
end
endmodule

6. 8 : 3 Encoder
a. Using if else statement
module enc8to3_if(input [7:0]a, output reg [2:0]y);
always@(a)
begin
if(a==8'b00000001)

y = 3'b000;
else if(a==8'b00000010)
y = 3'b001;
else if(a==8'b00000100)
y = 3'b010;
else if(a==8'b00001000)
y = 3'b011;
else if(a==8'b00010000)
y = 3'b100;
else if(a==8'b00100000)
y = 3'b101;
else if(a==8'b01000000)
y = 3'b110;
else if(a==8'b10000000)
y = 3'b111;
else
y = 3'bx;
end
endmodule
b. Using Case statement
module enc8to3_case(input [7:0]a, output reg [2:0]y);
always@(a)
begin
case(a)
8'b00000001:y = 3'b000;
8'b00000010:y = 3'b001;
8'b00000100:y = 3'b010;
8'b00001000:y = 3'b011;
8'b00010000:y = 3'b100;
8'b00100000:y = 3'b101;
8'b01000000:y = 3'b110;
8'b10000000:y = 3'b111;
default:y = 3'bxxx;
endcase

end
endmodule
Test Bench
module enc8to3_bh_tb;
reg [7:0]a;
wire [2:0]y;
enc8to3_if enc(.a(a),.y(y));
initial
begin
a = 8'b00000000;
$monitor("a = %b, y = %b",a,y);
#5 a = 8'b00000001;
#5 a = 8'b00000010;
#5 a = 8'b00000100;
#5 a = 8'b00001000;
#5 a = 8'b00010000;
#5 a = 8'b00100000;
#5 a = 8'b01000000;
#5 a = 8'b10000000;
end
endmodule

7. BCD to 7 Segment display Decoder


a. Using if else statement
module bcdto7seg_if(input [3:0]a, output reg [6:0]y);
always@(a)
begin
if(a == 4'b0000)
y = 7'b1111110;
else if(a == 4'b0001)
y = 7'b0110000;
else if(a == 4'b0010)
y = 7'b1101101;
else if(a == 4'b0011)
y = 7'b1111001;

else if(a == 4'b0100)


y = 7'b0110011;
else if(a == 4'b0101)
y = 7'b1011010;
else if(a == 4'b0110)
y = 7'b1011111;
else if(a == 4'b0111)
y = 7'b1110000;
else if(a == 4'b1000)
y = 7'b1111111;
else if(a == 4'b1001)
y = 7'b1111011;
else
y = 7'b0;
end
endmodule
b. Using case Statement
module bcdto7seg_case(input [3:0]a, output reg [6:0]y);
always@(a)
begin
case(a)
4'b0000:y = 7'b1111110;
4'b0001:y = 7'b0110000;
4'b0010:y = 7'b1101101;
4'b0011:y = 7'b1111001;
4'b0100:y = 7'b0110011;
4'b0101:y = 7'b1011010;
4'b0110:y = 7'b1011111;
4'b0111:y = 7'b1110000;
4'b1000:y = 7'b1111111;
4'b1001:y = 7'b1111011;
default:y = 7'b0;
endcase
end

endmodule
Test Bench
module bcdto7seg_tb;
reg [3:0]a;
wire [6:0]y;
bcdto7seg_case bcddec(.a(a),.y(y));
initial
begin
a = 4'b0000;
$monitor("a = %b, y = %b",a,y);
#5 a=4'b0001;
#5 a=4'b0010;
#5 a=4'b0011;
#5 a=4'b0100;
#5 a=4'b1111;
#5 a=4'b0101;
#5 a=4'b0110;
#5 a=4'b0111;
#5 a=4'b1010;
#5 a=4'b1011;
#5 a=4'b1000;
#5 a=4'b1101;
#5 a=4'b1001;
end
endmodule

19 / 01 / 2015
8. 4 Bit Asynchronous Counter starting from latch

SR Latch using NAND gates


module srlatch(input s,r,en, output q,qbar);
wire w1,w2,w3,w4;
nand g1(w1,s,en),
g2(w2,r,en),
g3(w3,w1,w4),
g4(w4,w2,w3);
assign q = w3,
qbar = w4;
endmodule

D Latch from SR Latch


module dlatch(input d,en, output q,qbar);
wire w5;
not g5(w5,d);
srlatch d_latch(.s(d),.r(w5),.en(en),.q(q),.qbar(qbar));
endmodule

D Flipflop using 2 D latches


module dff_ms(input d,clk, output q,qbar);

wire w1,w2;
not g1(w1,clk);
dlatch d1(.d(d),.en(clk),.q(w2),.qbar()),
d2(.d(w2),.en(w1),.q(q),.qbar(qbar));
endmodule

4 bit Asynchronous Up counter using D flipflop


module cntr_dff_struct(input clk,d,rst, output[3:0]q);
dff_arst d1(.d(~q[0]),.clk(clk),.q(q[0]),.rst(rst)),
d2(.d(~q[1]),.clk(~q[0]),.q(q[1]),.rst(rst)),
d3(.d(~q[2]),.clk(~q[1]),.q(q[2]),.rst(rst)),
d4(.d(~q[3]),.clk(~q[2]),.q(q[3]),.rst(rst));
endmodule
Testbench
module cntr_dff_struct_tb;
reg d,clk,rst;
wire [3:0]q;
cntr_dff_struct d1(.d(d),.clk(clk),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, d=%b, q=%b", clk,rst,d,q);
#20 rst = 1;

#200 rst = 0;
#30 rst = 1;
end
endmodule

20 / 01 / 2015
9. Race Around Condition
Blocking Statements

Blocking statements

module test_race(input clk);

module test_race(input clk);

reg [3:0]a,b;

reg [3:0]a,b;

initial

initial

begin

begin

a = 4'b1101;

a = 4'b1101;

b = 4'b1110;

b = 4'b1110;

end

end

always@(posedge clk)

always@(posedge clk)

begin
a = b;
b = a;
end

a = b;
always@(posedge clk)
b = a;
end

endmodule

endmodule

Output

Output

a = 4b1110

a = 4b1110

b = 4b1110

b = 4b1110

Non Blocking statements

Non Blocking statements

module test_race(input clk);

module test_race(input clk);

reg [3:0]a,b;

reg [3:0]a,b;

initial
begin

initial
begin

a = 4'b1101;

a = 4'b1101;

b = 4'b1110;

b = 4'b1110;

end

end

always@(posedge clk)

always@(posedge clk)

a <= b;
b <= a;
end
endmodule

a <= b;
always@(posedge clk)
b <= a;
end

Output

endmodule

a = 4b1110

Output

b = 4b1101

a = 4b1110
b = 4b1101

10. COUNTERS
a. 4 bit synchronous counter with synchronous reset
module cntr4bit_syn_srst(input clk,rst, output reg [3:0]q);
always@(posedge clk)
begin
if(!rst)
q <= 4'b0000;
else
q <= q+1;
end
endmodule
Test Bench
module cntr4bit_syn_tb;
reg clk,rst;
wire [3:0]q;
cntr4bit_syn_srst cntr(.clk(clk),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;

initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);
#32 rst = 1;
//#54 rst = 0;
//#80 rst = 0;
//#5 rst = 1;
end
endmodule

b. n bit synchronous counter with synchronous reset


module cntrnbit_syn_srst #(parameter n = 8)
(input clk,rst, output reg [n-1:0]q);
always@(posedge clk)
begin
if(!rst)
q <= {n{1'b0}};
else
q <= q+1;
end
endmodule
Test Bench
module cntrnbit_syn_tb #(parameter n = 8);
reg clk,rst;
wire [n-1:0]q;
cntrnbit_syn_srst cntr(.clk(clk),.rst(rst),.q(q));

initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);
#32 rst = 1;
#154 rst = 0;
#13 rst = 1;
#180 rst = 0;
#45 rst = 1;
end
endmodule

c. n bit synchronous UPDOWN counter with asynchronous reset


module cntrnbit_ud_syn_arst #(parameter n = 8)
(input clk,rst,updown, output reg [n-1:0]q);
always@(posedge clk, negedge rst)
begin
if(!rst)
q <= {n{1'b0}};
else if(updown)
q <= q+1;
else
q <= q-1;

end
endmodule
Test Bench
module cntrnbit_ud_syn_tb #(parameter n = 8);
reg clk,rst,updown;
wire [n-1:0]q;
cntrnbit_ud_syn_arst cntr(.clk(clk),.rst(rst),.updown(updown),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;updown = 1;
$monitor("clk=%b, rst=%b, updown=%b, q=%b", clk,rst,updown,q);
#32 rst = 1;
#154 rst = 0;
#25 rst = 1;
#17 updown = 0;
#80 rst = 0;
#5 rst = 1;
#18 updown = 1;
#170 rst = 0;
#17 rst = 1;
end
endmodule

d. 4 bit synchronous UPDOWN counter with synchronous reset


module cntr4bit_ud_syn_srst(input clk,rst,updown, output reg [3:0]q);
always@(posedge clk)
begin
if(!rst)
q <= 4'b0000;
else if(updown)
q <= q+1;
else
q <= q-1;
end
endmodule
Test Bench
module cntr4bit_ud_syn_tb;
reg clk,rst,updown;
wire [3:0]q;
cntr4bit_ud_syn_srst cntr(.clk(clk),.rst(rst),.updown(updown),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;updown = 1;
$monitor("clk=%b, rst=%b, updown=%b, q=%b", clk,rst,updown,q);
#32 rst = 1;
#54 rst = 0;
#5 rst = 1;
#17 updown = 0;
#80 rst = 0;
#5 rst = 1;
#18 updown = 1;
#70 rst = 0;
#17 rst = 1;

end
endmodule

e. n bit synchronous UPDOWN counter with synchronous reset


module cntrnbit_ud_syn_srst #(parameter n = 8)
(input clk,rst,updown, output reg [n-1:0]q);
always@(posedge clk)
begin
if(!rst)
q <= {n{1'b0}};
else if(updown)
q <= q+1;
else
q <= q-1;
end
endmodule
Test Bench
module cntrnbit_ud_syn_tb #(parameter n = 8);
reg clk,rst,updown;
wire [n-1:0]q;
cntrnbit_ud_syn_srst cntr(.clk(clk),.rst(rst),.updown(updown),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;updown = 1;

$monitor("clk=%b, rst=%b, updown=%b, q=%b", clk,rst,updown,q);


#32 rst = 1;
#154 rst = 0;
#25 rst = 1;
#17 updown = 0;
#80 rst = 0;
#5 rst = 1;
#18 updown = 1;
#170 rst = 0;
#17 rst = 1;
end
endmodule

21 / 01 / 2015
11. TYPES OF TESTBENCHES
FULL ADDER
a. File I / O Based Test Bench
module fa_tb_file;
reg a,b,cin;
wire sum,carry;
integer f1;
fa_bh1 fa1(.a(a),.b(b),.cin(cin),.sum(sum),.carry(carry));
initial
//f1 = $fopen("fa_lin.xls");
f1 = $fopen("fa_lin.txt");
initial
begin

a=0;b=0;cin=0;
$fmonitor(f1,$time,"a=%b,b=%b,cin=%b,sum=%b,carry=%b",a,b,cin,sum,carry);
#5 cin = 1;
#5 b = 1;
#5 cin = 0;
#5 a = 1;
#5 cin = 1;
#5 b = 0;
#5 cin = 0;
end
endmodule
b. Iterative Loop Based Test Bench
module fa_tb_loop;
reg a,b,cin;
wire sum,carry;
integer f1;
fa_bh1 fa1(.a(a),.b(b),.cin(cin),.sum(sum),.carry(carry));
initial
f1 = $fopen("fa_loop.txt");
initial
begin
{a,b,cin} = 3'b000;
repeat(7)
begin
{a,b,cin} = {a,b,cin} + 3'b001;
#10 $fdisplay(f1,$time,"a=%b, b=%b, cin=%b, sum=%b, carry=
%b",a,b,cin,sum,carry);
end
end
endmodule
c. Test Bench using Randomization
module fa_tb_rand;
reg a,b,cin;
wire sum,carry;
fa_bh1 fa1(.a(a),.b(b),.cin(cin),.sum(sum),.carry(carry));
initial
begin
repeat(10)
begin
a = $random();

b = $random();
cin = $random();
#5 $display("a=%b, b=%b, cin=%b, sum=%b, carry=%b",a,b,cin,sum,carry);
end
end
endmodule
d. Self Checking Test Bench
module fa_tb_self;
reg a,b,cin;
wire sum,carry;
integer f1;
fa_bh1 fa1(.a(a),.b(b),.cin(cin),.sum(sum),.carry(carry));
initial
f1 = $fopen("fa_self1.txt");
initial
begin
{a,b,cin} = 3'b000;
repeat(7)
begin
{a,b,cin} = {a,b,cin} + 3'b001;
#10 $fdisplay(f1,$time,"a=%b, b=%b, cin=%b, sum=%b, carry=
%b",a,b,cin,sum,carry);
if((a+b+cin)!={carry,sum})
$fdisplay(f1,$time,"error");
else
$fdisplay(f1,$time,"success");
end
end
endmodule

12. PRIORITY ENCODER


i ) Without Default conditions
a. Using Conditional Statement
module prienc_df(input [7:0]a, output [2:0]y);
assign y = (a[0]==1'b1)? 3'b000:
(a[1]==1'b1)? 3'b001:
(a[2]==1'b1)? 3'b010:
(a[3]==1'b1)? 3'b011:
(a[4]==1'b1)? 3'b100:

(a[5]==1'b1)? 3'b101:
(a[6]==1'b1)? 3'b110:
3'b111;
endmodule

b. Using if else statement


module prienc_if(input [7:0]a, output reg [2:0]y);
always@(a)
begin
if(a[0] == 1'b1)
y = 3'b000;
else if(a[1] == 1'b1)
y = 3'b001;
else if(a[2] == 1'b1)
y = 3'b010;
else if(a[3] == 1'b1)
y = 3'b011;
else if(a[4] == 1'b1)
y = 3'b100;
else if(a[5] == 1'b1)
y = 3'b101;
else if(a[6] == 1'b1)
y = 3'b110;
else
y = 3'b111;
end
endmodule

c. Using Casex Statement


module prienc_case(input [7:0]a, output reg [2:0]y);
always@(a)
begin
casex (a)
8'bxxxxxxx1: y = 3'b000;
8'bxxxxxx10: y = 3'b001;
8'bxxxxx100: y = 3'b010;
8'bxxxx1000: y = 3'b011;
8'bxxx10000: y = 3'b100;
8'bxx100000: y = 3'b101;
8'bx1000000: y = 3'b110;
8'b10000000: y = 3'b111;
endcase
end
endmodule

ii ) with Default Case


d. Using Conditional operator
module prienc_df1(input [7:0]a, output [2:0]y);
assign y = (a[0]==1'b1)? 3'b000:
(a[1]==1'b1)? 3'b001:
(a[2]==1'b1)? 3'b010:
(a[3]==1'b1)? 3'b011:
(a[4]==1'b1)? 3'b100:

(a[5]==1'b1)? 3'b101:
(a[6]==1'b1)? 3'b110:
(a[7]==1'b1)? 3'b111:
3'bx;
endmodule

e. Using if else statement


module prienc_if1(input [7:0]a, output reg [2:0]y);
always@(a)
begin
if(a[0] == 1'b1)
y = 3'b000;
else if(a[1] == 1'b1)
y = 3'b001;
else if(a[2] == 1'b1)
y = 3'b010;
else if(a[3] == 1'b1)
y = 3'b011;
else if(a[4] == 1'b1)
y = 3'b100;
else if(a[5] == 1'b1)
y = 3'b101;
else if(a[6] == 1'b1)
y = 3'b110;
else if(a[7] == 1'b1)
y = 3'b111;
else
y = 3'bx;
end
endmodule

f. Using casex statement


module prienc_case1(input [7:0]a, output reg [2:0]y);
always@(a)
begin
casex (a)
8'bxxxxxxx1: y = 3'b000;
8'bxxxxxx10: y = 3'b001;
8'bxxxxx100: y = 3'b010;
8'bxxxx1000: y = 3'b011;
8'bxxx10000: y = 3'b100;
8'bxx100000: y = 3'b101;
8'bx1000000: y = 3'b110;
8'b10000000: y = 3'b111;
default: y = 3'bx;
endcase
end
endmodule

Test Bench
module prienc_tb;
reg [7:0]a;
wire [2:0]y;

integer f1;
//prienc_df e(.a(a),.y(y)); // for dataflow
//prienc_if e(.a(a),.y(y)); // for if else
prienc_case e(.a(a),.y(y));
initial
//f1 = $fopen("prienc_df.txt");
//f1 = $fopen("prienc_if.txt");
f1 = $fopen("prienc_case.txt");
initial
begin
a = 8'b1;
$fmonitor(f1,$time,"a=%b,y=%b",a,y);
#10 a = 8'b0;
#10 a = 8'bxxxxxxxx;
#10 a = 8'bzzzzzzzz;
#10 a = 8'b11110000;
#10 a = 8'bxxxxxx1x;
#10 a = 8'bzzz1zzzx;
#10 a = 8'bzzz1zzzz;
#10 a = 8'bzzz1z10x;
#10 a = 8'b111100xx;
#10 a = 8'b00000010;
#10 a = 8'bzzz1x00z;
#10 a = 8'b1z1x0zx0;
#10 a = 8'b1z1x0xx0;
#10 a = 8'b1z1x00x0;
#10 a = 8'b1z1x01x0;
#10 a = 8'b1z100xx0;
#10 a = 8'b1z10000x;
#10 a = 8'b1z1z000x;
#10 a = 8'b000000x0;
#10 a = 8'b100000x0;
#10 a = 8'b000001x0;
end
endmodule

22 / 01 / 2015
13. n bit Asynchronous Up counter using Generate For loop statement
Asynchronous D FF
module dff_arst(input clk,rst,d, output reg q);
always@(posedge clk, negedge rst)

begin
if(!rst)
q <= 1'b0;
else
q <= d;
end
endmodule
Asynchronous Up Counter
module cntrnbit_asyn_gen #(parameter n = 4)
(input clk,rst, output [n-1:0]q);
genvar i;
generate
for(i=0;i<n;i=i+1)
begin:f1
if(i==0)
dff_arst c1(.clk(clk),.rst(rst),.d(~q[i]),.q(q[i]));
else
dff_arst c2(.clk(~q[i-1]),.rst(rst),.d(~q[i]),.q(q[i]));
end
endgenerate
endmodule
Test Bench
module cntrnbit_async_tb #(parameter n = 4);
reg clk,rst;
wire [n-1:0]q;
cntrnbit_asyn_gen cntr(.clk(clk),.rst(rst),.q(q)); //for asynchronous counter
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);

#5 rst = 1;
#154 rst = 0;
#13 rst = 1;
#180 rst = 0;
#45 rst = 1;
end
endmodule

14.

n - bit Full Adder Using Behavioral For loop statement

module fa_nbit_for #(parameter n=8)(input [n-1:0]a,b, input cin, output reg [n-1:0]s, output
reg co);
reg [n:0]c;
integer i;
always@(a,b,cin)
begin
c[0] = cin;
for(i=0;i<n;i=i+1)
begin
{c[i+1],s[i]} = a[i]+b[i]+c[i];
end
co = c[n];
end
endmodule
Test Bench
module nbitfa_tb #(parameter n=8);
reg [n-1:0]a,b;
reg cin;

wire [n-1:0]s;
wire co;
integer f2;
fa_nbit_for f1(.a(a),.b(b),.cin(cin),.s(s),.co(co));
initial
f2 = $fopen("nbit_fa1.txt");
initial
begin
repeat(20)
begin
cin = $random();
a = $random(); b = $random();
#5 $fdisplay(f2,$time,"a=%d,b=%d,cin=%d,s=%d,co=%d",a,b,cin,s,co);
end
end
endmodule

15.

8 : 1 MUX using Behavioral For loop statement

module mux8to1_for(input [7:0]a, input [2:0]sel, output reg y);


integer i;
always@(a,sel)
begin
for(i=0;i<8;i=i+1)
begin
if(i==sel)
y = a[i];

end
end
endmodule
Testbench
module mux8to1_for_tb;
reg [7:0]a;
reg [2:0]sel;
wire y;
mux8to1_for f1(.a(a),.sel(sel),.y(y));
initial
begin
a = 8'b11110000; sel = 3'b000;
$monitor("a=%b,sel=%d,y=%b",a,sel,y);
#10 sel = 3'b001;
#10 sel = 3'b00x;
#10 sel = 3'b110;
#10 sel = 3'b00x;
#10 sel = 3'b100;
#10 sel = 3'b010;
#10 sel = 3'b111;
#10 sel = 3'b101;
#10 sel = 3'b011;
#10 sel = 3'bx01;
#10 sel = 3'bxxz;
#10 sel = 3'bz01;
#10 sel = 3'b10z;
#10 sel = 3'b01x;
end
endmodule

16.

n bit Decoder Using Brhavioral For loop statement

module decnbit_for #(parameter n = 3)(input [n-1:0]a,output reg [(2**n-1):0]y);


integer i;
always@(a)
begin
for(i=0; i<2**n ;i=i+1)
begin
if(i == a)
begin
if(i == 0)
y = 2'b10>>1;
else
y = 2'b10<<(i-1);
end
end
end
endmodule
Test Bench
module dec3bit_for_tb #(parameter n = 3);
reg [n-1:0]a;
wire [(2**n-1):0]y;
decnbit_for dec(.a(a),.y(y));
initial
begin
a = 3'b000;
$monitor("a = %b, y = %b",a,y);

#5 a = 3'b001;
#5 a = 3'b010;
#5 a = 3'b011;
#5 a = 3'bzzz;
#5 a = 3'b100;
#5 a = 3'b101;
#5 a = 3'b1x1;
#5 a = 3'bxxx;
#5 a = 3'b110;
#5 a = 3'b1z1;
#5 a = 3'b111;
end
endmodule

17.

8 : 3 Encoder using Behavioral For loop statement

module enc8to3_for(input [7:0]a, output reg [2:0]y);


integer i;
always@(a)
begin
for(i=0;i<8;i=i+1)
begin
if(a[i] == 1'b1)
y = i;
end
end
endmodule
Test Bench

module enc8to3_bh_tb;
reg [7:0]a;
wire [2:0]y;
enc8to3_for enc(.a(a),.y(y));
initial
begin
a = 8'b00000000;
$monitor("a = %b, y = %b",a,y);
#5 a = 8'b00000001;
#5 a = 8'b00000010;
#5 a = 8'b00000100;
#5 a = 8'b00001000;
#5 a = 8'b00010000;
#5 a = 8'b00100000;
#5 a = 8'b01000000;
#5 a = 8'b10000000;
end
endmodule

18.

4 bit Johnson Counter


a. Using Generate For loop statement

module jc_4bit_gen (input clk,rst, output [3:0]q);


wire [4:0]w;
assign w[4] = ~w[0];
genvar i;
generate
for(i=4;i>0;i=i-1)
begin:f1

dff_arst d1(.clk(clk),.rst(rst),.d(w[i]),.q(w[i-1]));
end
endgenerate
assign q = w[3:0];
endmodule
b. Using Behavioral Modeling
module jc_4bit_for(input clk,rst, output reg [3:0]q);
always@(posedge clk, negedge rst)
begin
if(!rst)
q <= {4{1'b0}};
else
q <= {~q[0],q[3:1]};
end
endmodule
Test Bench
module cntr4bit_syn_tb;
reg clk,rst;
wire [3:0]q;
jc_4bit_gen cntr(.clk(clk),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);
#32 rst = 1;
end
endmodule

19. n bit Johnson Counter


a. Using Generate For loop statement
module jc_nbit_gen #(parameter n = 8)(input clk,rst, output [n-1:0]q);
wire [n:0]w;
assign w[n] = ~w[0];
genvar i;
generate
for(i=n;i>0;i=i-1)
begin:f1
dff_arst d1(.clk(clk),.rst(rst),.d(w[i]),.q(w[i-1]));
end
endgenerate
assign q = w[n-1:0];
endmodule

b. Using Behavioral Modeling


module jc_nbit_for #(parameter n=8)(input clk,rst, output reg [n-1:0]q);
always@(posedge clk, negedge rst)
begin
if(!rst)
q <= {n{1'b0}};
else
q <= {~q[0],q[n-1:1]};
end
endmodule
Test Bench

module cntrnbit_syn_tb #(parameter n = 8);


reg clk,rst;
wire [n-1:0]q;
jc_nbit_gen cntr(.clk(clk),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);
#32 rst = 1;
#154 rst = 0;
#13 rst = 1;
#180 rst = 0;
#45 rst = 1;
end
endmodule

20. 4 bit Ring Counter


module rc_4bit_for(input clk,rst, output reg [3:0]q);
always@(posedge clk, negedge rst)
begin
if(!rst)

q <= {1'b1,3'b0};
else
q <= {q[0],q[3:1]};
end
endmodule
Test Bench
module cntr4bit_syn_tb;
reg clk,rst;
wire [3:0]q;
jc_4bit_gen cntr(.clk(clk),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);
#32 rst = 1;
end
endmodule

21.

n bit Ring Counter

module rc_nbit_for #(parameter n=8)(input clk,rst, output reg [n-1:0]q);


always@(posedge clk, negedge rst)

begin
if(!rst)
q <= {1'b1,{n-1{1'b0}}};
else
q <= {q[0],q[n-1:1]};
end
endmodule
Test Bench
module cntrnbit_syn_tb #(parameter n = 8);
reg clk,rst;
wire [n-1:0]q;
rc_nbit_for cntr(.clk(clk),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 0;
$monitor("clk=%b, rst=%b, q=%b", clk,rst,q);
#32 rst = 1;
#154 rst = 0;
#13 rst = 1;
#180 rst = 0;
#45 rst = 1;
end
endmodule

23 / 01 / 2015
22. T Flip flop in Behavioral Model
module tff(input t,clk,rst, output reg q);
always@(posedge clk, negedge rst)
begin
if(!rst)
q <= 1'b0;
else if(t==0)
q <= q;
else
q <= ~q;
end
endmodule
Test Bench
module tff_tb;
reg clk,rst,t;
wire q;
tff j1(.clk(clk),.t(t),.rst(rst),.q(q));
initial
clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
rst = 1'b0; t=1'b0;
$monitor("clk=%b,rst=%b,t=%b,q=%b",clk,rst,t,q);
#12 rst = 1'b1;
#14 t=1'b1;
#27 t=1'b0;
#24 t=1'b1;
end
endmodule

23. J FF with asynchronous reset using Behavioral Model


module jkff(input j,k,clk,rst, output reg q);
always@(posedge clk, negedge rst)
begin
if(!rst)
q <= 1'b0;
else if(j==0&&k==0)
q <= q;
else if(j==0&&k==1)
q <= 1'b0;
else if(j==1&&k==0)
q <= 1'b1;
else if(j==1&&k==1)
q <= ~q;
else
q <= q;
end
endmodule
Test Bench
module jkff_tb;
reg clk,rst,j,k;
wire q;
jkff j1(.clk(clk),.j(j),.k(k),.rst(rst),.q(q));
initial
clk = 1'b0;

always
#5 clk = ~clk;
initial
begin
rst = 1'b0; j=1'b0; k=1'b0;
$monitor("clk=%b,rst=%b,j=%b,k=%b,q=%b",clk,rst,j,k,q);
#12 rst = 1'b1;
#14 j=1'b1;
#17 k=1'b1;
#24 j=1'b0;
#27 k=1'b0;
#14 j=1'b0;
#17 k=1'b1;
end
endmodule

24. 4 : 1 MUX using only Conditional Operator


module mux4to1_cond (input [3:0]i, input [1:0]s, output y);
assign y = s[1] ? (s[0] ? i[3] : i[2]) : (s[0] ? i[1] : i[0]) ;
endmodule
Test Bench
module mux4to1_cond_tb;
reg [3:0]i;
reg [1:0]s;
wire y;
mux4to1_cond m1(.i(i),.s(s),.y(y));
initial
begin

i = 4b1010; s = 2b00;
$monitor(i = %b, sel = %b, y = %b,i,s,y);
#7 s = 2b01;
#5 s = 2b10;
#5 s = 2b11;
#5 i = 4b0101; s = 2b00;
#7 s = 2b01;
#5 s = 2b10;
#5 s = 2b11;
end
endmodule

25. n bit Loadable, clk enabled, UpDown Counter


module cntrnbit_load #(parameter n = 4)
(input [n-1:0]d, input clk,ce,load,updown, output reg [n-1:0]q);
always@(posedge clk)
begin
if(!ce)
q <= q;
else if(load)
q <= d;
else if(updown)
q <= q+1;
else
q <= q-1;
end
endmodule
Test Bench
module cntrnbit_load_tb #(parameter n = 4);
reg [n-1:0]d;
reg clk,ce,load,updown;
wire [n-1:0]q;
cntrnbit_load c1(.d(d),.clk(clk),.ce(ce),.load(load),.updown(updown),.q(q));
initial

clk = 1'b0;
always
#5 clk = ~clk;
initial
begin
ce = 0; load = 1; updown = 1; d = 4'b0011;
$monitor("clk=%b, ce =%b, load = %b, data = %b, updown = %b, q=
%b",clk,ce,load,d,updown,q);
#17 ce = 1;
#15 load = 0;
# 80 updown = 0;
#7 d = 4'b1100;
#10 updown = 1;
#55 load = 1;
end
endmodule

26. 1 : 4 DEMUX in Behavioral Modeling


a. To infer latches at the output
module demux1to4 (input i, input [1:0]sel, output reg [3:0]y);
always@(sel)
begin
if(sel == 2b00)
y[0] = i;
else if(sel == 2b01)
y[1] = i;
else

y[2] = i;
end
endmodule
b. Not to infer latches at the output
module demux1to4 (input i, input [1:0]sel, output reg [3:0]y);
always@(sel)
begin
if(sel == 2b00)
y[0] = i;
else if(sel == 2b01)
y[1] = i;
else if(sel == 2b10)
y[2] = i;
else if(sel == 2b11)
y[3] = i;
else
y = 4bx;
end
endmodule

27. a. 4 bit Parity Generator


module parity_gen(input [3:0]a, output y);
assign y = ^a;
endmodule
Test Bench
module parity_gen_tb;
reg [3:0]a;
wire y;
parity_gen pa1(.a(a),.y(y));
initial
begin
a = 4'b0000;
repeat(15)

begin
a = a + 4'b0001;
#10 $display("a=%b, y = %b,a,y);
end
end
endmodule

4 bit Parity Checker


module prity_check(input [4:0]a, output reg y);
always@(a)
begin
y = ^a;
if(y)
$display("error");
else
$display("No Error");
end
endmodule
Test Bench
module parity_check_tb;
reg [4:0]a;
wire y;
parity_check pa1(.a(a),.y(y));
initial
begin
a = 5'b00000;
repeat(31)
begin

a = a + 5'b00001;
#10 $display("a=%b, y = %b,a,y);
end
end
endmodule

27 / 01 / 2015
28.Pattern Detector ( FSM )
a. 1101
module fsm1101
(input x,clk,rst,
output reg y);
parameter GN = 2'b00,
GOT1 = 2'b01,
GOT11 = 2'b10,
GOT110 = 2'b11;
reg [1:0]state,next;
always@(posedge clk, negedge rst)
begin
if(!rst)
state <= GN;
else
state <= next;
end
always@(state,x)
begin

case(state)
GN:if(x)
begin
next = GOT1;
y = 1'b0;
end
else
begin
next = GN;
y = 1'b0;
end
GOT1:if(x)
begin
next = GOT11;
y = 1'b0;
end
else
begin
next = GN;
y = 1'b0;
end
GOT11:if(x)
begin
next = GOT11;
y = 1'b0;
end
else
begin
next = GOT110;
y = 1'b0;
end
GOT110:if(x)
begin
next = GOT1;

y = 1'b1;
end
else
begin
next = GN;
y = 1'b0;
end
endcase
end
endmodule
Test Bench
module fsm1101_tb;
reg clk,x,rst;
wire y;
fsm1101 f1(.clk(clk),.rst(rst),.x(x),.y(y));
initial
begin
clk=0;
end
always
begin
#5 clk=~clk;
end
initial
begin
rst = 1'b0;
#40 rst=1'b1;
#220 rst = 1'b0;
#20 rst = 1'b1;
end
initial
begin
#15 x=1;
#10 x=1;

#10 x=1;
#10 x=0;
#10 x=1;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=0;
#10 x=1;
#10 x=0;
#10 x=1;
#10 x=1;
end
endmodule

b. 0111
module fsm0111
(input x,clk,rst,
output reg y);
parameter GN = 2'b00,
GOT0 = 2'b01,
GOT01 = 2'b10,
GOT011 = 2'b11;
reg [1:0]state,next;
always@(posedge clk, negedge rst)
begin
if(!rst)
state <= GN;
else

state <= next;


end
always@(state,x)
begin
case(state)
GN:if(x)
begin
next = GN;
y = 1'b0;
end
else
begin
next = GOT0;
y = 1'b0;
end
GOT0:if(x)
begin
next = GOT01;
y = 1'b0;
end
else
begin
next = GOT0;
y = 1'b0;
end
GOT01:if(x)
begin
next = GOT011;
y = 1'b0;
end
else
begin
next = GOT0;
y = 1'b0;

end
GOT011:if(x)
begin
next = GN;
y = 1'b1;
end
else
begin
next = GOT0;
y = 1'b0;
end
endcase
end
endmodule
Test Bench
module fsm0111_tb;
reg clk,x,rst;
wire y;
fsm0111 f1(.clk(clk),.rst(rst),.x(x),.y(y));
initial
begin
clk=0;
end
always
begin
#5 clk=~clk;
end
initial
begin
rst = 1'b0;
#40 rst=1'b1;
#220 rst = 1'b0;
#20 rst = 1'b1;

end
initial
begin
#15 x=1;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=0;
#10 x=0;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=1;
end
endmodule

c. 1110
module fsm_1110
(input x,clk,rst,
output reg y);

parameter GN = 2'b00,
GOT1 = 2'b01,
GOT11 = 2'b10,
GOT111 = 2'b11;
reg [1:0]state,next;
always@(posedge clk, negedge rst)
begin
if(!rst)
state <= GN;
else
state <= next;
end
always@(state,x)
begin
case(state)
GN:if(x)
begin
next = GOT1;
y = 1'b0;
end
else
begin
next = GN;
y = 1'b0;
end
GOT1:if(x)
begin
next = GOT11;
y = 1'b0;
end
else
begin
next = GN;
y = 1'b0;

end
GOT11:if(x)
begin
next = GOT111;
y = 1'b0;
end
else
begin
next = GN;
y = 1'b0;
end
GOT111:if(x)
begin
next = GOT111;
y = 1'b0;
end
else
begin
next = GN;
y = 1'b1;
end
endcase
end
endmodule
Test Bench
module fsm_1110_tb;
reg clk,x,rst;
wire y;
fsm_1110 f1(.clk(clk),.rst(rst),.x(x),.y(y));
initial
begin
clk=0;
end
always

begin
#5 clk=~clk;
end
initial
begin
rst = 1'b0;
#40 rst=1'b1;
#220 rst = 1'b0;
#20 rst = 1'b1;
end
initial
begin
#15 x=1;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=0;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=0;
#10 x=0;
#10 x=1;
#10 x=1;
#10 x=1;
#10 x=1;
end
endmodule

You might also like