Verilog Code
module counter(Resetn,clock,En,count2,updown, Q);
input Resetn,clock,En,count2,updown;
output reg [3:0] Q;
always @( negedge Resetn, posedge clock)
if (!Resetn)
Q<=0;
else if (En)
if( count2) //if count2=1 then Q=Q+2
Q<= Q+2'b10;
else if (updown) //if count2=0 then Q<=Q+1 if updown=1 else Q<=Q-1 if updown=0;
Q<=Q+1;
else
Q<=Q-1;
endmodule
Test_bench
module tb_v;
// Inputs
reg Resetn;
reg clock;
reg En;
reg count2;
reg updown;
// Outputs
wire [3:0] Q;
// Instantiate the Unit Under Test (UUT)
counter uut (
.Resetn(Resetn),
.clock(clock),
.En(En),
.count2(count2),
.updown(updown),
.Q(Q)
);
initial begin
// Initialize Inputs
Resetn = 0;
clock = 0;
En = 1'b1;
count2 = 1'b1;
updown = 0;
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
end
always # 5 clock=~clock;
always # 100 updown =~updown;
always # 400 Resetn=~Resetn;
always # 80 count2=~count2;
endmodule
module counter(Resetn,clock,En,count2,updown, Q);
input Resetn,clock,En,count2,updown;
output reg [3:0] Q;
always @( negedge Resetn, posedge clock)
if (!Resetn)
Q<=0;
else if (En)
if( count2) //if count2=1 then Q=Q+2
Q<= Q+2'b10;
else if (updown) //if count2=0 then Q<=Q+1 if updown=1 else Q<=Q-1 if updown=0;
Q<=Q+1;
else
Q<=Q-1;
endmodule
Test_bench
module tb_v;
// Inputs
reg Resetn;
reg clock;
reg En;
reg count2;
reg updown;
// Outputs
wire [3:0] Q;
// Instantiate the Unit Under Test (UUT)
counter uut (
.Resetn(Resetn),
.clock(clock),
.En(En),
.count2(count2),
.updown(updown),
.Q(Q)
);
initial begin
// Initialize Inputs
Resetn = 0;
clock = 0;
En = 1'b1;
count2 = 1'b1;
updown = 0;
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
end
always # 5 clock=~clock;
always # 100 updown =~updown;
always # 400 Resetn=~Resetn;
always # 80 count2=~count2;
endmodule
No comments:
Post a Comment