Introduction to Verilog

Preview:

DESCRIPTION

Introduction to Verilog. Multiplexers. Introduction to Verilog. Verilog Hardware Description Language (Verilog HDL) released by Gateway Design Automation in 1983 Cadence buys Gateway in 1989 Cadence releases Verilog HDL to the public domain in 1990 - PowerPoint PPT Presentation

Citation preview

Introduction to Verilog

Multiplexers

Introduction to Verilog

• Verilog Hardware Description Language (Verilog HDL) released by Gateway Design Automation in 1983

• Cadence buys Gateway in 1989

• Cadence releases Verilog HDL to the public domain in 1990

• Verilog adopted by the IEEE as IEEE standard 1364 in 1995

Combinational Circuit Example

n-line 2-to-1 Multiplexer

n-line

2 x 1 MUX

a(n-1:0)

b(n-1:0)y(n-1:0)

sel

sel y

0 a

1 b

An n-line 2 x 1 MUX

a(n-1:0)

b(n-1:0)

y(n-1:0)

sel

n-line2 x 1MUX

module mux2p(a,b,sel,y);

parameter width = 2;

input [width-1:0] a;

input [width-1:0] b;

input sel;

output [width-1:0] y;

reg [width-1:0] y;

always @(sel, a, b)

begin

if(sel == 0)

y = a;

else

y = b;

end

endmodule

parameter statement defines width of bus

module mux2p(a,b,sel,y);

parameter width = 2;

input [width-1:0] a;

input [width-1:0] b;

input sel;

output [width-1:0] y;

reg [width-1:0] y;

always @(sel, a, b)

begin

if(sel == 0)

y = a;

else

y = b;

end

endmodule

module name

always sensitivity list

Sequential statements (if…else) must be in

an always block

Note optional begin…end

in always block

An n-line 2 x 1 MUX

reg defines y as a variable

module mux2p(a,b,sel,y);

parameter width = 2;

input [width-1:0] a;

input [width-1:0] b;

input sel;

output [width-1:0] y;

reg [width-1:0] y;

always @(sel, a, b)

begin

if(sel == 0)

y = a;

else

y = b;

end

endmodule

Note: = is a blocking assignment

An n-line 2 x 1 MUX

Note: == is

logical equality operator

Digilab2 – DIO1 Boards

Spartan IIFPGA

8 LEDsLD

8 SwitchesSW4 Pushbuttons

BTN

Four 7-segmentdisplays

Pushbuttonbn

74HC373 latch ldg <= ‘1’

Top-level Design – Lab 1

a(3:0)

b(3:0)

mux2g

Lab1

sel

ySW(1:4)

SW(5:8)

LD(1:4)

BTN4

ldg‘1’

a(3:0)

b(3:0)

mux2g

Lab1

sel

ySW(1:4)

SW(5:8)

LD(1:4)

BTN4

ldg‘1’

module Lab1v(SW,BTN4,ldg,LD);

input [1:8] SW;

input BTN4;

output ldg;

output [1:4] LD;

mux2p SWmux(.a(SW[1:4]),.b(SW[5:8]),.sel(BTN4),.y(LD));

defparam SWmux.width = 4;

assign ldg = 1; // enable 74HC373 latch

endmodule

module Lab1v(SW,BTN4,ldg,LD);

input [1:8] SW;

input BTN4;

output ldg;

output [1:4] LD;

mux2p SWmux(.a(SW[1:4]),.b(SW[5:8]),.sel(BTN4),.y(LD));

defparam SWmux.width = 4;

assign ldg = 1; // enable 74HC373 latch

endmodule

a(3:0)

b(3:0)

mux2g

Lab1

sel

ySW(1:4)

SW(5:8)

LD(1:4)

BTN4

ldg‘1’

module Lab1v(SW,BTN4,ldg,LD);

input [1:8] SW;

input BTN4;

output ldg;

output [1:4] LD;

mux2p SWmux(.a(SW[1:4]),.b(SW[5:8]),.sel(BTN4),.y(LD));

defparam SWmux.width = 4;

assign ldg = 1; // enable 74HC373 latch

endmodule

a(3:0)

b(3:0)

mux2g

Lab1

sel

ySW(1:4)

SW(5:8)

LD(1:4)

BTN4

ldg‘1’

Note: assign statement used for

concurrent logic equations

Note: defparam statement

used to override parameter width

An n-line 4 x 1 multiplexer

a(n-1:0)

b(n-1 :0)y(n-1 :0)

sel(1:0)

n-line4 x 1MUXc(n-1 :0)

d(n-1 :0)

Sel y

“00” a

“01” b

“10” c

“11” d

An n-line 4 x 1 multiplexer module mux4p(a,b,c,d,sel,y);

parameter width = 4;

input [width-1:0] a,b,c,d;

input [1:0] sel;

output [width-1:0] y;

reg [width-1:0] y;

always @(sel, a, b, c, d)

case(sel)

0: y = a;

1: y = b;

2: y = c;

3: y = d;

default: y = a;

endcase

endmodule

Must include ALL posibilities

in case statement

Signals can have values0, 1, z, x

sel y

“00” a

“01” b

“10” c

“11” d

Note: default

is decimal

module Lab1bv(SW,BTN,ldg,LD);

input [1:8] SW;

input [1:2] BTN;

output ldg;

output [1:2] LD;

mux4p SWmux(.a(SW[1:2]),.b(SW[3:4]),

.c(SW[5:6]),.d(SW[7:8]),.sel(BTN),.y(LD));

defparam SWmux.width = 2;

assign ldg = 1; // enable 74HC373 latch

endmodule

Top-level design

Verilog Always Block

always @(<sensitivity list>)begin <sequential statements>end

Within an always block:

Variables (reg) are assigned using = (Blocking)

and are updated immediately. (Used for combinational signals)

Sequential signals are assigned using <= (Non-blocking)

and are updated at the end of the always block.

Recommended