|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
关于verilog几条语法 . l: t5 @7 d j# L$ N
) O2 ^$ S- ]6 O& Y6 B, H) g4 T( \% X
1.关于wire和reg类型的使用:" \" Z" r& x) {! O, W" t
input的变量一定只能是wire。output的变量可以是wire也可以是reg。inoutput的变量只能是wire型,因为类型中含有input成分。
6 o* S4 W1 h! b# O! d. e所有变量不加说明默认定义为wire型。0 ~: j1 _$ Y( U, {2 A
在assign语句中使用wire类型。在always语句块中使用reg类型。
; U+ k7 E# c7 x- Q5 b2.位拼接符 { } j: C- n" e, R3 x1 b* G5 ?
位拼接符使用:把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。拼接时高位在前。
4 I/ g7 J4 k0 b1 w% Z) zeg: input [3:0] numberH;
8 I$ P; S7 h7 D7 H& g8 \6 V" y input [3:0] numberL;
7 i2 _1 F4 S* D output wire [7:0] number;
; t4 b J& P& c. J, S: [5 x assign number = {numberH,numberL};0 Q% _3 k+ B9 V' w9 `, w
11 r7 v+ U+ v) v/ R) Z" ~3 l( a7 e
2
; p3 S! x4 u7 [3# a; Z: \% J, j$ j5 I
4
% a. j8 b, S* T3.case endcase语句与if else语句' {% U; s3 }3 `
if语句语法基本与c语言相同,也具有优先级。
& g0 e: o& L: D" R: P, R- Veg: if(flag == 0)
6 b* V$ d# `2 f) `! O begin single = 3;end
: Y& D1 [- ]' C* q0 E1 A else if(flag == 1)
: O$ @9 X8 z |, ` begin single = 2;end
6 D/ m! F5 q z! X+ W8 ?. S& b else if(flag == 2): x1 r: `0 x; T. q+ A" a2 A! B
begin single = 1;end
' q( T! e; X8 ?5 V) E4 [2 U3 R else
5 g: |( `4 ?2 A/ E( a7 Q0 T begin single = 0;end```
. p5 v- o( P% O( Q13 m% [% g5 [2 t- |# l z3 Q# N
24 M$ I) y) C+ t( R
3
* h5 g4 _( P, Y3 h! p4! |: i/ `* Q# t: i% n
5
+ I7 e( g' I: z% h1 I" _% z6
: v6 ^ f: f. T5 }; Z0 k# K( ?7# }! d8 w# e' e
8/ C; i5 i. K# x
case语句,不具有优先级
; ^* Y! S( Z: q6 I( \. |eg: case(flag)
; P& b% v# |8 d, _2 \* x+ a 2'b0: single = 3;
: n, P$ m6 _- h5 L5 g 2'b1: single = 2;0 _; X9 ?5 n6 U6 T3 j% N0 d7 M$ i
2'b2: single = 1;+ d" S4 H* A3 \" _: K4 |3 X
default: single = 0;* o0 b l* M7 w; x2 E
endcase
( C6 S( X4 s' I2 p1
L, f: U# q! J+ t1 f2
8 y8 D: D5 f3 b3
: i4 n3 n* K% g4$ s; ]7 o6 n- \$ o% r- P0 H
52 y/ r4 X9 U& ?. w+ l- w7 Y
6
( Y' _# M6 U& b) O: K" O0 q8 U! nif语句与case语句:
- s. ^3 O& W. F/ f- k# j% vif占用资源相对较少,但执行时间较长。case语句与之相反。
, p2 I& W7 M9 t) o/ [, _: ^4.always语句块与assign语句) f. U. L# u( y+ C: z; C" A
always语句块一般用在时序逻辑电路中,在组合逻辑中也有应用。8 H3 g/ ?$ _$ y
/*敏感信号是需要检测的信号,当这些信号发生变化时,always语句块就会更新一次。对于时序逻辑而言,还需要有posedge,negedge,posedge or negedge修饰。*/
1 A" Y/ u: ^0 {& |# t1 ^
+ B( @8 w5 H# D! R i- k- N4 z) U语法: always@(敏感信号)
# v+ W% l7 R4 L% H' q! t begin2 ^& ?: A( V" `! r5 C3 F
语句体;
! l: V6 u) v% Y# D end
& ^6 R2 a; b) \/ L0 I* ?1 r1 q! c12 O- c* B" n* O- J8 x: ~ L
2
2 C x3 y2 L* H% o, b' \+ m+ M37 x: H# y) P7 ]' Y7 V3 o( N6 h p6 c
41 d# c# F# N0 v+ T2 C
5$ l; z, x: n) K. C' e
63 ^$ p. p1 |! K
always组合逻辑& p+ {% \$ f6 Y
在组合逻辑电路中,用阻塞赋值 =
0 o( c0 @6 F8 Z9 q0 Feg: always@(a,b,c,d,x)7 N7 S8 J3 u" n. Z' k( i
begin
8 Q( X2 k. r( B5 A case(x)
- A4 [ F0 E/ z2 ?* C" C3 h* p( O 2'b0: y = a;$ J2 u- C- V$ Y* X# W6 d3 w6 |7 ?. h
2'b1: y = b;, l2 I$ W& G+ b& X! D
2'b2: y = c;# c# b1 c% ~" |* o. f# G$ @7 a; P
default: y = d;
5 j" T0 a& c9 B& A endcase7 s5 q1 r* }1 n4 |5 M& ~
end
2 n8 ?& G1 S( \' v! I1
* T8 h: `* ^. c2 ^) H- ~2! L! W0 l6 b! t
3
8 r, i. h, d% ?8 P i+ Z0 ]! d4
4 @5 L- g1 ?5 G+ u# v E% G5
2 C4 \5 O3 n. ~, o- G5 Q6
6 `! H# b! W) \$ R70 m0 |2 i1 C4 t0 [" \5 X7 e7 g
8, M; I% q0 f9 m1 k7 \
9. r) n! L7 a: P1 }) K: {& U0 k
always时序逻辑
& j1 c( y9 K+ X; [) J在时序逻辑电路中,用非阻塞赋值 <=
$ j3 P! Z# t geg: always@(posedge clk or negedge res)
8 L3 z3 B! f4 o$ x; ~& d begin" q6 M. E0 L6 G8 ~( r+ q- @
if(clk)
! P; o7 P7 l8 _0 B7 M y <= a;
5 d7 [% `+ o* T- C% J: X% A else if(res == 0)
. K# B- V/ L) I1 h8 f y <= 0;
2 }2 y) c( z% z+ I# J else y <= y;& Q4 h `6 M9 I% q* Y0 a/ s! @
end
- t3 P( N/ P \) j5 ]! T; {1
/ p8 t* K: Q: P, O2
5 P& O* I4 L# I3
9 }% m+ @8 ?0 V1 X2 Y4
: K6 D% M O) y1 S) D5
( b, D/ {6 ^6 {65 Z1 i, R* G$ h
7/ x" B3 m. L7 ?
81 ^' H- q* S% a- ~% U: Y. {
5.assign 目标变量 = 驱动表达式
. ?+ H$ l5 J* m T7 E4 S( qeg: assign y = a & b;9 }% b7 D* w! V% T' c- t
1
& u: W4 u3 M1 A. L" h: X0 B6.多目运算符 ? :/ X* h% E% _0 B% Y
eg: Y = (a&b)?c:d;
* W% N/ [6 |5 h8 Q3 o( v
* f: L( B! f2 A. P& O1 _/ s1 T/*与c语言神似的运算符。若a&b为真,Y=c,否者 Y=d。*/ | 9 V- Y4 \3 w9 T3 w; [ T2 c& E
|
|