반응형

원래 Verilog 표준(IEEE 1364) 1995년에 만들어진 이후 여러 번 업데이트되었습니다.

가장 중요한 업데이트는 IEEE 1394-2001이라는 제목의 2001년에 발생했습니다. 2005년에는 표준에 약간의 개선 사항이 추가되어 IEEE 1394-2005가 되었습니다.

 

Verilog의 기능(: 연산자, 신호 유형, 기능) Verilog 표준 내에서 정의됩니다. 따라서 설계가 IEEE 1394 패키지를 사용하고 있다고 명시적으로 명시할 필요는 없습니다. 이는 Verilog 사용에 내재되어 있기 때문입니다.

 

Verilog는 대소문자를 구분합니다. 또한 각 Verilog 할당, 정의 또는 선언은 세미콜론(;)으로 종료됩니다. 따라서 줄 바꿈이 허용되며 할당, 정의 또는 선언의 끝을 의미하지 않습니다. 줄 바꿈을 사용하여 Verilog를 더 읽기 쉽게 만들 수 있습니다.

 

Verilog의 주석은 두 가지 방식으로 지원됩니다.

첫 번째 방법은 줄 주석이라고 하며 앞에 두 개의 슬래시(: //)가 붙습니다. 슬래시 뒤의 모든 것은 줄 끝까지 주석으로 간주됩니다.

두 번째 주석 접근 방식은 블록 주석이라고 하며 /*로 시작하여 */로 끝납니다. /* */ 사이의 모든 것은 주석으로 간주됩니다. 블록 주석은 여러 줄에 걸쳐 있을 수 있습니다.

 

Verilog의 모든 사용자 정의 이름은 숫자가 아닌 알파벳 문자로 시작해야 합니다. 사용자 정의 이름은 Verilog 키워드와 동일할 수 없습니다.

 

데이터 타입

Verilog에서 모든 신호, 상수, 변수 및 기능에는 데이터 유형이 할당되어야 합니다. IEEE 1394-2005 표준은 미리 정의된 다양한 데이터 유형을 제공합니다. 일부 데이터 유형은 합성할 수 있지만 다른 데이터 유형은 추상 동작을 모델링하기 위한 것입니다.

 

다음은 Verilog 언어에서 가장 일반적으로 사용되는 데이터 유형입니다.

 

Value 유형

Verilog는 신호가 취할 수 있는 4가지 기본 값인 0, 1, X, Z를 지원합니다. Verilog에서 미리 정의된 대부분의 데이터 유형은 이러한 값을 저장합니다.

 

지원되는 각 값에 대한 설명은 다음과 같습니다.

Value Description
0 A logic zero, or false condition.
1 A logic one, or true condition.
x or X Unknown or uninitialized.
z or Z High impedance, tri-stated, or floating.

 

Verilog에서 이러한 값에는 관련 강도도 있습니다. 강도는 신호가 여러 소스에 의해 구동될 때 신호의 값을 해결하는 데 사용됩니다. 이름, 구문 및 상대적인 강점은 다음과 같습니다.

Strength Description Strength level
supply1 Supply drive for VCC 7
supply0 Supply drive for VSS, or GND 7
strong1 Strong drive to logic one 6
strong0 Strong drive to logic zero 6
pull1 Medium drive to logic one 5
pull0 Medium drive to logic zero 5
large Large capacitive 4
weak1 Weak drive to logic one 3
weak0 Weak drive to logic zero 3
medium Medium capacitive 2
small Small capacitive 1
highz1 High impedance with weak pull-up to logic one 0
highz0 High impedance with weak pull-down to logic zero 0

 

신호가 여러 드라이버에 의해 구동될 때 가장 강도가 높은 드라이버의 값을 취합니다. 두 드라이버의 강도가 같으면 값을 알 수 없습니다. 강도를 지정하지 않으면 기본적으로 강한 드라이브 또는 레벨 6이 됩니다.

 

Net 데이터 유형

Verilog 내의 모든 신호는 데이터 유형과 연결되어야 합니다. 네트 데이터 유형은 구성요소 간의 상호 연결(일명 네트)을 모델링하고 0, 1, X Z 값을 가질 수 있는 유형입니다. 네트 데이터 유형의 신호는 항상 구동되어야 하고 값을 업데이트해야 합니다.

 

드라이버 값이 변경될 때 Verilog에서 가장 일반적으로 합성 가능한 순 데이터 유형은 유선입니다. 동일한 네트워크에 대해 여러 드라이버가 있는 복잡한 디지털 시스템을 모델링하는 다양한 고급 네트워크 데이터 유형이 있습니다.

 

모든 Verilog net 데이터 유형에 대한 구문과 설명은 아래에 나와 있습니다.

Type Description
wire A simple connection between components.
wor Wired-OR. If multiple drivers, their values are ORd together.
wand Wired-ANDd. If multiple drivers, their values are ANDd together.
supply0 Used to model the VSS, (GND), power supply (supply strength inherent).
supply1 Used to model the VCC power supply (supply strength inherent).
tri Identical to wire. Used for readability for a net driven by multiple sources.
trior Identical to wor. Used for readability for nets driven by multiple sources.
triand Identical to wand. Used for readability for nets driven by multiple sources.
tri1 Pulls up to logic one when tri-stated.
tri0 Pulls down to logic zero when tri-stated.
trireg Holds last value when tri-stated (capacitance strength inherent).

 

이러한 각 네트 유형에는 관련된 추진력도 있을 수 있습니다. 강도는 여러 드라이버에 연결될 때 네트의 최종 값을 결정하는 데 사용됩니다.

 

Variable 데이터 유형

Verilog에는 스토리지를 모델링하는 데이터 유형도 포함되어 있습니다. 이를 가변 데이터 유형이라고 합니다. 가변 데이터 유형은 0, 1, X Z 값을 가질 수 있지만 연관된 강도는 없습니다. 변수 데이터 유형은 다음 할당까지 할당된 값을 유지합니다. Verilog 변수 데이터 유형에 대한 구문 및 설명은 아래에 나와 있습니다.

 

Type Description
reg A variable that models logic storage. Can take on values 0, 1, X, and Z.
integer A 32-bit, 2s complement variable representing whole numbers between
2,147,483,64810 and +2,147,483,647.
real A 64-bit, floating point variable representing real numbers between
(2.2  10308)10 and +(2.2  10308)10.
time An unsigned, 64-bit variable taking on values from 010 to +(9.2  1018).
realtime Same as time. Just used for readability.

 

벡터

Verilog에서 벡터는 요소의 1차원 배열입니다. 변수 유형 reg 외에도 모든 순 데이터 유형을 사용하여 벡터를 형성할 수 있습니다. 벡터를 정의하는 구문은 다음과 같습니다.

 

<type> [<MSB_index>:<LSB_index>] vector_name

 

모든 범위의 인덱스를 사용할 수 있지만 LSB 인덱스를 0에서 시작하는 것이 일반적입니다.

 

와이어 유형의 "Sum"이라고 하는 8비트 벡터를 정의합니다. MSB는 인덱스 7이 지정되고 LSB는 인덱스 0이 지정됩니다.

wire [7:0] Sum;

 

reg 유형의 "Q"라고 하는 16비트 벡터를 정의합니다.

reg [15:0] Q;

 

벡터 내의 개별 비트는 해당 인덱스를 사용하여 주소를 지정할 수 있습니다. 인덱스 범위를 사용하여 비트 그룹에 액세스할 수 있습니다.

 

다음은 위에서 정의한 벡터 "Sum"의 최하위 비트입니다.

Sum[0];

 

다음은 위에서 정의한 16비트 벡터 "Q"의 상위 8비트입니다.

Q[15:8];

 

배열

배열은 요소의 다차원 배열입니다. 이것은 또한 "벡터의 벡터"로 생각할 수 있습니다.

배열 내의 벡터는 모두 동일한 차원을 갖습니다. 배열을 선언하려면 요소 유형과 차원을 먼저 정의한 다음 배열 이름과 차원을 정의합니다. 차원을 정의할 때 ":"의 왼쪽에 배열의 시작 인덱스를 배치하는 것이 일반적입니다.

 

배열 생성 구문은 다음과 같습니다.

<element_type> [<MSB_index>:<LSB_index>] array_name [<array_start_index>:
<array_end_index>]
;

 

4096, reg 유형의 8비트 벡터 배열을 정의합니다.

reg[7:0] Mem[0:4095];

 

100개의 정수 배열을 정의합니다.

integer A[1:100];

 

배열에 접근할 때 배열의 이름이 먼저 주어지고 그 다음에 요소의 인덱스가 주어집니다. 요소의 인덱스를 추가하여 배열 내의 개별 비트에 액세스하는 것도 가능합니다.

 

다음은 "Mem"이라는 배열 내의 세 번째 요소입니다. 이 구문은 reg 유형의 8비트 벡터를 나타냅니다.

Mem[2];

 

 

다음은 "Mem"이라는 배열 내 세 번째 요소의 MSB입니다. 이 구문은 reg 유형의 단일 비트를 나타냅니다.

Mem[2][7];

 

다음은 "A"라는 배열 내의 두 번째 요소입니다. A는 시작 인덱스 1로 선언되었음을 기억하십시오. 이 구문은 32비트 부호 있는 정수를 나타냅니다.

A[2];

 

다른 기반를 사용하여 숫자 표현하기

구문을 식별하지 않고 Verilog에 단순히 숫자를 입력하면 정수로 처리됩니다.

그러나 Verilog는 다른 기반에서 숫자 정의를 지원합니다. Verilog는 또한 숫자의 선택적 비트 크기 및 부호를 지원합니다. 배열의 값을 정의할 때 가독성을 높이기 위해 숫자 사이에 "_"를 삽입할 수 있습니다. Verilog 컴파일러는 "_"를 무시합니다. 숫자 값은 대문자 또는 소문자로 입력할 수 있습니다(: b 또는 B, f 또는 F). 숫자의 밑을 지정하는 구문은 다음과 같습니다.

 

<size_in_bits><base><value>

 

크기 지정은 선택 사항입니다. 생략하면 숫자는 필요에 따라 선행 0이 추가된 32비트 벡터로 기본 설정됩니다. 지원되는 기반은 다음과 같습니다.

 

Syntax Description
b Unsigned binary.
o Unsigned octal.
d Unsigned decimal.
h Unsigned hexadecimal.
sb Signed binary.
so Signed octal.
sd Signed decimal.
sh Signed hexadecimal.

 

10                            // This is treated as decimal 10, which is a 32-bit signed vector.
4’b1111                  // A 4-bit number with the value 1111.
8’b1011_0000       // An 8-bit number with the value 10110000.
8’hFF                       // An 8-bit number with the value 11111111.
8’hff                        // An 8-bit number with the value 11111111.
6’hA                        // A 6-bit number with the value 001010. Note that leading zeros were added to make

the value 6-bits.
8’d7                        // An 8-bit number with the value 00000111.
32’d0                      // A 32-bit number with the value 0000_0000.
‘b1111                    // A 32-bit number with the value 0000_000F.
8’bZ                         // An 8-bit number with the value ZZZZ_ZZZZ.

 

다른 유형 간 할당

Verilog는 약한 유형의(또는 느슨한 유형의) 언어라고 합니다. , 서로 다른 데이터 유형 간의 할당을 허용합니다. 이것은 신호 할당이 유사한 유형 사이에서만 허용되는 강력한 유형의 언어(: VHDL)와 반대입니다.

Verilog가 다른 유형 간의 할당을 허용하는 이유는 모든 유형을 비트 그룹으로 취급하기 때문입니다.

서로 다른 유형 간에 할당할 때 Verilog는 할당 작업을 수행하는 데 필요한 선행 비트를 자동으로 자르거나 추가합니다.

 

다음 예는 Verilog가 서로 다른 유형 간의 몇 가지 할당을 처리하는 방법을 보여줍니다. ABC_TB라는 변수가 reg[2:0] 유형으로 선언되었다고 가정합니다.

 

ABC_TB 3'b000으로 지정됩니다. 선행 비트가 자동으로 추가됩니다.

ABC_TB = 2’b00;

 

ABC_TB 3'b101로 지정됩니다. 정수는 3비트로 잘립니다.

ABC_TB = 5;

 

ABC_TB 3'b000으로 지정됩니다. 정수는 3비트로 잘립니다.

BC_TB = 8;

반응형
반응형

Verilog 디자인 설명

실제 시나리오에서 Verilog는 세 가지 종류의 코딩 설명으로 분류됩니다. 코딩 설명의 다른 스타일은 구조적, 행동적 및 RTL 디자인입니다.

 

1) 구조 설계

이름에서 알 수 있듯이 구조 설계는 설계의 전체 구조를 설명하는 데 사용됩니다. 주요 의도는 net 연결을 사용하여 게이트 또는 블록 수준 설계의 형태로 논리를 설명하는 것입니다. 구조 설계는 주로 서로 다른 작은 복잡성 디지털 기능 블록의 인스턴스화입니다. 보통의 복잡한 로직을 구현하기 위해 기본적으로 작은 모듈을 연결하는 설계입니다.

다음 예제는 'half_adder'를 유추하는 구조적 코드 스타일을 설명합니다.

 

module half_adder( input wire A, B, output wire S,C);
// design funconality
xor_gate U1 ( .A, .B, .S);
and_gate U2 ( .A, .B, .C);
endmodule


module
xor_gate( input wire A, B, output wire S);
// design funconality
assign S= A ^ B;
endmodule

 

module and_gate( input wire A, B, output wire C);
// design funconality
assign C= A & B;
endmodule

 

half_adder에 대한 설명은 xor_gate and_gate라는 다른 두 모듈의 인스턴스를 사용합니다. 개략도는 다음 그림과 같습니다.

 

2) 행동 디자인(Behavior Design)

이름 자체는 코딩 스타일의 특성이 추가를 수행하는 동작을 설명하는 것임을 나타냅니다. Verilog 코드의 동작 스타일에서 기능은 의도한 디자인 기능을 얻기 위해 입력과 출력 간의 관계를 사용하여 코딩됩니다. 디자인은 입력과 출력이 있는 블랙박스라고 가정합니다. 디자이너의 주요 의도는 필요한 입력 집합에 따라 출력의 기능을 매핑하는 것입니다.

 

module half_adder( input wire A, B, output reg S,C);
// design functionality to generate sum (S) output
always@*
begin
  if
( A==B)
    S= 0;
  else
    S=1;
  end

// design functionality to generate carry(C) output
always@*
begin
  if
( A==1 && B==1)
    C= 1;
  else
    C=0;
  end
endmodule

 

half_adder에 대한 설명은 여러 절차 블록 내에서 if-else 구성을 사용합니다. 여러 절차 블록의 동시 실행으로 인해 비교기 AND 게이트를 유추합니다.

 

3) 합성 디자인(Synthesizable Design)

Verilog를 사용하여 디자인의 기능을 설명하는 실제 환경에서는 항상 합성 가능한 구조를 사용합니다. RTL 코드 스타일은 합성 가능한 Verilog 구성을 사용하는 기능에 대한 상위 수준 설명입니다. 많은 경우 RTL 코딩 스타일은 구조적 또는 행동적 모델과 유사할 수 있습니다. 디자이너의 주요 의도는 합성 가능한 Verilog 구성을 사용하여 의도한 논리를 추론하는 것입니다. 합성 중에 게이트 수준 구조를 유추하는 모든 Verilog 코드는 RTL 디자인으로 취급할 수 있습니다.

module half_adder( input wire A, B, output reg S,C);
// design functionality
always@*
begin
  S= A ^ B;
  C= A & B;
end
endmodule

 

몇 가지 중요한 Verilog 용어

Verilog는 하드웨어를 설명하는 데 사용되는 소프트웨어 언어와 다릅니다. Verilog는 시간 구성 및 지연을 지원합니다.

Verilog는 명령문의 동시(병렬) 실행과 명령문의 순차 실행을 지원합니다.

Verilogblocking(=) 할당과 non-blocking 할당(<=)을 지원합니다.

블로킹 할당은 조합 논리를 설명하는 데 사용되며 논블로킹 할당은 순차 논리를 설명하는 데 사용됩니다.

Verilog는 입력, 출력 및 양방향(inout) 포트 선언을 지원합니다.

Verilog는 상수 및 매개변수 정의를 지원합니다. Verilog는 파일 처리를 지원합니다.

Verilog는 논리값 논리 '0', 논리값 '1', 하이임피던스 'z' 및 알 수 없는 'X' 4가지 값을 지원합니다.

Verilog에는 'always' 'initial'이라는 procedural 블록이 있습니다. 'always' 키워드가 있는 procedural 블록은 자유 실행 프로세스를 나타내며 항상 실행되고 'initial' 키워드가 있는 procedural 블록은 블록이 한 번만 실행됨을 나타냅니다. 두 절차 블록 모두 시뮬레이터 시간 '0'에서 실행됩니다.

Verilog는 합성 가능한 구조와 합성할 수 없는 구조를 모두 지원합니다.

• 합성 가능한 구조는 RTL 설계 중에 사용됩니다.

• 합성 불가능한 구조는 RTL 검증 중에 사용됩니다.

Verilog는 재귀적 사용을 위한 작업 및 기능 사용을 지원합니다.

Verilog 'C' 언어로 작성된 기능에 Verilog의 제어를 전송하기 위해 PLI(Program Language Interface)를 지원합니다.

 

반응형
반응형

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 프로그램의 아키텍처 부분은 전자 회로의 내부 동작을 설명합니다. 전자 회로의 포트에서 수신된 데이터는 아키텍처 부분 내부에서 처리되고 출력 데이터를 얻습니다. 생성된 출력 데이터는 전자 회로의 출력 포트로 전송됩니다.

 

architecture architecture_name of entity_name is
Declarations

begin
Statements

end [architecture] [architecture_name];

 

아키텍처의 마지막 줄은 "end architecture" 또는 "end architecture_name" 또는 "end architecture architecture_name" 또는 "end"일 수 있습니다.

다음 그림은 디지털 회로의 블랙박스 표현하였습니다.

 

 

위의 회로를 구현하기 위한 VHDL 프로그램을 작성하면 다음과 같습니다.

주어진 블랙박스의 엔터티 부분은 다음과 같이 쓸 수 있습니다.

entity example_1_5 is
port
( a, b, c: in bit;
      f1, f2: out bit );
end entity;

 

다음으로 아키텍쳐 부분에서 부울 함수 f1 = ab’+c f2 = abc’ VHDL 구현을 추가합니다.

architecture example_arc of example_1_5 is
begin
    f1<= (a and not (b)) or c;
    f2<= a and b and (not(c));
end example_arc;

 

전체 코딩은 다음과 같습니다.

entity example_1_5 is
port
( a, b, c: in bit;
      f1, f2: out bit );
end entity;

 

architecture example_arc of example_1_5 is
begin
    f1<= (a and not (b)) or c;
    f2<= a and b and (not(c));
end example_arc;

 

아래 디지털 회로를 엔터티와 아키텍쳐를 구현하면 다음과 같습니다.

 

library IEEE;
use IEEE.std_logic_1164.all;
entity
logic_circuit is
port
( x: in std_logic;
     y: in std_logic;
     z: in std_logic;
     f: out std_logic );
end logic_circuit;

 

architecture logic_flow of logic_circuit is
signal
g, h: std_logic;
begin
    g<=x and y;
    h<=not(y) and z;
    f<=g or h;
end logic_flow;

 

데이터 객체

VHDL 프로그래밍에는 값을 보유하는 데이터 개체가 있습니다. 데이터 개체에는 이름과 데이터 유형이 있습니다. 데이터 객체를 사용하기 위한 일반적인 구문은 데이터 객체 이름과 같습니다.

 

data object object name : data type := initial value;

 

여기서 데이터 개체는 신호, 변수 또는 상수일 수 있습니다. 개체 이름은 사용자에게 달려 있습니다. 데이터 유형은 bit, std_logic, integer, unsigned, signed, std_logic_vector, bit_vector 등과 같이 VHDL 프로그래밍에서 사용할 수 있는 모든 데이터 유형일 수 있습니다.

 

signal 객체는 아키텍처의 선언적 부분에서 선언할 수 있습니다. 반면에, 변수 객체는 프로세스, 프로시저, 함수와 같은 순차적인 프로그램 세그먼트 내부에서 선언될 수 있습니다.

상수 개체는 일반적으로 아키텍처, 엔터티, 패키지, 프로세스, 프로시저 및 함수의 선언적 부분에서 선언됩니다. 그러나 패키지 본문, 블록, 생성에서도 선언할 수 있습니다.

 

상수 객체

상수 개체의 값은 프로그램을 통해 변경할 수 없습니다. 구문은 다음과 같습니다

 

constant name : data type := initial value;

 

다음은 상수객체의 선언 예제입니다.

constant my_constant: integer:=32;
constant my_flag: std_logic:=’1’;
constant my_vector : std_logic_vector(3 downto 0):= "1010";

 

signal 객체

신호 객체 선언은 초기 값을 포함하거나 포함하지 않을 수 있습니다. 신호 객체는 일반적으로 아키텍처 및 패키지의 선언적 부분에 사용됩니다.

함수, 프로시저 및 프로세스와 같은 순차적인 프로그램 세그먼트 내에서는 신호 선언이 허용되지 않습니다. 그 구문은 다음과 같습니다

 

signal name : data type := initial value;

 

다음 예제는 signal 객체의 선언을 보여주고 있습니다.

 

signal my_number: integer;
signal my_bit: bit:=’1’;
signal my_vector : std_logic_vector(3 downto 0):= "1010";

 

variable 객체

변수 객체 선언은 초기 값을 포함하거나 포함하지 않을 수 있습니다. 변수 객체는 기능, 절차, 프로세스와 같은 순차적인 프로그램 단위에서 사용됩니다. 그 구문은 다음과 같습니다

 

variable name : data type := initial value;

 

다음 에제는 variable 객체의 선언을 보여주고 있습니다.

 

variable my_number: natural;
variable my_logic: std_logic:=’1’;
variable my_vector : std_logic_vector(3 downto 0):= "1110";

반응형

+ Recent posts