Starting from:
$30

$24

Lab Sheet 3 Solution

Learning Objectives:

Introduction to Sequential circuits
Blocking and Non-Blocking Assignments



Sequential and Parallel blocks
Finite State Machine Implementation (Mealy Machine)
4-bit Shift Register Implementation



Introduction:




In the first two labs, we have learned how to simulate digital circuits using different types of modeling (i.e. Gate level, Data flow, Behavioral) on combinational circuit simulation in VeriLog. In this lab, we will learn how to simulate digital circuits using different types of modeling on sequential circuit simulation in VeriLog.




A Sequential circuit is a circuit made up by combining logic gates such that the required logic at the output(s) depends not only on the current input logic conditions but also on the past inputs, outputs and sequences.




















































Sequential Circuits has a feedback of the output(s) from a stage to the input of either that stage or any previous stage.




Problem 1:




module dff_sync_clear(d, clearb,




clock, q);







input d, clearb, clock;




output q;

reg q;




always @ (posedge clock)

begin




if (!clearb) q <= 1'b0; else q <= d; end




endmodule




module dff_async_clear(d , clearb, clock, q);







input d, clearb, clock;

output q;

reg q;




always @ (negedge cle arb or posedge clock) begin




if (!clearb) q <= 1’b0; else q <= d; end




endmodule







// Test Bench




module Testing;




reg d, clk, rst;

wire q;




dff_sync_clear dff (d, clk, rst, q); // Or dff_async_clear dff (d, clk, rst, q);




//Always at rising edge of clock display the signals always @(posedge clk)begin




$display("d=%b, clk=%b, rst=%b, q=%b\n", d, clk, rst, q); end




//Module to generate clock with period 10 time units

initial begin




forever begin

clk=0;

#5

clk=1;

#5




clk=0;

end

end

initial begin

d=0; rst=1;




#4

d=1; rst=0;

#50

d=1; rst=1;

#20




d=0; rst=0;

end

endmodule

1.Evaluate a|b, but differ assignment of x.

2.Evaluate a^b^c, but differ assignment of y.

3.Evaluate b& ~c, but differ assignment of z.

4.Assign x, y, and z with their new values




Blocking and Non-Blocking Assignments:

In Blocking assignment, evaluation and assignment are immediate.




always @ (a or b or c) begin

x = a | b;




y = a ^ b ^ c; z = b & ~c; end










1.Evaluate a|b, assign result to x.




2.Evaluate a^b^c, assign result to y.




3.Evaluate b& ~c, assign result to z.









In Nonblocking assignment, all assignments deferred until all right-hand sides have been evaluated (end of simulation timestep).




always @ (a or b or c)

begin




x <= a | b;




y <= a ^ b ^ c; z <= b & ~c; end


















DQ
q1
DQ
q2
DQ




in










out







































































































module nonblocking(in, clk,
module blocking(in, clk,
out);
out);
input in, clk;
input in, clk;
output out;
output out;
reg q1, q2, out;
reg q1, q2, out;
always @ (posedge clk)
always @ (posedge clk)
begin
begin
q1 <= in;
q1 = in;
q2 <= q1;
q2 = q1;
out <= q2;
out = q2;
end
end
endmodule
endmodule
Sequential Block and Parallel Block
In verilog, we have two types of block – sequential blocks and parallel blocks.




Sequential Block




In the sequential blocks, begin and end keywords are used to group the statements, All the statement in this group executes sequentially. ( this rule is not applicable for nonblocking assignments). If the statements are given with some timing/delays then the given delays get added into. It would be clearer with following examples.






Example - 1:






Example - 2:
















reg a,b,c;




reg a,b,c;


initial




initial


begin




begin


a = 1'b1;




#5 a = 1'b1;


b = 1'b0;




#10 b = 1'b0;


c = 1'b1;




#15 c = 1'b1;


end




end

















The Example - 1 is showing the sequential block without delays, All the statements written inside the begin-end will execute sequentially and after the execution of initial block, final values are a=1, b=0 and c=1




The Example - 2 is showing the sequential block with delays, In this case, the same statements are given with some delays, Since All the statements execute sequentially, the a will get value 1 after 5 time unit, b gets value after 15 time unit and c will take value 1 after 30 time unit







Parallel Block:




The statements are written inside the parallel block, execute parallel, If the sequencing is required then it can be given by providing some delays before the statements. In parallel blocks, all the statements occur within fork and join






Example - 1:








Example - 2:


reg a,b,c;








reg a,b,c,d;




initial






initial


fork






begin


#5 a = 1′b1;






fork


#10 b = 1′b0;






#5 a = 1′b1;


#15 c = 1′b1;






#10 b = 1′b0;


join






#15 c = 1′b1;












join
Mealy Machine:






#30 d = 1′b0;












end



















In Example-1, all the statements written inside the fork and join, executes parallel, it means the c with have value ‘1′ after 15 time unit.
In Example-2, the initial block contains begin-end and fork-join both. In this case c takes value after 15 time unit, and d takes the value after 30 time unit.







Mealy Machine:




A Mealy machine is a finite state transducer that generates an output based on its current state and input. This means that the state diagram will include both an input and output signal for each transition edge.












































































Solution:




module mealy( clk, rst, inp, outp);




input clk, rst, inp;

output outp;

reg [1:0] state;

reg outp;




always @( posedge clk, posedge rst ) begin if( rst ) begin




state <= 2'b00;

outp <= 0;

end




else begin

case( state )

2'b00: begin

if( inp ) begin




state <= 2'b01;

outp <= 0;

end

else begin

state <= 2'b10;

outp <= 0;

end

end




2'b01: begin

if( inp ) begin




state <= 2'b00;

outp <= 1;

end

else begin




state <= 2'b10;

outp <= 0;

end




end




2'b10: begin

if( inp ) begin




state <= 2'b01;

outp <= 0;

end

else begin




state <= 2'b00;

outp <= 1;

end

end




default: begin




state <= 2'b00;

outp <= 0;

end

endcase




end

end

endmodule




Test Bench module mealy_test;



reg clk, rst, inp;




wire outp;

reg[15:0] sequence;

integer i;




mealy duty( clk, rst, inp, outp);




initial

begin

clk = 0;

rst = 1;

sequence = 16'b0101_0111_0111_0010;

#5 rst = 0;




for( i = 0; i <= 15; i = i + 1)

begin




inp = sequence[i];

#2 clk = 1;

#2 clk = 0;




$display("State = ", duty.state, " Input = ", inp, ", Output = ", outp);

end




testing;

end




task testing;

for( i = 0; i <= 15; i = i + 1)




begin




inp = $random % 2;

#2 clk = 1;

#2 clk = 0;




$display("State = ", duty.state, " Input = ", inp, ", Output = ", outp);

end

endtask

endmodule




Problem 2: Implementing a 4-bit Shift Register




An n-bit shift register is generally comprised of a set of n flip-flops which provide n bits of storage. The flip-flops are connected in such a way as to produce a shifting action of the bits stored in the individual flip-flops. The bits shift at the active portion of the system clock which is usually a clock edge.




Following figure shows a 4-bit shift register that uses D flip-flops for the individual storage elements.


































Figure 1: Diagram for a 4-bit shift register.




Solution:




//VeriLog Code for 4 bit Shift Register.




module shiftreg(EN, in, CLK, Q);

parameter n = 4;

input EN;

input in;




input CLK;

output [n-1:0] Q;

reg [n-1:0] Q;




initial

Q=4'd10;

always @(posedge CLK)

begin

if (EN)

Q={in,Q[n-1:1]};

end

endmodule




Test Bench of 4 bit shift register module shiftregtest;



parameter n= 4;

reg EN,in , CLK;

wire [n-1:0] Q;

//reg [n-1:0] Q;




shiftreg shreg(EN,in,CLK,Q);




initial

begin

CLK=0;




end




always

#2 CLK=~CLK;

initial

$monitor($time,"EN=%b in= %b Q=%b\n",EN,in,Q);

initial

begin

in=0;EN=0;

#4 in=1;EN=1;

#4 in=1;EN=0;

#4 in=0;EN=1;

#5 $finish;

end




endmodule




Exercises:




(Q.1) Implement Binary 4-bit Synchronus counter using J-K Flip Flops. Verify the design by writing a testbench module.











































(Q.2.) Design a FSM (Finite State Machine) to detect a sequence 10110.



































































(Q.3.) Design and implement a four-bit serial adder. Make use of four-bit shift register constructed in Problem 2. Verify the design by writing a testbench module.

More products