Logic Design Review – 3 Basic Sequential Circuits Lecture L14.3 Verilog.

Post on 20-Dec-2015

232 views 6 download

Tags:

Transcript of Logic Design Review – 3 Basic Sequential Circuits Lecture L14.3 Verilog.

Logic Design Review – 3 Basic Sequential Circuits

Lecture L14.3

Verilog

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

R-S Latch

R-S Latch

R

S

Q

Q is set to 1 when S is asserted, and remains unchanged when S is disasserted.

Q is reset to 0 when R is asserted, and remains unchanged when R is disasserted.

Assertions can be active HIGH or active LOW

R-S Latch

R

S

Q

Active HIGH

module RSlatch ( Q ,R ,S );

input R ;wire R ;input S ;wire S ;

output Q ;reg Q ;

always @(R or S) begin

if(S == 1 && R == 0)Q = 1;

else if(S == 0 && R == 1)Q = 0;

end endmodule

R-S Latch -- Active High

R-S Latch

R

S

Q

Active LOW

module RSlatch ( Q ,R ,S );

input R ;wire R ;input S ;wire S ;

output Q ;reg Q ;

always @(R or S) begin

if(S == 0 && R == 1)Q = 1;

else if(S == 1 && R == 0)Q = 0;

end endmodule

R-S Latch -- Active Low

F1

F2

R

S

Q

Note that this is different from the "textbook" RS latch

module RSlatchNOR ( Q ,R ,S );

input R ;wire R ;input S ;wire S ;

output Q ;wire Q ;wire F1, F2;

nor #10 (F1,F2,R);nor #10 (F2,F1,S);

assign Q = F1; endmodule

10ns propagation delay

F1

F2

R

S

QR S Q0 0 Q0 store0 1 1 set1 0 0 reset1 1 0 disallowed

How can you make this R-S latch from gates?

R-S Latch

R

S

Q

Q is set to 1 when S is asserted, and remains unchanged when S is disasserted.

Q is reset to 0 when R is asserted, and remains unchanged when R is disasserted.

Assertions can be active HIGH or active LOW

R S Q Q0 0 0 00 0 1 10 1 0 10 1 1 11 0 0 01 0 1 01 1 0 01 1 1 1

R-S LatchR

S

Q

Q is set to 1 when S is asserted (1), and remains unchanged when S is disasserted (0).

Q is reset to 0 when R is asserted (1), and remains unchanged when R is disasserted (0).

RSQ

00 01 11 10

0

1

Q = ~R & Q | ~R & S | S & Q

1 1

1

1store

set

reset

store

Q

S

R

R S Q Q0 0 0 00 0 1 10 1 0 10 1 1 11 0 0 01 0 1 01 1 0 01 1 1 1

Q = ~R & Q | ~R & S | S & Q

store

set

reset

store

R-S LatchR

S

Q

RS Latch

module RSlatchGates ( Q ,R ,S );

input R ;wire R ;input S ;wire S ;

output Q ;wire Q ;

assign #10 Q = ~R & Q | ~R & S | S & Q; endmodule

Q

S

R

Q

S

R

D Latch

D Latch

D

EN

Q

Q follows D when EN is high, and remains unchanged when EN is low..

D Latch

D

EN

Q

module Dlatch ( Q ,EN ,D );

input EN ;wire EN ;input D ;wire D ;

output Q ;reg Q ;

always @(D or EN)if(EN == 1) Q = D;

endmodule

D Latch

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

D Flip-Flop

0 0 11 1 0X 0 Q0 !Q0

D clk Q !Q

D gets latched to Q on the rising edge of the clock.

Positive edge triggered

always @(posedge clk)Q <= D;

Behavior

clk

D Q

!Q

clk

D Q

!Q

module DFF (D, clk, Q, notQ );

input clk ;wire clk ;input D ;wire D ;

output Q ;reg Q ;output notQ ;wire notQ ;

always @(posedge clk)Q <= D;

assign notQ = ~Q;

endmodule

DFF.v

Note non-blocking assignment

D Flip-Flop

module DFFclr (D, clk, clr, Q, notQ );

input clk ;wire clk ;input clr ;wire clr ;input D ;wire D ;

output Q ;reg Q ;output notQ ;wire notQ ;

always @(posedge clk or posedge clr)if(clr == 1)

Q <= 0;else

Q <= D;

assign notQ = ~Q;

endmodule

clk

D Q

!Qclk

D Q

!Q

clr

DFFclr.v

Asynchronous clear

D Flip-Flop with Asynchronous Clear

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

A 1-Bit Register

reg1Q0

!Q0

LOAD

INP0

CLK

Behavior

always @(posedge clk) if(LOAD == 1)

Q0 <= INP0;

A 4-Bit Register

reg1Q0

!Q0

LOAD

INP0

reg1Q1

!Q1INP1

reg1Q2

!Q2INP2

reg1Q3

!Q3INP3

CLK

reg1Q0

!Q0

LOAD

INP0

CLK

// An n-bit register with asynchronous clear and load

module register(clk,clr,load,d,q);parameter n = 8;input [n-1:0] d;input clk,clr,load;output [n-1:0] q;reg [n-1:0] q;

always @(posedge clk or posedge clr) if(clr == 1)

q <= 0; else if(load)

q <= d;

endmodule

q(n-1 downto 0)

clk clr

load

d(n-1 downto 0)

reg

A Generic Register

q(n-1 downto 0)

clk clr

load

d(n-1 downto 0)

reg

A Generic Register

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

3-Bit Counter

always @(posedge clk or posedge clr) begin if(clr == 1)

Q <= 0; else

Q <= Q + 1; end

Behavior

count3clr

clkQ(2 downto 0)

module counter3 (clk, clr, Q );

input clr ;wire clr ;input clk ;wire clk ;

output [2:0] Q ;reg [2:0] Q ;

// 3-bit counteralways @(posedge clk or posedge clr) begin if(clr == 1)

Q <= 0; else

Q <= Q + 1; end

endmodule

counter3.v

Asynchronous clear

Output count incrementson rising edge of clk

counter3 Simulation

Clock DividerClk4 = 4 MHz clock

Q3CLK

Clock DividerCounter Q7..Q0

4 MHz Clock

Q3CLK

Q3CLK

Clock DividerCounter Q7..Q0

4 MHz Clock

Clock DividerCounter Q7..Q0

4 MHz Clock

Q1

Q0

1.0 MHz

Q2 0.5 MHz

Q3 0.25 MHz

2.0 MHz

Clock 4.0 MHz

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

4-Bit Shift Register

CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q

data_in

CLK

Q0Q1Q2Q3

shift4.vmodule ShiftReg(clk,clr,data_in,Q); input clk; input clr; input data_in; output [3:0] Q;

reg [3:0] Q;

// 4-bit Shift Register always @(posedge clk or posedge clr)begin if(clr == 1)

Q <= 0; else

begin Q[3] <= data_in; Q[2:0] <= Q[3:1];end

endendmodule

CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q

data_in

CLK

Q0Q1Q2Q3

Note non-blocking assignment

shift4 simulation

Ring Counter

CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q

CLK

Q0Q1Q2Q3

ring4.vmodule ring4(clk,clr,Q); input clk; input clr; output [3:0] Q;

reg [3:0] Q;

// 4-bit Ring Counter always @(posedge clk or posedge clr)begin if(clr == 1)

Q <= 1; else

begin Q[3] <= Q[0]; Q[2:0] <= Q[3:1];end

endendmodule

ring4 simulation

Johnson Counter

CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q

CLK

Q3 Q2 Q1 Q0

module johnson4(clk,clr,Q); input clk; input clr; output [3:0] Q;

reg [3:0] Q;

// 4-bit Johnson Counter always @(posedge clk or posedge clr)begin if(clr == 1)

Q <= 0; else

begin Q[3] <= ~Q[0]; Q[2:0] <= Q[3:1];end

endendmodule

johnson4.v

Johnson Counter

CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q

CLK

Q3 Q2 Q1 Q0

A Random Number Generator

CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q CLK

D Q

!Q

CLK

Q3 Q2 Q1 Q0

Q3 Q2 Q1 Q0

0 0 0 1 11 0 0 0 81 1 0 0 C1 1 1 0 E1 1 1 1 F0 1 1 1 71 0 1 1 B0 1 0 1 5

Q3 Q2 Q1 Q0

1 0 1 0 A1 1 0 1 D0 1 1 0 60 0 1 1 31 0 0 1 90 1 0 0 40 0 1 0 20 0 0 1 1

module rand4(clk,clr,Q); input clk; input clr; output [3:0] Q;

reg [3:0] Q;

// 4-bit Random number generator always @(posedge clk or posedge clr)begin if(clr == 1)

Q <= 1; else

begin Q[3] <= Q[3] ^ Q[0]; Q[2:0] <= Q[3:1];end

endendmodule

rand4.v

A Random Number Generator

clk

inp

Q2

Q0

Q1

outp

Clock Pulse

module clk_pulse(clk,clr,inp,outp); input clk; input clr; input inp; output outp;

wire outp; reg [2:0] Q;

// clock pulse generator always @(posedge clk or posedge clr)begin if(clr == 1)

Q <= 0; else

begin Q[2] <= inp; Q[1:0] <= Q[2:1];end

endassign outp = Q[2] & Q[1] & ~Q[0];

endmodule

clk_pulse.v

clk

inpQ2

Q0Q1

outp

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

a square delta

outreg

<= D2M1

+2+

clr

clk

clr

clk

clr

clk

clr

clkoutld

ald sqld dld

lteflg

R(3:0)

delta(4:0)

SW(7:0)

4

58 9

DatapathControl Unit

lteflg

clr clk clr clk

ald

R[3:0]

S[7:0]

outld

dld

sqld

start

Lab 8

unsigned long sqrt(unsigned long a){ unsigned long square = 1; unsigned long delta = 3; while(square <= a){

square += delta; delta += 2;

} return (delta/2 - 1);}

Basic Sequential Circuits

• Latches

• Flip-Flops

• Registers

• Counters

• Shift Registers

• Datapaths

• State Machines

A canonical sequential network

clear

clk

Presentstate

Nextstate

Presentinput

Presentoutput

x(t)

s(t)s(t+1)

z(t)S

tate

Re

gist

er

Com

bina

tiona

lN

etw

ork

A Mealy state machine

clear

clk

Presentstate

Nextstate

Presentinput Present

output

x(t)

s(t)

s(t+1)

z(t)

Sta

te R

egis

ter

C1

C2

A Moore state machine

C1 C2

clear

clk

Presentstate

Nextstate

Presentinput

Presentoutputx(t)

s(t)

s(t+1)

z(t)

Sta

te R

egis

ter

SQRTctl

start

test

updatedone

!strt

strt

lteflg

!lteflgsquare += delta

delta += 2

delta / 2 - 1

start

test

updatedone

!strt

strt

lteflg

!lteflgsquare += delta

delta += 2

delta / 2 - 1

a square delta

outreg

<= D2M1

+2+

clr

clk

clr

clk

clr

clk

clr

clkoutld

ald sqld dld

lteflg

R(3:0)

delta(4:0)

SW(7:0)

4

58 9

DatapathControl Unit

lteflg

clr clk clr clk

ald

R[3:0]

S[7:0]

outld

dld

sqld

start

Lab 8

A Moore state machine

C1 C2

clear

clk

Presentstate

Nextstate

Presentinput

Presentoutputx(t)

s(t)

s(t+1)

z(t)

Sta

te R

egis

ter

start

test

updatedone

!strt

strt

lteflg

!lteflgsquare += delta

delta += 2

delta / 2 - 1

// Square root controlmodule SQRTctrl(Clk, Clear, lteflg, strt, ald,

sqld, dld, outld); input Clk, Clear, lteflg, strt;output ald, sqld, dld, outld;reg ald, sqld, dld, outld;reg[1:0] present_state, next_state;parameter start = 2'b00, test = 2'b01,

update = 2'b10, done = 2'b11;

// State registeralways @(posedge Clk or posedge Clear) begin if (Clear == 1) present_state <= start; else present_state <= next_state; end

A Moore state machine

C1 C2

clear

clk

Presentstate

Nextstate

Presentinput

Presentoutputx(t)

s(t)

s(t+1)

z(t)

Sta

te R

egis

ter

start

test

updatedone

!strt

strt

lteflg

!lteflgsquare += delta

delta += 2

delta / 2 - 1

// C1: next statealways @(present_state or start or lteflg) begin case(present_state)

strt: if(strt == 1) next_state <= test; else next_state <=start;test: if(lteflg == 1) next_state <= update; else next_state <= done;update: next_state <= test;done: next_state <= done;default next_state <= start;

endcase end

A Moore state machine

C1 C2

clear

clk

Presentstate

Nextstate

Presentinput

Presentoutputx(t)

s(t)

s(t+1)

z(t)

Sta

te R

egis

ter

// C2: outputsalways @(present_state) begin case(present_state)

strt: beginald = 1; sqld = 0; dld = 0; outld = 0;

endtest: begin

ald = 0; sqld = 0; dld = 0; outld = 0;end

update: begin ald = 0; sqld = 1; dld = 1; outld = 0;

enddone: begin

ald = 0; sqld = 0; dld = 0; outld = 1;end

default begin ald = 0; sqld = 0; dld = 0; outld = 0; end

endcase end endmodule

a square delta

outreg

<= D2M1

+2+

clr

clk

clr

clk

clr

clk

clr

clkoutld

ald sqld dld

lteflg

R(3:0)

delta(4:0)

SW(7:0)

4

58 9

start

test

updatedone

!strt

strt

lteflg

!lteflgsquare += delta

delta += 2

delta / 2 - 1

a square delta

outreg

<= D2M1

+2+

clr

clk

clr

clk

clr

clk

clr

clkoutld

ald sqld dld

lteflg

R(3:0)

delta(4:0)

SW(7:0)

4

58 9

DatapathControl Unit

lteflg

clr clk clr clk

ald

R[3:0]

S[7:0]

outld

dld

sqld

start

Lab 8