.


:




:

































 

 

 

 


2. Verilog




 

Verilog. . Verilog . , , . Verilog, Verilog.

Verilog Verilog, Verilog-XL simulator. , $, Verilog-XL simulator Verilog.

Verilog . , , Verilog. , Verilog - , , . , , .

 

 

(module) Verilog. , . , , 32- , , .

, , (. 2.1).

add2bit . (wire). . , "always... begin" "end". , , .

,----------------------------------------------------------.

| module add2bit (in1, in2, sum); |

| input in1, in2; |

| output[1:0] sum; |

| wire inl, in2; |

| reg[1:0] sum; |

| |

| always @ (inl or in2) begin |

| sum = inl + in2; |

| $display ("The sum of %b and %b is %0d (time = %0d)",|

| inl, in2, sum, $time); |

| end |

| endmodule |

`----------------------------------------------------------'

.2.1

add2bit , , . . 2.2 .

(header), (module name) . , . () , () . (wire), , , .

 

,-------------------------------------------------------------.

| module <_> < />; |

| < /> |

| < > |

| |

| <_> |

|... |

| <_> |

| |

| endmodule |

`-------------------------------------------------------------'

 

.2.2

 

.2.3 <_>. , , .

- . ,

wire[7:0] result;

assign result = op1 + op2;

wire[7:0] result = op1 + op2;

result op1 op2. , op1 op2 , result .

- . ,

fulladd f1 (cin0, a0, b0, sum0, cout0);

fulladd f2 (cout0, a1, b1, sum1, cout2);

fulladd , f1 f2. . , .

, . - Verilog, AND, OR .. , , Verilog, , .

Verilog, "initial" "always". ( , ) . "initial" . ,

initial

i = 0;

i 0 . "always" . ,

always

#10 i = i + 1;

i 1 10 .

Verilog.

 

 

 

, Verilog , , (variables), . Verilog , ,

 

'

 

- , , - , b,B,d,D,o,O,h H.

b ,

,

D d ,

H h .

B b , o , D d , H h .

, , , . :

 

15 ( 15)

'h15 ( 21, 15)

5'b10011 ( 19, 10011)

12'h01F ( 31, 01F)

 

(, "mystring") ASCII. , "ab" 16'h5758.

Verilog reg (), wire (), integer (), real (), event () time (). integer, float, time event , reg wire . Wire , reg . reg, wire , 1. reg wire : 1, 0, x z. , , , . z . reg wire .

:

 

integer i, j; //

real f, d; //

wire [7:0] bus; // 8-

// bus ()

reg [0:15] word; // 16-

// word ()

event trigger,clock_high; //

time t_setup,t_hold; // t1, t2

 

C reg wire :

reg [15:0] word;

reg [7:0] byte;

...

word[0] =... //

// word

byte =... +word[15:8]; // word

... word... // word[15:0]

Verilog:

 

i = i + j;

assign bus = word[15:8] + word[7:0];

f = (g + 1.2) * 3.29E-5;

@e1 #5 ->e2; // 1

// 5

// 2

if ($time - t1 < t2) error ("timing violations");

 

- 32- , . time 64- . event time " ".

Verilog , array (), . :

 

integer num[99:0]; // 100

reg [7:0]mem[0:1024]; // 1024

reg [10*8:1]names[20]; // 20

// names,

// 10 ,

// 8-

 

, , word[i] i- word i- word, , word. :

 

reg [15:0] array [0:10];

reg [15:0]temp;

...

temp = array[3];

...temp[7:5]

 

 

 

Verilog . (++) (--). .2.3 Verilog. .2.6 .

 

,----------------------------------------------------.

| + - * / ( ) |

| > >= < <= ( ) |

|! && || ( ) |

| ==!= ( ) |

|?: () |

| { } () |

| % ( " ") |

| ===!== () |

| ~ & | (-) |

| << >> () |

`----------------------------------------------------'

 

.2.3

 

. , "+varname" varname. "^varname", varname, .

^word === 'bx // , word ,

//

&word == 0 // , word ,

// 0

 

 

-----------. ||, && |, &

 

| -------------------------------------

. | 1) &,|

-----------' , ,

-

& |. - -

.

2) &&, || : -

,

1, - 0, -

& |

; -

.

 

 

. , 0 1 ( z) . , z, Verilog "===" "!==". .2.4 "==" "===".

,-------------------------------------------------------.

| module equ_equ; |

| |

| initial begin |

| $display ("'bx == 'bx is %b", 'bx == 'bx); |

| $display ("'bx === 'bx is %b", 'bx === 'bx); |

| $display ("'bz!= 'bx is %b", 'bz!= 'bx); |

| $display ("'bz!== 'bx is %b", 'bz!== 'bx); |

| end |

| |

| endmodule |

`-------------------------------------------------------'

 

.2.4 " == " " ==="

 

equ_equ :

 

'bx == 'bx is x

'bx === 'bx is 1

'bz!= 'bx is x

'bz!== 'bx is 1

 

, , . ( ) { }, :

 

{2'b1x, 4'h7} === 6'b1x0111

 

. , , ( 1'bz, 'bz). .

. :

{3{2'b01}} === 6'b010101

.2.5 word.

,----------------------------------------------.

| module concat_replicate(swap,signextend); |

| |

| input swap,signextend; |

| |

| reg[15:0] word; |

| reg[31:0] double; |

| reg[7:0] byte1, byte2; |

| |

| initial begin |

| byte1 = 5; byte2 = 7; |

| if(swap) |

| word = {byte2, byte1}; |

| else |

| word = {byte1, byte2}; |

| if(signextend) |

| double = {{16{word[15]}},word}; |

| else |

| double = word; |

| end |

| |

| endmodule |

`----------------------------------------------'

.2.5

 

, . .

 

 

, , . . , "begin" "end". . :

begin: instruction_fetch

...

end

, ":" - . .

,---------------------------------------------------.

| binary op. |

|!~ |

| * / % |

| + - |

| << >> |

| < <= > >= |

| ==!= ===!== |

| & |

| ^ ^~ |

| | |

| && |

| || |

|?: |

`---------------------------------------------------'

.2.6

 

Verilog , .

 

for

 

C (.2.7) for.

for_loop :

i = 0 (0 )

i = 1 (1 )

i = 2 (10 )

i = 3 (11 )

,---------------------------------------------------.

| module for_loop |

| |

| integer i; |

| |

| initial |

| for (i = 0; i < 4; i = i + 1) begin |

| $display ("i = %0d (%b binary)", i, i); |

| end |

| |

| endmodule |

`---------------------------------------------------'

.2.7 for

 

c while

 

for while, .2.8. while loop , for loop . 2.7.

 

 

(.2.9) . switch .

,--------------------------------------------------.

| module while_loop |

| integer i; |

| initial begin |

| i = 0; |

| while (i < 4) begin |

| $display ("i = %0d (%b binary)", i, i);|

| i = i + 1; |

| end |

| end |

| endmodule |

`--------------------------------------------------'

.2.8 while

,--------------------------------------.

| module case_statement; |

| integer i; |

| initial i = 0; |

| always begin |

| $display ("i = %0d", i); |

| case (i) |

| 0: i = i + 2; |

| 1: i = i + 7; |

| 2: i = i - 1; |

| default: $stop; |

| endcase |

| end |

| endmodule |

`--------------------------------------'

.2.9

 

case statement :

 

i = 0

i = 2

i = 1

i = 8

 

( ) ( ":"), ( ===). , (default).

, . . , .

casez casex case, . casez , z, casex , z x.

 

repeat

 

Verilog , . .2.10 repeat, 5 , .

 

forever

 

.2.11 forever, , .

repeat forever , , for, , . , .

,------------------------------------.

| module repeat_loop (clock); |

| input clock; |

| |

| initial begin |

| repeat (5) |

| @ (posedge clock); |

| $stop; |

| end |

| |

| endmodule |

`------------------------------------'

 

.2.10 repeat

 

,----------------------------------------------------.

| module forever_statement (a,b,c); |

| input a,b,c; |

| |

| initial forever begin |

| @ (a or b or c) |

| if (a + b == c) begin |

| $display ("a(%d)+b(%d) = c(%d)", a,b,c);|

| $stop; |

| end |

| end |

| |

| endmodule |

`----------------------------------------------------'

 

.2.11 forever

 

Verilog . . , . , , , Verilog . . , . Verilog simulator .

Verilog simulator , . , , . (, , ). .2.12 , . , , , .

, , , Verilog simulator . , Verilog , , , . , . .2.13 .

 

t1 t2 t3

-----------,----------------,----------------,------->

| | |

,-----'-----.,-----'-----.,-----'-----.

| 0 | | 3 | | 4 |

`-----,-----' `-----------' `-----,-----'

,-----'-----.,-----'-----.

| 1 | | 5 |

`-----,-----' `-----------'

,-----'-----.

| 2 |

`-----------'

 

.2.12

,--------------------------------------------------------.

| module event_control; |

| |

| register [4:0] r; |

| |

| initial begin |

| $display ("First initial block, line 1."); |

| $display ("First initial block, line 2."); |

| end |

| |

| initial |

| for (r = 0; r <= 3; r =r + 1) |

| $display ("r = %0b",r); |

| |

| endmodule |

`--------------------------------------------------------'

 

.2.13

 

event_control :

Fist initial block, line 1.

Fist initial block, line 2.

r = 0

r = 1

r = 10

r = 11

 

, initial ( 0).

.2.13, , Verilog , . , , , .

 

 

Verilog ( initial always) :

 

#

@-

wait ()

 

#, , , "", @-, , , . .

wait () - , . wait , , (- ).

.2.14 .

time_control :

r = 2 5

r = 1 10

r = 2 25

r = 1 30

r = 2 55

r = 1 60

 

 

, initial

 

initial #70 $stop;

 

- .

, initial , ( ) . (b1 b2). , , .

@- , , , . :

) < >....

b) posedge

c) negedge

d) -

 

) , . b) ) , 0, z

,-----------------------------------------------------.

| module time_control; |

| |

| reg[1:0] r; |

| |

| initial #70 $stop; |

| |

| initial begin: b1 // b1 |

| #10 r = 1; // 10 |

| #20 r = 1; // 20 |

| #30 r = 1; // 30 |

| end |

| |

| initial begin: b2 // b2 |

| #5 r = 2; // 5 |

| #20 r = 2; // 20 |

| #30 r = 2; // 30 |

| end |

| |

| always @r begin |

| $display ("r = %0d at time %0d", r, $time); |

| end |

| |

| endmodule |

`-----------------------------------------------------'

.2.14

 

1 ( posedge) 1, z 0 ( negedge). d) , .

 

,-------------------------------------------------------.

| module event_control; |

| |

| event e1,e2; |

| |

| initial @e1 begin |

| $display ("I am in the middle."); |

| ->e2; |

| end |

| |

| initial @e2 |

| $display ("I am supposed to execute last."); |

| |

| initial begin |

| $display ("I am the first."); |

| ->e1; |

| end |

| |

| endmodule |

`-------------------------------------------------------'

.2.15

 

->c-. .2.15 - initial, .

event_control :

 

I am the first.

I am in the middle.

I am supposed to execute last.

 

. Verilog initial .

.

current_state = #clock_period next_state;

temp = next_state;

#clock_period current_state = next_state;

, ,

current_state = @ (posedge clock) next_state;

temp = next_state;

@ (posedge clock) current_state = temp;

 

 

Verilog , . - - (fork-join), - (disable statement).

 

fork-join

 

.2.16 -.

initial , b. (fork) . , (join). , .

,------------------------------------------.

| module fork_join; |

| |

| event a, b; |

| |

| initial |

| fork |

| @a; |

| @b; |

| join |

| end |

| |

| endmodule |

`------------------------------------------'

.2.16

 

 

, break . break , disable . , , . . .2.17 - , b, - , b.

,------------------------------------------.

| module disable_block; |

| event a, b; |

| // |

| initial begin: block1 |

| fork |

| @a disable block1; |

| @b disable block1; |

| join |

| end |

| endmodule |

`------------------------------------------'

.2.17

 

 

Verilog - (task) (function). .2.19 .

,-------------------------------------------------.

| function [7:0] func; |

| input i1; |

| integer i1; |

| |

| reg [7:0] rg; |

| |

| begin |

| rg=1; |

| for (i=1; i<=i1; i++) |

| rg=rg+1; |

| func=rg; |

| end |

| endfunction |

`-------------------------------------------------'

.2.18

 

,-----------------------------------------------------.

| task tsk; |

| |

| input i1,i2; |

| output o1,o2; |

| |

| $display ("Task tsk, i1=%0b, i2=%0b", i1,i2); |

| #1 o1 = i1 & i2; |

| #1 o2 = i1 | i2; |

| |

| endtask |

`-----------------------------------------------------'

.2.19

 

.

, . , ( ), , , , , , . , , .

, , . .

- , , . ,

tsk (out, in1, in2);

tsk,

i = func (a, b, c); //

assign x = func (y);

func.

.2.18 . . , . - . , , . . , , , . , , .

 

 

Verilog - , , . 4- .

.2.20 4- Verilog.

, sum zero . , . , initial always.

@(in1 in2) , in1 in2 . always .

, always initial, forever, .2.21.

,----------------------------------------------------.

| module adder4 (in1,in2,sum,zero); |

| |

| input [3:0] in1; |

| input [3:0] in2; |

| output [4:0] sum; |

| output zero; |

| reg [4:0] sum; |

| reg zero; |

| |

| initial begin |

| sum = 0; |

| zero = 1; |

| end |

| |

| always @ (in1 or in2) begin |

| sum = in1 + in2; |

| if (sum == 0) |

| zero = 1; |

| else |

| zero = 0; |

| end |

| endmodule |

`----------------------------------------------------'

.2.20 4-

 

.2.22 .2.20, adder4, .

zero , . sum , zero , "?:", , , , --. zero :

wire zero = (sum == 0)? 1: 0;

,----------------------------------------------.

| initial begin |

| forever begin |

| @ (in1 or in2) begin |

| sum = in1 + in2; |

| if (sum == 0) |

| zero = 1; |

| else |

| zero = 0; |

| end |

| end |

| end |

`----------------------------------------------'

.2.21 initial-forever always

 

,-----------------------------------------------.

| module adder4 (in1,in2,sum,zero); |

| input [3:0] in1; |

| input [3:0] in2; |

| output [4:0] sum; |

| reg [4:0] sum; |

| output zero; |

| |

| assign zero = (sum == 0)? 1: 0; |

| |

| initial sum = 0; |

| |

| always @ (in1 or in2) |

| sum = in1 + in2; |

| endmodule |

`-----------------------------------------------'

.2.22

 

 

.2.23 4- , 1- .

,------------------------------------------------------.

| module adder4 (in1,in2,sum,zero); |

| |

| input [3:0] in1; |

| input [3:0] in2; |

| output [4:0] sum; |

| output zero; |

| |

| fulladd u1 (in1[0],in2[0], 0,sum[0],c0); |

| fulladd u2 (in1[1],in2[1],c0,sum[1],c1); |

| fulladd u3 (in1[2],in2[2],c1,sum[2],c2); |

| fulladd u4 (in1[3],in2[3],c2,sum[3],sum[4]); |

| |

| nor u5 (zero,sum[0],sum[1],sum[2],sum[3],sum[4]); |

| |

| endmodule |

`------------------------------------------------------'

.2.23 4-

 

4- 1- (fulladd) -. . : fulladd nor. fulladd , nor - Verilog, .

, : 0, 1 2. fulladd . Verilog . , , :

wire [3:0] databus;

 

, , / . adder4 fulladd. .2.24 fulladd.

,------------------------------------------------------.

| module fulladd (in1,in2,arryin,sum,carryout); |

| |

| input in1,in2,carryin; |

| output sum,carryout; |

| |

| assign {carryout,sum} = in1 + in2 + carryin; |

| endmodule |

`------------------------------------------------------'

.2.24 1-

 

 

.2.25 adder4 .

sum fulladd, zero .

,------------------------------------------------------.

| module adder4 (in1,in2,sum,zero); |

| |

| input [3:0] in1; |

| input [3:0] in2; |

| output [4:0] sum; |

| output zero; |

| reg zero; |

| |

| fulladd u1 (in1[0],in2[0], 0,sum[0],c0); |

| fulladd u2 (in1[1],in2[1],c0,sum[1],c1); |

| fulladd u3 (in1[2],in2[2],c1,sum[2],c2); |

| fulladd u4 (in1[3],in2[3],c2,sum[3],sum[4]); |

| |

| always @ sum |

| if (sum == 0) |

| zero = 1; |

| else |

| zero = 0; |

| |

| endmodule |

`------------------------------------------------------'

 

.2.25

 

 





:


: 2017-04-15; !; : 2104 |


:

:

, - , ; , - .
==> ...

1281 - | 1315 -


© 2015-2024 lektsii.org - -

: 0.444 .