본문 바로가기
verilog/이론

[verilog] verilog의 연산자(1)(산술연산자, 논리연산자, 비트단위 논리연산자)

by 씐 2023. 11. 15.
728x90

산술 연산자

 

산술 연산자

 

  • 2개의 피연산자(operand)의 +, -, *, /, %(나머지) 연산을 수행하는 2항 연산자
  • 피연산자가 네트형 또는 레지스터형이면 부호 없는 연산이 수행
  • 정수형(integer 선언)일 경우, 부호 있는 연산 수행, 합성 제한
  • 나눗셈과 나머지 연산에서 두 번째 피연산자가 0(zero)인 경우 결과값은 x(unknown)이 됨을 주의
  • 산술 연산자의 종류
연산자 종류 의미 사용 예
+ 덧셈 assign add = a + b;
- 뺄셈 assign sub = a - b;
* 곱셈 assign mul = a * b;
/ 나눗셈 assign div = a / b;
% 나머지 assign rem = a % b;
  • 사용 예
/* wire 또는 reg로 선언된 a = 4'h7, b = 4'h2 */
sum = a + b;     // sum = 8'h09
diff = a - b;    // diff = 8'h05
neg = -a;        // neg = 8'hF9
mul = a * b;     // mul = 8'h0E
div = a / b;     // div = 8'h03
modulo = a % b;  // modulo = 8'h01
modulo = -a % b; // modulo = 8'hFF

논리 연산자

 

논리연산자

 

  • 논리연산자는 피연산자 간의 논리적 결합이나 부정으로 판단하는 연산자로 &&(논리 and), ||(논리 or), !(논리 not)이 있음.
  • 논리연산자의 결과는 항상 1비트로서 논리 거짓(0) 또는 논리 참(1)
  • 참이나 거짓의 판단이 불가능할 경우 x(unknow)이 된다.
  • 실제 설계에서는 x(unknown)은 사용하지 않고 0(zero) 또는 1이 나오도록 하는 것이 좋다.
  • 논리 연산자의 종류
연산자 의미 사용 예
&& 논리 and if (a && b) ...
|| 논리 or if (a || b) ...
! 논리 not if(!a) ...
  • 논리 연산자의 사용 예
/* a = 4'b0101, b= 4'b0000, c = 4'bxxxx */

a && b  // 결과 값은 논리 참(1) && 논리 거짓 (0)의 결과로 0 
a || b  // 결과 값은 논리 참(1) || 논리 거짓 (0)의 결과로 1
!a      // 결과 값은 논리 참(1)의 부정으로 0
a && c  // 결과 값은 논리 참(1) && x의 결과로 x(unknown)
!c      // 결과 값은 x(unknown)의 부정으로 x(unknown)

비트단위 논리연산자

 

비트단위 논리연산자

 

  • 피연산자들 간의 비트단위로 연산을 수행하게 되므로 결과의 비트 수는 피연산자의 비트 수와 같다.
  • 만약 피연산자의 비트 수가 서로 다를 경우 비트 수가 작은 피연산자의 최상위 비트(msb)쪽에 0을 채운 후 연산을 수행
  • 비트단위 논리연산자의 종류
연산자 의미 사용 예
~ 비트 not ~(1011) -> (0100)
& 비트 and (1011) & (0011) -> (0011)
| 비트 or (1011) | (0011) -> (1011)
^ 비트 xor (1011) ^ (0011) -> (1000)
^~, ~^ 비트 xnor (1011) ^~ (0011) -> (0111)(xor 연산 후 반전)
  • 비트단위 논리 연산자의 진리표

  • 비트단위 논리 연산자의 사용 예
/* a = 4'b0101. b 4'b0100 */

a & b  // 결과 값은 0100
a | b  // 결과 값은 0101
a ^ b  // 결과 값은 0001
a ~^ b // 결과 값은 1110
~b     // 결과 값은 1011
  • 비트 단위 논리연산자와 논리연산자 연산 결과 비교
피연산자 값 비트단위 논리연산자 논리연산자
a = 1010
b = 0011
c = 0000
a & b = 0010 a && b = 1
a | b = 1011 a || b = 1
a & c = 0000 a && c = 0
a | c = 1010 a || c = 1

이 글은 "따라하면서 배우는 디지털 시스템 설계 및 응용 with Verilog HDL"을 기반으로 작성했음을 알립니다.