VHDL 연산자
VHDL에서 제공하는 연산자는 다음과 같은 주요 범주로 분류할 수 있습니다.
• 할당 연산자
• 논리 연산자
• 관계 연산자
• 산술 연산자
• 연결 연산자
할당 연산자
연산자 ":="
초기 값 할당에 연산자 ":="를 사용하거나 상수 또는 일반 변수에 값을 할당합니다.
":="는 초기 값 할당을 위한 신호 개체에만 사용됩니다. 다른 경우에는 신호 개체에 사용되지 않습니다.
signal my_signal: integer :=10; -– 초기값 할당
my_signal <=30; -- 값 할당
variable my_signal: integer :=10; –- 초기값 할당
my_signal := 40; -- 값 할당
constant my_number: natural := 214; -– 초기 값 할당
Operator "<="
"<=" 연산자를 사용하여 신호 개체에 값을 할당합니다.
signal my_signal: bit_vector(3 downto 0):= “10011”; -– 초기값 할당
my_signal<= “11011”; -- 값 할당
Operator “=>” and “others” keyword
"=>" 연산자를 사용하여 벡터 요소에 값을 할당합니다. 연산자 "=>"는 일반적으로 할당되지 않은 벡터 요소의 인덱스 값을 나타내는 예약어 others와 함께 사용됩니다.
signal x_vec : std_logic_vector(5 downto 1) := (4|3=> ‘1’, others=> ‘0’);
결과는 x_vec=“01100”
x_vec<=(1 to 3=>‘1’, others=>‘0’);
결과는 x_vec=“00111”
variable x_vec : std_logic_vector(0 to 10) := (1|3|5=> ‘1’, 2=> ‘Z’, others=>‘0’);
x_vec= “01Z10100000”
x_vec := (1 to 5=>‘0’, others=>‘Z’);
x_vec=“Z00000ZZZZZ”,
논리 연산자와 시프트 연산자
논리 연산자는 데이터 유형 bit, std_logic, std_logic_vector, std_ulogic, std_ulogic_vector 및 Boolean에 사용됩니다. 논리 연산자는 구현 조합 논리 회로에 사용됩니다.
다음 표는 논리연산자와 시프트연산자를 나타내고 있습니다.
Logical operators | and, or, nand, nor, xor, xnor, not |
Shift operators | sll, srl, sla, sra, rol, ror |
논리적 시프트 연산자에 대해 간단히 설명하겠습니다.
시프트 연산자
SLL: Shift Left Logical
비트는 왼쪽으로 이동하고 새 위치는 0으로 채워집니다.
x <=”10101111”
y <= x sll 2
결과 : y <= “10111100”
SLA: Shift Left Arithmetic
비트는 왼쪽으로 이동하고 새 위치는 맨 오른쪽 비트의 값으로 채워집니다.
x <=”10101111”
y <= x sla 2
결과 : y <= “10111111”
SRL: Shift Right Logical
비트는 오른쪽으로 이동하고 새 위치는 0으로 채워집니다.
x <=”10101111”
y <= x srl 2
결과 : y <= “00101011”
SRA: Shift Right Arithmetic
비트는 오른쪽으로 이동하고 새 위치는 맨 왼쪽 비트 값으로 채워집니다.
x <=”10101111”
y <= x sra 2
결과 : y <= “11101011”
ROL: Rotate Left
비트는 왼쪽으로 이동하고 오른쪽의 새 위치는 왼쪽 가장자리에서 떨어진 비트로 채워집니다.
ROR: Rotate Right
비트는 오른쪽으로 이동하고 왼쪽의 새 위치는 오른쪽 가장자리에서 떨어진 비트로 채워집니다.
관계 연산자
관계 연산자는 비교 목적으로 사용됩니다. VHDL 프로그래밍에서 사용할 수 있는 관계 연산자는 다음과 같습니다.
산술 연산자
산술 연산자는 정수 또는 숫자 값에 대한 산술 연산을 수행하는 데 사용됩니다. VHDL 프로그래밍에서 사용할 수 있는 산술 연산자는 다음과 같습니다.
다음 예제는 z = abs(x) + abs(y)를 코딩하였습니다.
library ieee;
use ieee.numeric_std.all;
-- Note that "numeric_std" package includes "std_logic_1164" package in its implementation
entity abs_sum_circuit is
port( x: in signed(7 downto 0);
y: in signed(7 downto 0);
z: out signed(8 downto 0) );
end entity;
architecture logic_flow of abs_sum_circuit is
begin
z<=abs(x)+abs(y);
end architecture;
연결 연산자 "&"
연결 연산자는 논리 또는 비트 벡터를 병합하여 더 긴 논리 벡터를 얻는 데 사용됩니다. 연결 연산자는 bit_vector, std_logic_vector, std_ulogic_vector, signed, unsigned, string, integer vector, boolean-vector 데이터 유형을 병합하는 데 사용할 수 있습니다.
entity merger_two_vectors is
port( x_vec: in bit_vector(4 downto 0);
y_vec: in bit_vector(6 downto 0);
z_vec: out bit_vector(11 downto 0) );
end entity;
architecture logic_flow of merger_two_vectors is
begin
z_vec<=x_vec & y_vec;
end architecture;
generic 문
제네릭 키워드는 VHDL 프로그램을 통해 사용할 수 있는 제네릭 매개변수를 선언하는 데 사용됩니다. 이런 식으로 VHDL 프로그램을 다른 응용 프로그램에 적용하는 것이 더 쉬워집니다. 일반 선언은 포트 섹션 이전의 엔터티 부분에서 수행됩니다. 일반 선언의 구문은 다음과 같습니다.
generic(parameter name - 1 : data type - 1 := initial value - 1;
parameter name - 2 : data type - 2 := initial value - 2;
. . .
parameter name - N : data type N := initial value – N);
다음은 generic 선언의 사용 예를 보여주고 있습니다.
entity example_generic is
generic (N : natural:=8;
M: natural:=16 );
port( x_vec: in bit_vector(N-1 downto 0);
y_vec: in bit_vector(M-1 downto 0);
z_vec: out bit );
end entity;
'프로그래밍 언어 > VHDL' 카테고리의 다른 글
[VHDL 학습] when문, select문, generate문 (0) | 2022.03.30 |
---|---|
[VHDL 학습] Architecture (0) | 2022.03.23 |
[VHDL 학습] 입력/출력 포트에서 사용되는 데이터 유형 (0) | 2022.03.22 |
[VHDL 학습] Entity (0) | 2022.03.21 |