TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog学习笔记基本语法篇——运算符 c0 }' V5 g' P; M; ^- Y
@0 Q# H1 h8 g
Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类:4 _- r: M/ N9 H4 l# S2 ~
: X' J8 I% ^1 r" m" T* d8 U8 z3 i(1)算术运算符 +,-,*,/,%
3 w6 U* L9 M. g J! Z3 q7 A, O( p3 d# q) n# s
优先顺序3 L: O( Y& {! X* |4 g" v) B X
!~
. b. N( B3 S: e! J: G* X6 p
2 H4 b* Y1 l2 e/ d2 q2 k, l' ~) q" _* / %( d A6 p1 }; l' K5 o$ M; i6 g8 @0 \
- q3 \! T9 ? ]5 v0 A) j+ V+ -4 e5 P7 G- f" l2 Z
" `, g6 D8 H8 c, x<< >>
( _4 A( Z) N8 E. \* y+ t
$ |3 D9 ^ e! Q% S8 w) ? C< <= > >=
3 ?% o1 P+ T8 w7 } e1 d; D9 O, u+ s1 \/ a
== !== === !===
. h# Z8 u, G$ m ?0 i _
+ q& q S" w, K4 t' V! B# r& v&! P9 o* z1 B( o: `" I! W5 c
1 Q) i$ v- @: o3 M' I
^ ^~$ C4 B, V, n, f7 r& M! u
, f! }& Q% P0 h' C* I3 }|
. N* B; T/ u, h4 w. Z/ B( T0 ]% d2 R( C4 L5 N$ x% G. E" U) t
&& }' F* m2 Z1 _
7 w0 P4 N8 T4 Z/ g||! Y; W6 o* d. C2 X
9 M* q+ _ y% Z& }5 J1 ?
?:5 d6 D6 p/ v* b! O- v, \. v& a
- ?0 A2 Q+ {" q" B' Q/ e1 {$ a* A( ~! g
最高优先级别
3 k3 O9 @. v2 N% a3 K/ i) q
& P9 W( M. x/ X! w" d$ [$ S↓
0 i8 C3 A0 m# L+ m4 f# o# Z9 p8 O( Y! f
↓
4 O/ t7 s2 @, \* T+ I1 s" ?' P# D2 s9 r+ y
↓
) G A2 Z* {: `9 Y* R3 X: N0 |2 j
, d/ P. N7 t; c/ d* M$ x2 x↓' C* n4 g0 Y( j- T
7 f6 x( v( u, H; i; t最低优先级别1 ]8 a. T# \: o( M7 T& m( T/ T
: e8 O$ `" }- f) e
(2)赋值运算符 =,<= ; p' W0 `* B7 `5 a5 d8 j; F
' c( }# B# b" ~- G0 @. i(3)关系运算符> ,<,>=,<=
$ d( [4 M4 K; w' m7 y- S. _: ~1 D B. F
(4)逻辑运算符 &&, ||, !
9 ?9 f- ^, e" }! K9 P: g
+ q3 }/ c" y# l& D(5)条件运算符 ?:7 C5 t& P2 m; p$ c1 Z
: {7 z8 F, O( b' o3 e* B
(6)位运算符 ~, | , ^ ,& ,^~, b; J: q) u1 I3 O7 {- G$ N
+ g4 L2 P$ S) Y, v
(7)移位运算符 << ,>>$ h& }( h$ P" p/ X& E" @( j0 z
/ _' F# d, }! q5 K8 r0 v
(8)拼接运算符 {}
3 z( \/ Q: J3 u
7 B) P% N1 O. L0 X; S6 T(9)其他。" A0 d, S1 W9 {1 P+ P |* Q8 h
0 D' @ s q$ V5 b
1)基本的算术运算符:加减乘都比较简单这里不再记录。
5 _3 D3 x) l, y1 e( z8 Z5 I% ~* t/ k- G7 y" b
在进行整数的除法运算时,结果要略去小数部分,只取整数部分;而进行取模运算时(%,亦称作求余运算符)结果的符号位采用模运算符中第一个操作数的符号。% z) @( ?. T" O8 I+ g! H
/ H) @" Z: Q' T3 v7 ~8 t-10%3 结果 -1 11%-3 结果为2
. Y: z4 W) e" g8 T; h
6 Y2 R) x4 |7 t$ t7 w9 [" g0 G注意:在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。
0 Z. c; R, H* ^4 q# L/ ^
) w( V$ i' _; A+ A5 D4 X# v0 }* n& B) {( d% v! ]0 S. W3 T
3 q4 f# G( t. l F T" w, g
2)位运算符:6 Y/ N; w+ c6 b9 l
+ S! j7 |! H; q4 ?' @
按位取反~ 、按位与 & 、按位或 | 、按位异或 ^ 、按位同或 ^~0 C$ Y+ Z) X$ p4 S T* i
3 F+ h* {. S. U
在不同长度的数据进行位运算时,系统会自动的将两个数右端对齐,位数少的操作数会在相应的高位补0,一时的两个操作数按位进行操作。* {! ~2 [- i9 p# D$ V& Z
9 _* ~: Z. D8 K4 k" D0 E5 H% L& {4 I
% k* r% y" Y" }" w: d5 {+ q) l+ u" z+ o8 f
3)逻辑运算符:
6 V+ B7 n, j& ^
. y' r* ]& d9 G, c0 K/ _逻辑与 &&、逻辑或 ||、逻辑非 !1 G7 ~3 K3 |3 R) V
8 h' H7 x/ e0 z2 p1 g$ R! z5 `其中&&和||是双目运算符,其优先级别低于关系运算符,而 !高于算术运算符。' j9 @ [1 B# _* P( e
+ i& ^) _$ X, e2 I' @; E, F0 w9 U- z( Q
1 W( c$ p& g- j6 h7 ]( c& E4 j! w! r4)关系运算符
# o% _* B; K1 ~: T& [2 x: n
: l( V5 }) v& i9 x( m: ~< 、 > 、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声明的关系是真的,则返回值是1。 关系运算符的优先级别低于算数运算符。
7 h; J+ R" j3 B1 r* n& S. z
' G D! o- w" {+ R* Q! Y如: a<size-1 //这种表达方式与下面的表达方式相同
* ~( d6 [/ W( ^' P# A f. ~( W2 k9 ~4 v* |9 z6 }5 J
a<(size-1) //- |9 e9 [+ u! A$ \7 T: f" C; Y/ s$ R
: |: g, o" m( m. [2 b size-1<a //这种表达方式与下面的表达方式不同5 V. k7 K8 F8 l7 V8 h) _3 F$ J
! R' b; @" r& r2 o; x% i% I
size-(1<a) //: t; U2 p- j3 @5 J. f3 M/ R1 E2 T
2 c3 M+ `1 M. l; `( Z# }' J3 ~$ c. ]
' Y6 I, W' ?5 O$ Y9 M4 H" j% `- C- w* f: K8 q' n& |
5)等式运算符+ j6 j4 S0 x& K, _, v( v. s+ x. V2 V
?) C7 n8 f7 W& Q- D
== 、!= 、===、!== 符号之间不能有空格。" Z' ~6 _2 E) w' ]8 j
1 y0 O0 _* n% d, p/ v“==”和“!=”称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x;
& d( }# |0 J+ Q8 {/ p5 I
9 |. [1 ]' S3 [“===”和“!==”常用于case表达式的判别,又称作cae等式运算符。其结果只为0和1.如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0.
2 |; p. @+ S; R& @- ?8 n4 h0 ]; ?8 [. M9 @" u
逻辑等式运算符和case等式运算符的区别:
5 `8 f' F! [/ k) H" N3 z* m* s" }! Q: w
=== 0 1 x z == 0 1 x z0 O8 j" }0 U6 F5 \
0 1 0 0 0 0 1 0 x x
8 u# B8 D4 M: c3 Z; N( H1 0 1 0 0 1 0 1 x x
5 N% [9 L5 Q' G4 x9 \2 Kx 0 0 1 0 x x x x x
0 s. R9 m8 B3 Bz 0 0 0 1 z x x x x7 _9 B1 b# Q8 x1 C C# h% u6 D, ^
# Q. \3 W7 q% o9 V. f* K4 |
- t( m/ j$ L1 n* K3 E: L/ ?
# h* S: R5 y- {0 j0 L3 S/ k S8 x5 \' k* v+ p/ y
4 h. ^& C& h. K. L- q1 x# |9 M8 _
4 \6 k& B6 Y' `; ~6 ` x
$ ]5 E& b8 U6 g) i' P: |. k
" f f: ~# M9 _ w
' a0 ~2 k( Y8 c
, c k% \1 s7 u. O' ?9 o6)移位运算符
) ^, y6 U- \- p" I' ~3 S+ p$ q; y0 \+ W# H" t; Y0 N
<< 、 >> a>>n其中a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。
1 X" g6 ^; m8 [" C7 S9 g0 S- E( W0 p {& v2 ~
如果操作数已经定义了位宽,则进行移位后操作数改变,但是其位宽不变。
5 ]/ K1 g- A" N2 W/ R# d# z! ] {: Q8 u# \! s7 s
/*不懂之处;(夏宇闻第三版,p41), @8 Y% f h8 J' {
" Y" [$ E, E# w% W# G2 |2 S: A O
4'b1001<<1=5'b10010; 4'b1001<<2=6'b100100; (左移会使得位数增加?)
% m \6 s7 ~8 o* `. K
8 ?# |2 D. k) T: P. H1<<6=32'b1000000; 4'b1001>>1=4'b0100; (右移不会改变位数?)
9 A9 x M" b' Y# U4 K }* F7 I% {3 X- G( |" Z8 ^) o7 e, U# _
4‘b1001>>4=4'b0000;
% [5 X' [( g$ V. D- P3 x
, C' ^% b: E, ^! G* P/ P* R' a*/
; l9 z! J- L4 A7 A5 r
3 p; m$ X" h. ^4 m% E6 Q
4 c; B: i p- _- L; x) D3 `8 A1 j" ^% S% S* o! d% q
7)位拼接运算符& O, X0 ^% D G, D0 X4 @
[% [5 J r4 G( K
{信号1的某几位,信号2的某几位,......信号n的某几位} 将某些信号的某些为列出来,中间用逗号分开,最后用大括号括起来表示一个整体的信号。
7 f7 b2 q \$ ?- S _/ y. i0 P& O: s7 c2 M4 a8 Q! Q
在位拼接的表达式中不允许存在没有指明位数的信号。/ ^/ p' C3 S+ t2 D; I, e) Z
6 S* j. D3 m4 V3 j. B& y7 @{a,b[3:0],w,3'b101} //等同于{a,b[3],b[2],b[1],b[0],w,1b'1,1'b0,1'b1}
' h% m( t7 j- R. ?1 d- r% O
0 i+ }- v$ y4 C( R/ U5 X0 N{4{w}} //等同于{w,w,w,w}1 | I) B7 G% ~, t' ?
& }5 l8 t4 T6 Q3 l( z
{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b} 这里面的3、4必须是常量表达式。( W2 x! A/ B5 L- d' K
! ]- b5 z0 ~% D" a+ \1 w" \8 m4 t! U+ x8 x0 a
- [ u6 s* q8 C# m3 P
8)缩减运算符9 J( h1 @3 E, n/ F3 D: C( O T
1 o6 `( F. {, r0 R- W* Y' F; Z% g9 o k这是单目运算符,也包括与、或、非运算。运算规则与位运算相似,不过是对单个运算符的每一位逐步运算,最后的运算结果是一位的二进制数。7 Y# D+ Z" D5 Z- N0 A' Y; ]" e4 n, t
7 X1 C; x6 T/ d$ a5 m# X( W4 x& Oc=&B; //意思同c=((B[0]&B[1]) &B[2] ) & B[3]; |
$ B1 } ]9 n* i" J' i- `9 ] |
|