TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Verilog学习笔记基本语法篇——运算符
4 Q. i3 W! N' k' M6 z# I/ b2 _. Z g, `2 M
Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类:% h& @6 j7 Y# ?$ t- H
. q6 O" o7 Z+ L& p9 G% @: h(1)算术运算符 +,-,*,/,% * l1 e+ h+ O' ?1 p1 L# T
0 b. U. F) ~: v7 i+ J: w4 ^6 z优先顺序9 r" M4 K& _7 T: C9 D% J
!~( w" @! }' F* G7 i% X. V
I/ X/ Q! g$ l* i d/ Z& S1 j* / %
) U5 G' J9 M% e. z" n! Y, b0 Q( n2 Y8 {3 X1 `9 J4 k* I
+ -
8 ~+ n# w4 a" _1 [
- G2 ^" w# I7 a<< >>8 X8 H9 z2 m( }0 |! s4 l* o" U
L5 h2 `' G- j9 M L7 X7 F: B( O
< <= > >= % W9 D, }* s# }0 q. b
5 R! _% P" L& C. |2 V# u== !== === !===
! X& @' u$ i7 l5 j$ W1 Q6 a6 P
" B+ x7 J8 M: c! b&) S0 h8 P# C5 J$ L/ _4 B
9 s% ]( l8 f/ m* C, A^ ^~
, a% B4 w( p. ~( u
5 x! R9 V H1 y|
, O y. u7 R0 b, M' H' N7 |& |) r" z, a- n @
&&
4 p$ z- T8 _( y1 m- [( o3 i+ x; E- f
' Q4 V) b: u# \0 ^||
/ c6 w8 G9 O9 G& ^: [8 B& d! r4 @
?:
9 s0 c, U) c$ M" A/ i1 A. c" e
! F9 z) i5 R: l最高优先级别& ]2 U/ N- Z2 H5 C, E
; p; Z. O8 s( w( x↓/ N( D* y7 @! b3 }
$ C7 X2 ^, F/ J( \↓6 @+ y: V. n: L, z- P
H$ \6 q) r* T1 e↓6 {9 z& s% b5 x/ j R% K
: k( s: W v9 ?5 ~% A' {- q
↓+ h$ h! V/ S& o6 ^
: J; F6 g+ B6 C: H B& d o. p最低优先级别4 }3 \$ _: ]! k5 V8 U6 _, o
8 h9 t0 a1 G- I$ l3 g+ Z
(2)赋值运算符 =,<=
! U' S3 b* j5 U, u) d9 X. T& c4 X6 b2 h( ~" R, A
(3)关系运算符> ,<,>=,<=
2 P/ V5 I2 M" _* X) F: h. i" W7 ~! G& Z, b9 g8 J
(4)逻辑运算符 &&, ||, !# L* U2 a" K9 ?6 d- S: Z
' B2 M/ P8 @2 H) n7 v+ c/ N(5)条件运算符 ?:
- c c& L- Y, r5 Q/ \! S$ [+ s' X3 J4 o% N) D
(6)位运算符 ~, | , ^ ,& ,^~0 J) l; P1 L: a7 i3 ?
$ Y6 p+ y/ u% c+ K6 d. Y(7)移位运算符 << ,>>
9 q, M0 _( z1 W1 p1 C) l8 H( x1 @8 O9 Z# k. l' ?
(8)拼接运算符 {}( X0 w) k( d- b6 P
$ {# }1 P- O7 M9 H2 }. ]- v3 i8 _1 ^ F
(9)其他。
5 S9 i- P3 @5 B3 R2 S( t; f) F# Q
+ M) a6 k {: o1)基本的算术运算符:加减乘都比较简单这里不再记录。
. y& ~/ V) K v. _+ T4 ~. d
7 O7 Q+ K4 E' J$ n& x, V7 i. z在进行整数的除法运算时,结果要略去小数部分,只取整数部分;而进行取模运算时(%,亦称作求余运算符)结果的符号位采用模运算符中第一个操作数的符号。( X" S/ O3 P( ]9 m. p# a
* Q: @% I: ?3 h7 O' B' y6 I6 z-10%3 结果 -1 11%-3 结果为2" h `, i9 @7 l& L1 ~) M
4 p: ?9 O+ M M1 \$ n* B8 ?
注意:在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。- g+ ^+ L( w( K7 j @0 n! E6 _; {
p/ r$ b5 k+ z: _" k: A, j
! y: H% V) S4 U( P! A6 k* K; ^! q" f* s+ C, r- L
2)位运算符:
/ A9 d" F* |; R f% P. J" W4 R' K8 F3 F) g
按位取反~ 、按位与 & 、按位或 | 、按位异或 ^ 、按位同或 ^~. y# J% |6 ~. @& U' G8 `
K' u4 [( ?" {& d) H
在不同长度的数据进行位运算时,系统会自动的将两个数右端对齐,位数少的操作数会在相应的高位补0,一时的两个操作数按位进行操作。
8 @# M! S: ?1 ]; Z$ f0 f$ D- N+ W, Z/ X' C
2 M, t* O# T ]9 @) G3 ^
6 n* a' a9 g* `* C: v3)逻辑运算符:
; p& B) j) M& @4 }* i
N, m, Q" ~# |0 @8 J逻辑与 &&、逻辑或 ||、逻辑非 !
/ b8 J( O( }7 E b* O% e" _. r# e" ]' x k8 G3 g& }; V# R1 v# L, S
其中&&和||是双目运算符,其优先级别低于关系运算符,而 !高于算术运算符。2 x) o; X0 I/ z9 f
6 h" d/ m% _# s( F9 ?
6 f+ N% Z! r1 }+ C6 h- [9 u0 y! d& T }9 P. {
4)关系运算符5 p3 \9 n0 Z2 R% E! G3 v
/ v6 I) U" D& G2 i7 g$ h
< 、 > 、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声明的关系是真的,则返回值是1。 关系运算符的优先级别低于算数运算符。( J; z8 i: o! Y
( d3 M! V4 E1 m% E( t
如: a<size-1 //这种表达方式与下面的表达方式相同 O, m* w5 `" f' f* G. |2 r; E
9 }5 f4 r( f/ {9 Y! q a<(size-1) //0 x/ U" @" H4 |# z6 O; @
; y; @* b6 C/ Q: B) x! W
size-1<a //这种表达方式与下面的表达方式不同) h2 O: K! D. y* A
3 C' D) v" a8 [( [- z- e. G
size-(1<a) //
- i) a* q8 w) p( P' W0 L, h/ Z# l3 i' o. q3 d% I
& b: o; r8 C3 j
+ G8 C, t, m' [/ A4 h5)等式运算符
, B, Y# B' J1 K! K
7 H! Y5 u. a) |- n. Z1 e7 H== 、!= 、===、!== 符号之间不能有空格。
5 d# v* `; l( q6 [
/ ?- ^ O/ k: u7 S“==”和“!=”称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x;$ q1 @) v0 y, e. ^8 j6 @- M' K
. X5 `2 D& j, M( R
“===”和“!==”常用于case表达式的判别,又称作cae等式运算符。其结果只为0和1.如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0./ Y e! l/ T( R. S
$ s: M" b5 p1 @7 |7 ^逻辑等式运算符和case等式运算符的区别:/ f& e( y1 T0 x0 n3 ~7 w: P. |! U
0 I- J" ]7 d5 J$ p. p% R, F
=== 0 1 x z == 0 1 x z8 |1 K) i6 ^$ h( s$ [# F
0 1 0 0 0 0 1 0 x x
; l, r4 W) Q% J: }4 m- W# z& A, I1 0 1 0 0 1 0 1 x x# `4 A9 {6 O7 M- {) @0 C
x 0 0 1 0 x x x x x
0 P; _: |2 ^# p1 C1 P r: Y5 Tz 0 0 0 1 z x x x x/ r7 b9 `5 L5 d* d" E
7 O* R/ C7 E% M& T* M
0 m7 ~: O6 _( J" A' l
- c* S& a0 }- d+ Z0 H. q
& l' Q; R8 f/ f$ F7 R9 P5 B2 q, t( u3 Y; p" D( V& B
* X3 I; Q! ]9 I$ t( G ?, R$ ?: Y1 e' {- G0 ?! f$ a
* A8 u! w; F4 {
& S# Q. O- K2 o3 d/ a1 J5 g! G! A" k7 J( F
6)移位运算符8 v$ j: ], }, L1 x
) t( I6 U7 M- E2 [9 a; L- D
<< 、 >> a>>n其中a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。* X& P4 X) s2 f3 P) P8 F1 r) {/ l! D$ w
* ^4 N0 R+ M8 J: R6 Y
如果操作数已经定义了位宽,则进行移位后操作数改变,但是其位宽不变。
, `3 c# S: Y, L! M& R( X" b$ \! B+ \ z7 ~
/*不懂之处;(夏宇闻第三版,p41)! C0 m9 R; U$ r2 \% I
- ^# I' {. `: D- b6 j# ^& _# j* I
4'b1001<<1=5'b10010; 4'b1001<<2=6'b100100; (左移会使得位数增加?)7 B4 E" x% W) J: y L& c+ X: e6 {
5 B4 L4 v6 Q9 Q1<<6=32'b1000000; 4'b1001>>1=4'b0100; (右移不会改变位数?)" j8 _6 K/ L# G( A
: u1 G7 i; l$ W/ O* h* @
4‘b1001>>4=4'b0000;6 `4 ~# r* K6 K5 u4 ^5 p( c
! d# ?3 E7 v2 m0 |( Z! y9 }
*/8 T9 B4 Z2 f# {% p8 z' {* B2 H
1 M; p- }7 y6 J6 T
! N& A* w% E& c7 Z" E
# W) ` L+ p5 \ w% m) o! u7)位拼接运算符& R7 j0 o& ], `9 `
" S1 [3 e+ F8 f. t! d$ [
{信号1的某几位,信号2的某几位,......信号n的某几位} 将某些信号的某些为列出来,中间用逗号分开,最后用大括号括起来表示一个整体的信号。0 a5 z( ?3 o. T4 H# o k9 R2 J
% r. ^$ L( m" u" i4 V7 o2 t) F. H在位拼接的表达式中不允许存在没有指明位数的信号。
! `& I( u H/ n7 e
' Q: V2 z. d& m/ j% e0 n{a,b[3:0],w,3'b101} //等同于{a,b[3],b[2],b[1],b[0],w,1b'1,1'b0,1'b1}0 l, \! U/ {: n* _: \" G% q
5 F0 _, w' @- |
{4{w}} //等同于{w,w,w,w}' a- I; U" H/ u8 N5 F
& c9 L/ {+ k! H8 w$ X* @% n- V
{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b} 这里面的3、4必须是常量表达式。
/ H) ^; X( ]3 Z' r% \
9 D$ F# }$ J7 {- {; k2 ? x# @% T. g, B
3 H% z6 V# t& V! x$ a* q8)缩减运算符
: |" W% d1 N3 O8 W' T4 V& T- _
) x$ A+ n& f! J2 v这是单目运算符,也包括与、或、非运算。运算规则与位运算相似,不过是对单个运算符的每一位逐步运算,最后的运算结果是一位的二进制数。
; z5 ?) g- l) P+ W1 _- g0 {) r4 t. _0 Q% ?% e2 `# Z' f+ i
c=&B; //意思同c=((B[0]&B[1]) &B[2] ) & B[3]; | 9 K" `. @ b3 @1 ]. W3 t7 m
|
|