Unit 10 Introduction to VHDL
-
Upload
clinton-walters -
Category
Documents
-
view
276 -
download
5
description
Transcript of Unit 10 Introduction to VHDL
Unit 10 Introduction to VHDL
강의 개요VHDL 소개
VHDL 문법 소개 VHDL 을 활용한 조합 논리 회로 설계 연산자의 우선순위 파악 산술 연산 수행
10.0 VHDL 소개
하드웨어기술언어 (HDL : Hardware Description Language)
최초로 공인된 표준 하드웨어 설계언어 CPLD/FPGA 등 소규모 설계에서 주문형집적회로 (ASIC) 등 대규모
시스템설계에 사용
회로도와 하드웨어기술언어의 설계 비교
(a) 회로도를 이용한 설계 (b) 하드웨어기술언어를 이용한 설계
10.0 VHDL 소개
■ 하드웨어기술 언어의 종류
[ 표 ] 하드웨어기술언어의 종류
10.0 VHDL 소개VHDL 의 출현배경 VHDL 의 기능 ① V:VHSIC(Very High Speed Integrated Circuit) + HDL: Hardware Description Language ② 문서화 (coding/modeling), 검증 (simulation/verification), 합성 (synthesis) IEEE(the Institute of Electrical and Electronics Engineers) 공인 1987 년 ; IEEE_1076, 1991 년 : IEEE_1164
VHDL 의 사용 배경 ① 컴퓨터 , 휴대전화 , 통신장치 등 고부가가치 제품의 다양한 기능과 높은 성능이 요구 ② 고 집적화 , 낮은 가격 , 빠른 개발기간이 요구 ③ 기존의 전통적인 설계방법은 경쟁력이 없어지고 , 하드웨어기술언어 의 사용이 필요한 상황
10.0 VHDL 소개VHDL 의 특징 장점 ① 특정기술 , 공정에 독립적 : 특정기술이나 공정에 관계없이 디지털시스 템의 설계가 가능 ② 광범위한 기술능력 : 다양한 설계기법을 이용한 설계가 가능하여 , 사 용자가 원하는 기술의 사용이 가능하고 , 소규모는 물론 대규모 시스 템의 설계에 유용하며 , 설계 재사용이 가능 ③ 표준화와 문서화 : IEEE 에 의한 표준화 , 하드웨어 관련 문서화에 용이 ④ 설계기간 단축 : 검증의 빠른 반복능력으로 설계기간이 단축되고 , 설 계자 오류의 검증이 용이하며 , 제품 설계비용의 감소 등 경쟁력 강화 에 적합
단점 ① VHDL 자체의 복잡성으로 많은 시간과 노력이 필요 ② 회로합성 단계가 필요하므로 합성 툴 (tool) 에 따라 회로 성능이 좌우 ③ 합성 툴 (tool) 이 VHDL 구문의 일부 지원에 따른 불편
10.0 VHDL 소개VHDL 의 역사
VHDL 관련 표준화 설명 ꋻ IEEE std_1076 : VHDL 표준의 핵심부분으로 언어의 정의를 표준화 ① 1076.1: VHDL 아날로그 (analog) 와 혼합 아날로그 - 디지털 시스템 (mixed analog-digital system) 부분의 정의 ② 1076.2: 수학연산을 위한 수학도구에 대한 부분의 정의 ③ 1976.3: VHDL 합성 (synthesis) 에 대한 부분의 정의 ④ 1076.4: VITAL(VHDL initiative towards ASIC libraries) 에 대한 부분의 정의 ⑤ 1976.5: IEEE 라이브러리 부품 (library components) 에 대한 부분의 정의 ꋻ IEEE std-_1164 : 실제 시스템에 적용할 수 있는 다중 값 (multi value) 에 대한 부분의 정의 ꋻ IEEE std_1029 : 타이밍 검증을 위한 파형 , 벡터변환 등에 대한 부분 의 정의
[ 그림 1.12] VHDL 관련 표준화의 역사
10.1 조합회로의 VHDL 표현<= 연산자 신호의 할당 연산자로 오른쪽의 논리식이 계산 되어 기호의 왼쪽에
위치하는 신호에 할당 된다는 의미
괄호 연산자 () 실행의 우선순위
일반적인 신호 할당문 Signal_name <= expression [after_delay];
After_delay 는 꼭 필요하지 않다 . 생략 되면 Delta delay 후 갱신된다 .
C <= A and B after 5ns;E <= C or D after 5ns;
E <= D or (A and B);
10.1 조합회로의 VHDL 표현 인스턴스 구문 Gate1 : AND2 portmap (A,B,D); Gate2 : OR2 portmap(C,D,E);
자체 포트맵의 입력신호 중 하나 이상이 변하는 즉시 실행 되는 동시문 .
Gate 1 은 A 또는 B 가 변할 때 마다 . D 의 새로은 값을
계산 . Gate 2 는 C 또는 D 가 변할 때 마다 . E 의 새로운 값을
계산 .
10.1 조합회로의 VHDL 표현 CLK 신호를 통한 동시성
출력이 ‘ 0’ 이라면 . 피드백 된 신호 ‘ 0’ 이 인버터의 입력력으로 입력되고 .
10 ns 후에 ‘ 1’ 이 출력된다 .
대소문자 구분이 없다 . 아래 두 줄은 같은 의미를 가진다 .
10.1 조합회로의 VHDL 표현
11
VHDL 에서의 주석문 (comments) 설계의 내용을 설계자가 쉽게 이해할 수 있도록 기술한 것으로 VHDL 컴파일러 (compiler) 입장에서는 무시하고 넘어가는 부분 . 두 개의 하이픈 (hyphen) 즉 , “--” 으로 시작하고 , 그 끝 줄에서 종료
▪ 주석문의 활용
[ 예제 ] 주석문의 활용 예 1 process(rst, clk)
2 begin 3 -- if 문 4 if rst='0' then -- low active reset 5 cnt <= (others => '0'); 6 E <= '0'; RS <= '0'; RW <= '0'; 7 DB <= "00000000"; 8 elsif clk'event and clk='1' then -- clock's rising edge 9 if 10000 = '1' then 10 -- if 100 = '1' then 11 cnt <= cnt+1; 12 if cnt = 1 then 13 E <= '1'; RS <= '0'; RW <= '0'; 14 DB <= "00111000"; -- function
15 elsif cnt =3 then 16 E <= '1'; RS <= '0'; RW <='0'; 17 DB <= "00001110"; -- DB : display on 18 end if;
10.1 조합회로의 VHDL 표현 식별자 (identifiers)
이름을 의미 , 즉 VHDL 코드 (code) 를 구성하는 엔티티 (entity), 아키텍처 (architecture) , 포트 (port) 등 여러 가지 기능을 정의하여 식별하기 위한 공백이 없는 문자열
▪ 식별자 활용 [ 예제 ] 식별자의 활용 (4bit 비교기 ) 1 library ieee; 2 use ieee.std_logic_1164.all; 3 -- entity structure 4 entity compare_4 is 5 port(x, y : in std_logic_vector( 3 downto 0); 6 equal : out std_logic); 7 end compare_4; 8 -- 아키텍처 몸체 9 architecture equal_logic of compare_4 is 10 begin 11 equal <= '1' when (x=y) else '0'; 12 end equal_logic;
▪ 식별자의 규칙 ① 첫 번째 문자는 반듯이 영문자 (a ~ z) 로 시작 , 두 번째 문자부터 영문자 , 숫자 (0 ~ 9) 및 밑줄 문자 등의 혼합이 가능 ② 마지막 문자는 밑줄 문자와 밑줄 문자를 두 개 이상 연속 사용 불가 ③ 대문자 , 소문자의 구별은 없으며 , VHDL 구문의 예약어는 식별자로 사용 불가
10.1 조합회로의 VHDL 표현▪ 올바른 식별자의 사용
[ 예제 ] 올바른 식별자의 사용 올바른 식별자 ꋻ FET Decoder_4 sig_N compare_eq main_clock 잘못된 식별자 ꋻ ① _ Decoder_4 -- 첫 문자는 영문자로 시작 ② 2FET_2 -- 첫문자는 영문자로 시작 ③ sig_*R -- 문자 , 숫자 , 밑줄 문자로만 구성 ④ MOS-FET -- 문자 , 숫자 , 밑줄 문자로만 구성 ⑤ Decoder_ -- 밑줄 문자가 마지막에 기술되면 안됨 ⑥ Main__clk -- 밑중 문자가 연속 2개 사용 불가
10.1 조합회로의 VHDL 표현 리터럴 (literals) VHDL 코드로 설계를 할 때 , 직접적으로 표현하는 값 또는 문자를 말함 .
▪ 리터럴 (literal) 의 사용
[ 예제 ] 리터럴의 사용 1 elsif cnt =3 then 2 E <= '1'; RS <= '0'; RW <= '0'; 3 DB <= "00001100";
▪ 리터럴의 표현법 숫자 (numbers) 의 표현 : 숫자는 10 진수 표현 (decimal literals) 과 2진 , 8 진 , 16 진과 같이 밑 수 (base) 에 따라 표시되는 방법 (based literals) 이 있으며 , 숫자에 소수점이 있으면 실수 (real literal) , 없으면 정수 (integer literal) 표현 [ 예제 ] 10 진수에 의한 표현 0 1 123_456_78- 9987E6 -- 정수 0.0 0.5 2.718_28 12.4E-9 -- 실수 [ 예제 ] 밑 수에 의한 표현 16#FE -- 16 진수 : FE = 정수 254 2#1111_1110# -- 2 진수 : 11111110 = 정수 254 16#D#E1 -- 16 진수 : D=13, E1= 161 = 13 x 161 = 실수 208
10.1 조합회로의 VHDL 표현 문자 (characters literals) 의 표현
[ 예제 ] 문자의 표현 ‘1’, '?', 'B', 'b' ▪ 문자열 (strings literals) 의 표현법 ① 단일문자들의 집합인 문자열은 이중 인용 부호 ( 큰 따옴표 : “ ”) 에 넣어 표시 ② 한 줄을 벗어나는 길이의 문자열은 접합연산자 & 를 사용하여 구성 [ 예제 ] 문자열의 표현 "B string", "A string in a strong"
▪ 비트 열 (bit string) 의 표현 ① 비트는 단일 인용 부호 ( 작은 따옴표 :‘ ’) 사이에 숫자를 넣어 ‘ 1’ 또는 ‘0’ 으로 표시하고 , 비트 열은 이중 인용 부호 ( 큰 따옴표 :“ ”) 사이에 비트 열을 표시 ② 비트 벡터의 값을 정의하기 위해 사용하며 , 기수를 정의하는 문자가 앞에 표시되는 수열을 나타내고 , 2 진수는 B, 8 진수는 O, 16 진수는 X 로 시작 [ 예제 ] 비트열의 표현 B"1010110" -- 2 진수로 bit 의 길이가 7 O"127" -- 8 진수로 bit 의 길이가 9이며 , 2 진수로 “ 001_010_111” 과 동등 값 X"FF" -- 16 진수로 bit길이가 8이며 , 2 진수로 “ 1111_1111” 과 동등 값
10.2 멀티플렉서를 위한 VHDL 모델 2-to-1 멀티 플렉서
F = A’·I0 + A · I1 로 표현 되며 아래 두가지 방법으로 표시 할 수 있다 .
F <= (not A and I0) or (A and I1) F <= I0 when A=‘0’ else I1;
조건부 신호 할당문 signal_name <= expression1 when condition1 else expression2 when condition2 [else expression N];
[ 예 ] 직렬로 연결된 2개의 2-to-1 멀티플렉서
10.2 멀티플렉서를 위한 VHDL 모델 4-to-1 멀티 플렉서
10.3 VHDL 모듈
설계단위의 VHDL 구문 예
[ 예제 ] 설계단위의 예 <VHDL 구문 > 1 entity nor_2 is -- Primary unit 2 port (x, y : in bit; -- NOR 게이트의 외적 표현 3 z : out bit); 4 end nor_2; 5 architecture example of nor_2 is -- secondary unit 6 begin 7 z <= x nor y; -- NOR 게이트의 내적 표현 8 end example;
2 입력 NOR 게이트 설계
10.3 VHDL 모듈 VHDL 의 기본 구성 ▪ 필수적인 설계단위 - 엔티티 (entity) 와 아키텍처 몸체 (architecture body)
① 제 1단계 : 엔티티 (entity) 를 선언 하드웨어 외부의 입ㆍ출력 ꋻ Interface 를 정의한 디지털 시스템의 본체 하드웨어 블럭의 이름과 입ㆍ출력 ꋻ port 를 선언 ② 제 2단계 : 아키텍처 몸체 (architecture body) 를 표현 디지털 시스템인 하드웨어 내부를 표현 ꋻ
내부회로의 연결ꋻ , 동작 또는 구조 등을 표현
▪ VHDL 의 기본구조
[ 그림 ] VHDL 의 기본 구조
10.3 VHDL 모듈 VHDL 의 설계단위와의 관계
(a) 기본 개념
[ 그림 ] VHDL 의 기본 설계단위 구조
(b) VHDL code 개념
10.3 VHDL 모듈 ( 엔티티 ) 기본 형식
▪ 엔티티 (entity) 선언 설계할 영역의 이름과 외부 환경과의 입ㆍ출력 정보를 나타낸 포트 (port) 부분을 합한 것
[ 예제 ] 엔티티 선언 (NAND 게이트 ) 엔티티ꋻ (entity) 의 영역
ꋻ NAND 게이트의 엔티티 선언 <VHDL 구문 > 1 entity nand_2 is -- 하드웨어 블록 이름이 nand_2 2 port ( x, y : in bit; -- 단자 (port) 신호 : x, y 는 입력 , bit 형 데이터 3 z : out bit ); -- z 는 출력 , bit 형 데이터 4 end nand_2 ; -- nand_2 의 마감
[ 그림 ] entity nand_2 영역
10.3 VHDL 모듈 ( 엔티티 ) [ 예제 ] 엔티티 선언 (1bit full_adder) 엔티티ꋻ (entity) 영역과 회로도
ꋻ VHDL 의 엔티티 선언 1 entity adder_1 is 2 port ( X, Y, Ci : in bit; 3 S : inout bit; 4 Co : out bit); 5 end adder_1;
(a) 엔티티 영역 (b) 회로도 [ 그림 ] 1 비트 (bit) 전가산기 회로
10.3 VHDL 모듈 ( 엔티티 ) 엔티티 (entity) 의 일반적 형식 [ 형식 ] 일반적 형식 entity 엔티티 _이름 is port( 포트 _이름 : [ 모드 ] 자료형 ; 포트 _이름 : [ 모드 ] 자료형 ); end 엔티티 _이름 ;
엔티티 (entity) 의 모델과 구성
(a) 엔티티의 모델
[ 그림 ] 엔티티 (entity) 의 구조
(b) 엔티티의 구성
10.3 VHDL 모듈 ( 엔티티 ) 엔티티의 기본활용
[ 예제 ] 엔티티 선언 (2_ 입력 NAND 게이트 )
<VHDL 구문 > 1 entity NAND2_system is 2 port ( x, y : in bit; 3 z : out bit ); 4 end NAND2_system ; 5 architecture example of NAND2_system is 6 begin 7 z <= x nand y ; 8 end example ;
[ 그림 ] 2_ 입력 NAND 게이트
10.3 VHDL 모듈 ( 엔티티 )
[ 예제 ] 엔티티의 구조 ( 간단한 조합논리회로 )
<VHDL 구문 > 1 entity combi_sys is 2 port ( a, b, c, d : in bit ; 3 out1, out2, out3 : out bit ); 4 end combi_sys ; 5 architecture example of combi_sys is 6 begin 7 out1 <= a or b ; 8 out2 <= b nand c ; 9 out3 <= not(d); 10 end example ;
[ 그림 ] 간단한 조합논리회로
10.3 VHDL 모듈 ( 엔티티 )
포트 (port) 기능의 이해 하드웨어 부품 (component) 상의 단자들을 표현하며 포트의 이름 , 신호의 흐름 및 자료형으로 나타내는 부분으로 엔티티 내 외부 신호선의 연결상태를 기술
[ 형식 ] 포트 (port) 의 일반적 형식 port( 포트 _이름 , 포트 _이름 : [ 모드 ] 자료형 ; 포트 _이름 ,포트 _이름 : [ 모드 ] 자료형 ); [ 예제 ] 포트 (port) 의 활용 port(X, Y, Ci : in bit; S : inout bit; Co : out bit);
10.3 VHDL 모듈 ( 엔티티 )
모드 (mode) 의 종류 in(안으로 ) : 입력 (input) 으로 신호가 해당 엔티티로 들어가는 경우에 사용 out(밖으로 ) : 출력 (output) 으로 해당 엔티티에서 신호가 출력되는 경우에 사용 inout(안 밖으로 ) : 입 /출력 (input/output) 으로 해당 엔티티에서 신호가 양방향으로 사용 buffer(밖으로 , 되 읽음 ) : 출력기능과 같으나 , 단지 자신의 신호를 되 읽는 경우에 사용 linkage : 동작에 영향을 주지 않으며 단지 포트의 연결상태만 나타냄
[ 그림 ] 포트 (port) 에서 모드 (mode) 의 종류
10.3 VHDL 모듈 ( 엔티티 )
포트 신호 (port signal) 의 자료형태 ▪ 자료형에 대한 bit 와 bit_vector ꋻ bit : signal 의 개수가 1개인 경우에 사용 ꋻ bit_vector: signal 의 개수가 여러 개인 경우에 사용 오름차순ꋻ : bit_vector(0 to 7), 내림차순 : bit_vector(7 downto
0)
1 entity block_port is 2 port( x, c : in bit; 3 y : in bit_vector (7 downto 0); 4 z : out bit_vector (3 downto 0); 5 d : out bit); 6 end block_port; ▲ ▲ 모드 (mode) 형태 (type)
[ 그림 2.11] 포트 (port) 에서 자료의 형태
10.3 VHDL 모듈 ( 엔티티 )
bus signal 의 내림차순과 오름차순 ꋻ downto : 내림차순 표현 port ( clk : in bit ; z : buffer bit_vector (3 downto 0)) ;
z <="0011" ; -- z(3)=0, z(2)=0, z(1)=1, z(0)=1 ꋻ to : 오름차순표현 port ( clk : in bit ; z : buffer bit_vector (0 to 3)) ;
z <="0011" ; -- z(0)=0, z(1)=0, z(2)=1, z(3)=1
10.3 VHDL 모듈 ( 아키텍처 ) 아키텍처 (architecture) 설계할 회로의 실질적인 내부 동작 또는 각 부품들 사이의 연결구조ꋻ 를 기술하는 부분 . 하나의 엔티티 선언에는 여러 개의 아키텍처 몸체ꋻ (architecture body) 가 연결 가능 . 아키텍처 기술방법은 동작적ㆍ자료흐름적 기법과 구조적 기법ꋻ . [ 예제 ] 아키텍처 활용 (NAND 게이트 )
ꋻ <VHDL 구문 > 아키텍처 몸체 선언 1 architecture example of nand2_system is -- nand2_system 의 -- 회로의 이름이 example 2 begin -- 내용의 시작 3 z <= x nand y; -- z 에 x nand y 를 대입 4 end example; -- example 의 끝
[ 그림 2.13] 아키텍처 example 의 영역
10.3 VHDL 모듈 ( 아키텍처 )[ 예제 ] 아키텍처의 활용 (1bit full_adder) 아키텍처의 영역과 회로도 ꋻ
ꋻ VHDL 의 아키텍처 구문 ( 선언문이 없는 경우 ) architecture combi_logic of ADDER1_system is begin S <= (X xor Y) xor Ci; -- 덧셈 결과 Co <= (X and Y) or (S and Ci); end combi_logic; ꋻ VHDL 의 아키텍처 구문 ( 선언문이 있는 경우 )
1 architecture combi_logic of ADDER1_system is 2 signal n1, n2, n3 : bit; -- n1, n2, n3 을 신호로 선언 3 begin 4 n1 <= X xor Y; -- n1 : 내부 신호 연결 5 S <= n1 xor Ci; -- 덧셈 결과 6 n2 <= X and Y; -- n2 : 내부 신호 연결 7 n3 <= S and Ci; -- n3 : 내부 신호 연결 8 Co <= n2 or n3; -- 자리올림수 결과 9 end combi_logic;
▪ 아키텍처 (architecture) 의 일반적 형식 [ 형식 2.3] 일반적인 형식 architecture 아키텍처 _이름 of 엔티티 _이름 is { 선언문 } begin { 내부적 동작표현 } end 아키텍처 _이름 ;
[ 그림 ] 1 비트 (bit) 전가산기 회로
10.3 VHDL 모듈 ( 아키텍처 ) Full Adder
10.3 VHDL 모듈 ( 아키텍처 ) 4 bit Full Adder
10.4 신호와 상수
객체 (data object) VHDL 에서 값을 갖을 수 있는 것으로 모든 객체는 자료형을 갖음 [ 예제 ] 객체의 종류 및 특징
■ signal( 신호 ) : 외적 변수 , 선 (wire) 으로 표현
signal a, b, c : bit -- signal 선언 c <= a and b ; -- 값 ( 파형 ) 대입 ■ variable( 변수 ): 내적변수 ,process 내부에서 유효 variable temp : bit ; -- variable 선언 temp := a or b; -- 값 ( 파형 ) 대입 ■ constant( 상수 ) :
초기에 선언된 값을 계속 유지하는 상수값 지님 constant p1 : integer := 314 ; -- 상수선언과 동시에 상수값 대입
10.4 신호와 상수
신호 (signal) ▪ 신호는 VHDL 합성시 선 (wire) 으로 구현되며 , 각 부품의 연결에 사용되는 외적변수 . ▪ 객체에 값의 대입 “<=” 의 오른쪽에서 왼쪽으로 대입하는 시간지연요소 대입기호를 사용 . signal 의 초기값 대입의 경우는 즉시 대입 기호 “ :=” 사용 . ▪ 자료형의 선언 bit : 신호의 자료형이 0 혹은 1일 때 단일신호로 사용 bit_vector : 다중신호를 의미 , 신호의 개수를 나타내는 내림차순 (downto) 또는 올림차순 (to) 를 사용
[ 그림 ] 버스 다발과 비트의 순서
10.4 신호와 상수
[ 예제 ] 자료형이 bit 인 signal 의 선언 signal a, b, c : bit -- a, b, c 는 객체의 이름 -- a, b, c 의 객체 종류는 signal 이므로 선 (wire) 으로 구현가능 -- a, b, c 의 자료형이 bit 형이므로 ‘ 1', '0' 의 두 가지 값을 갖음
[ 예제 ] signal 의 활용
<VHDL 구문 > 1 entity combi_logic is 2 port ( a, b : in bit; 3 z, y : out bit); 4 end combi_logic; 5 architecture data_flow of combi_logic is 6 signal s1, s2 : bit; -- architecture 와 begin 사이에 선언 7 begin 8 s1 <= a; -- 신호 a 를 s1 으로 전달 9 s2 <= b; -- 신호 b 를 s2 로 전달 10 z <= s1 or s2; -- "s1 or s2" 를 z 에 전달 11 y <= s1 and s2; -- "s1 and s2" 를 y 에 전달 12 end data_flow;
[ 그림 ] 간단한 조합논리회로
10.4 신호와 상수
[ 예제 ] signal 의 선언 ( 자료형 : bit_vector) 1 signal count : bit_vector (3 downto 0) ; -- signal count(3), count(2), count(1), count(0) : bit 와 동일한 선언 -- count 를 4 비트 bus 로 선언 2 signal temp : bit_vector (3 downto 0) := "1100"; -- temp 를 4 비트 bus 로 선언하고 초기값 대입
[ 예제 ] signal 선언의 활용 <VHDL 구문 > 1 entity combi_system is 2 port ( x1, x2, x3 : in bit ; -- signal x1, x2, x3 선언 3 y_out : out bit ); -- signal y_out 선언 4 end combi_system;
5 architecture example of combi_system is 6 signal s0 : bit ; -- signal s0 선언 , signal 선언위치 -- : architecture 와 begin 사이 7 begin 8 s0 <= x1 nand x2 ; -- signal 에 파형 대입 9 y_out <= s0 xor x3 ; -- s0 과 x3 를 exclusive 하여10 end sample; -- y_out 에 대입
[ 그림 ] 간단한 조합회로 system
10.4 신호와 상수
변수 (variable) process 나 부프로그램에서만 사용되는 내적변수로서 중간연산단계에 주로 이용 , 대입기호 즉시 대입기호 ‘ :=’ 사용 [ 예제 ] 변수 선언방식 variable temp1, temp2:bit; -- variable_ 이름이 temp1, temp2 로 정의 , 자료형은 bit temp1 := '1'; -- := 는 즉시 값이 대입 temp2 := a or b; -- a, b 는 signal 이고 , temp2 는 variable
[ 예제 ] 3 입력 NAND 게이트 <VHDL 구문 > 1 architecture example of nand_system is 2 begin 3 process (x, y, z) 4 variable temp : bit; -- variable 선언 , variable 위치 process 와 begin 사이 5 begin 6 temp := '1' ; -- temp 가 즉시 ‘1’ 로 바뀜
7 temp := x nand temp ; -- variable 의 즉시 대입 , temp=x
8 temp := y nand temp ; -- temp=x · y
9 temp := z nand temp ; -- temp=x · y · z 10 y_out <= temp ; -- signal 에 variable 의 시간지연 대입 , y_out=x*y*z
11 end process ; 12 end example ;
[ 그림 ] 엔티티 nand_system
10.4 신호와 상수
신호 (signal) 와 변수 (variable) 의 비교 ▪ 신호 (signal) 외부 변수 ꋻ 선언 ꋻ : architecture 와 begin 사이에서 선언 , 부프로그램에서 선언 , port signal 에서 선언 합성시 ꋻ wire 로 구현되며 , 비교적 간단한 연산이 요구될 때 이용 ꋻ signal 에 값 ( 파형 ) 이 인가될 때 현재의 변화된 값이 바로 대입되지 않고 process 가 끝난 시점에 대입
변수 (variable) 내부 변수 ꋻ 선언 ꋻ : process 와 begin 사이에서 선언 ,부프로그램의 parameter 에서 선언 합성시 선ꋻ (wire) 로 바로 구현되지 않고 연산의 중간단계로 활용 복잡한 알고리즘의 구현시 사용되며ꋻ , 현재의 값만 가짐 ꋻ process 와 subprogram 내에서만 유효 , 이 영역을 벗어나면 variable 값이 무효
10.4 신호와 상수
[ 예제 ]signal 과 variable 의 사용상 차이점
signal 이 잘못 사용한 예 <VHDL 구문 > 1 architecture example1 of nand2_system is 2 signal temp : bit ; -- signal 선언 (architecture 와 begin 사이 ) 3 begin 4 process (x, y) 5 begin 6 temp <= '1' ; -- 현 시점에서는 temp = '0', end process 에서 temp ='1'
7 temp <= x nand temp; -- end process 에서 temp =‘1' 8 temp <= y nand temp; -- end process 에서 temp =‘1' 9 z_out <= temp; -- end process 에서 z_out = ‘1' 10 end process ; 11 end example1 ;
[ 그림 ] 두 입력 AND 게이트 (entity nand2_system)
10.4 신호와 상수
variable 을 사용한 문제 해결 <VHDL 구문 > 1 architecture example2 of nand2_system is 2 begin 3 process (x, y) 4 variable temp : bit ; -- variable 선언 (process 와 begin 사이 ) 5 begin 6 temp := '1' ; -- temp 가 즉시 '1' 로 바뀜 7 temp := x nand temp ; -- temp = (x*1)'
8 temp := y nand temp ; -- temp = (x*y)'
9 z_out <= temp ; -- z_out = (x*y)'
10 end process ; 11 end example2 ;
10.4 신호와 상수 상수 (constant) 초기에 선언한 상수의 값을 유지하는데 사용하며 , 고정된 값을 갖음
[ 형식 ] 상수의 선언 방식 constant 상수 _이름 : 자료형 [:= 초기값 ] ; -- 상수선언과 초기화 [ 예제 ] 상수의 활용 constant delay : time :=5ns -- constant 선언
constant size : integer :=516; -- constant 선언 , 초기화
문장 (statements) ▪ VHDL 의 기본 문장 ▪ 선언문 (declaration statement) 설계내에서 사용할 수 있는 상수 , 자료형 , 객체 , 부프로그램 등을 정의하는데 사용 상수 (constants) : 리터럴 (literal) 숫자 , 스트링 (strings) 자료형 (types) : 레코드 (records) 배열 (array) 객체 (objects) : 신호 (signal), 변수 (variable), 부품 (component) 부프로그램 : 함수 (function), 프로시저 (procedure)
연산자 (operators) 논리 연산자 (logic operators) 논리조합을 만드는데 사용하며 , bit, boolean, bit_vector 를 지원 .
[ 예제 ] 논리연산자의 활용 (bit_vector, bit, boolean) 1 architecture example of combi_logic is 2 signal w, x, y : bit_vector (3 downto 0); 3 signal a, b, c, d : bit ; 4 signal e, f, g, h : boolean ; 5 begin 6 w <= x and y; -- w, x, y 는 같은 수의 bit_vector 형임 7 d <= (a and b) and c ; -- a, b, c, d 는 같은 bit 형 임 8 e <= (f nand g) xor h ; -- e, f, g 는 같은 boolean 형 임 9 end example;
[ 표 3.1] 논리 연산자 (AND 게이트 )
[ 그림 ] 논리 연산의 논리도
10.6 VHDL 연산자
관계 연산자 (relational operators) 비교함수를 만드는데 사용되며 , 대부분의 자료형을 지원 .
[ 예제 ] 관계 연산자의 사용 1 variable num1 : real := 100.0; 2 variable num2 : bit_vector(7 downto 0) :=('0','0','0','0','0','0') 3 variable num3, num4 : bit_vector(2 downto 0) 4 num1 /= 350.54 -- num1 과 350.54 는 같지 않음 5 num1 = 100.0 -- num1 과 100.0 은 같음 6 num2 /= ('1','0','0','0','0','0') -- num2 가 오른쪽과 같지 않음 7 num1 > 45.54 -- num1 은 45.54보다 큼 8 num2 < ('1','0','0','0','0','0') -- num2 가 오른쪽보다 작음
[ 표 ] 관계 연산자의 종류
10.6 VHDL 연산자
산술 연산자 (arithmetic operators) 정수와 실수 등의 숫자형만 지원 가능하며 , 다른 자료형의 경우 IEEE1076.3 의 numeric_std 패키지 이용 .
[ 예제 ] 산술 연산자의 사용 1 architecture arith of or2 is 2 begin 3 process(a,b) 4 begin 5 y1 <= a+b; -- a 더하기 b 6 y2 <= a-b; -- a 빼기 b 7 y3 <= a*b; -- a 곱하기 b 8 y4 <= a mod b; -- a 를 b 로 나눈 모듈 9 y5 <= a rem b; -- a 를 b 로 나눈 나머지 10 y6 <= abs a; -- a 의 절대값 11 end process; 12 end arith;
[ 표 ] 산술 연산자의 종류
10.6 VHDL 연산자
순환 연산자 (shift operators) 순환 연산자는 1 차원적인 bit 의 배열이나 부울형을 지원 .
[ 표 ] 순환 연산자의 종류
[ 그림 ] 순환 연산
10.6 VHDL 연산자
[ 예제 ] 순환 연산자의 사용 variable sm5 : bit_vector(3 downto 0) :=('1','0','1','1') sm5 sll 1 -- sm5 을 1 만큼 sll 하면 (‘0’,‘1’,‘1’,‘0’) sm5 sll 3 -- sm5 을 3 만큼 sll 하면 (‘1’,‘0’,‘0’,‘0’) sm5 sll -3 -- sm5 을 -3만큼 sll 하면 srl 을 3 만큼 한 것과 같음
sm5 srl 1 -- sm5 을 1 만큼 srl 하면 (‘0’,‘1’,‘0’,‘1’) sm5 srl 3 -- sm5 을 3 만큼 srl 하면 (‘0’,‘0’,‘0’,‘1’)
sm5 sla 1 -- sm5 을 1 만큼 sla 하면 (‘0’,‘1’,‘1’,‘1’) sm5 sla 3 -- sm5 을 3 만큼 sla 하면 (‘1’,‘1’,‘1’,‘1’) sm5 sla -3 -- sm5 을 -3만큼 sla 하면 sra 을 3 만큼한 것과 같음
sm5 sra 1 -- sm5 을 1 만큼 sra 하면 (‘1’,‘1’,‘0’,‘1’) sm5 sra 3 -- sm5 을 3 만큼 sra 하면 (‘1’,‘1’,‘1’,‘1’)
sm5 rol 1 -- sm5 을 1 만큼 rol 하면 (‘0’,‘1’,‘1’,‘1’) sm5 rol 3 -- sm5 을 3 만큼 rol 하면 (‘1’,‘1’,‘0’,‘1’) sm5 rol -3 -- sm5 을 -3만큼 rol 하면 ror 을 3 만큼 한 것과 같음 sm5 ror 1 -- sm5 을 1 만큼 ror 하면 (‘1’,‘1’,‘0’,‘1’) sm5 ror 3 -- sm5 을 3 만큼 ror 하면 (‘0’,‘1’,‘1’,‘1’)
10.6 VHDL 연산자
연결연산자 (concatenation operators) 연결 연산자는 원하는 새로운 형태의 1 차원 배열을 만드는데 편리한 기능 제공
[ 예제 ] 연결 연산자의 사용 1 entity con is 2 port(A, B : in unsigned(2 downto 0); -- 입력 A :"100", 입력 B : "010" 이라 가정 3 Y : out unsigned(14 downto 0)); -- 출력 Y는 15bit 4 end con; 5 architecture cdma of con is 6 constant C : unsigned(2 downto 0) :="001"; -- C 를 상수로 선언하고 , 3bit "001" 7 begin 8 process(A, B) 9 begin 10 Y <= A & B & C & C & "110"; -- 최상위 비트부터 “100”, “010”, “001”, 11 end process; -- “001”, "110" 이 연결되어
12 end cdma; -- "100010001001110" 이 출력
[ 표 ] 연결 연산자의 종류
10.6 VHDL 연산자
부호 연산자 (sign operators) 부호 연산자는 단일 요소 연산자로서 연산자 오른쪽에만 숫자형의 피연산자를 갖음
[ 예제 ] 부호 연산자의 사용 1 architecture pone of sign is 2 begin 3 process(A,B) 4 begin 5 Y1 <= +A / (-B); -- 양수 A 를 음수 B 로 나누어 Y1 에 대입하기 6 Y2 <= (-A) + (-B); -- 음수 A 와 B 를 더하여 Y2 에 대입하기 7 Y3 <= A * (-B); -- 양수 A 에 음수 B 를 곱하여 Y3 에 대입하기 8 end process; 9 end pone;
[ 표 ] 부호 연산자의 종류
10.6 VHDL 연산자
연산자의 우선순위 (operators priority)
연산자의 중복 (operating overloading) VHDL 의 가장 유용한 기능 중의 하나로 어떤 연산자 기호가 피연산자의 자료형에 따라 다르게 동작할 때 연산자가 중복되었다고 함 . [ 예제 ] ‘0’, ‘1’ 의 중복기능 부여 type bit is ('0','1'); type multi_value_logic is ('0', '1', 'X');
[ 표 ] 연산자의 우선순위
10.6 VHDL 연산자
속성 (attribute) 자료형에 대한 동작이나 상태표현을 위한 특성으로 엔티티 , 아키텍처 , 자료형 및 신호 등에 대한 정보의 제공 [ 예제 ] 많이 사용되는 속성 1 type index is integer range 1 to 30; 2 type state is (one, two, three, four); 3 subtype short_state is states range two to four; 4 signal byte : std_logic_vector(7 downto 0); 5 signal clk : bit;
< 속성의 예 > ① ‘속성 left : index'left = 1 -- index 의 가장 왼쪽의 값 ‘1’ 을 나타냄 ② 속성‘ low : index'low = 1 -- index 의 가장 작은 값 ‘1’ 을 나타냄 ③ ‘속성 high : index'high = 30 -- index 의 가장 큰 값 ‘30’ 을 나타냄 ④ ‘속성 right : state'right = four -- state 의 가장 오른쪽의 값 ‘ four’ 를 나타냄 ‘속성 length : index'length = 10 -- index 의 길이가 ’10‘ 을 나타냄 ⑤ ‘속성 range : byte'range = (7 downto 0) -- byte 의 범위가 (7 downto 0) 를
나타냄 ⑥ ‘속성 event : clk'event -- clk 의 event 가 있을 때 ’ true' 속성의 사용 : signal att : state; att <= states'right -- att = four
(※ 인용부호 ' : tick 로 발음 )
10.6 VHDL 연산자
분해함수 (resolution function) ▪ 분해 (resolving) : 서로 다른 신호들의 값이 같은 시간에 만나서 섞이는 것 ▪ 분해함수 (resolution function) : 신호의 값을 섞을때의 규칙을 도표로 정의한 것으로 하나의 신호에 여러 개의 소스 (source) 가 주어지는 경우 하나의 값을 계산하는 함수
[ 예제 ] 분해함수의 활용 architecture comb_logic of resol is begin z <= x or y; z <= x and y; end comb_logic;
(a) 구동회로 (b) 분해함수 [ 그림 ] 충돌 구동신호
10.6 VHDL 연산자
[ 표 ] std_logic 의 분해함수에 대한 진리표
[ 표 ] 분해함수의 진리표
10.6 VHDL 연산자
10.7 패키지와 라이브러리
패키지 (package) 와 라이브러리 (library) ▪ 패키지 (package) ① 자료형 (data type) 과 부 프로그램 (sub program) 을 하나의 파일로 만든것 ② 자료형 , 부 프로그램 등을 중복으로 선언 또는 기술하지 않고 , 한번 기술한 것을 여러설계에서 공동으로 사용할 수 있도록 모아둔 꾸러미 . ▪ 라이브러리 (library) ① VHDL 을 구성하는 설계단위 즉 , 엔티티 (entity), 아키텍처 (architecture), 패키지 (package) 등을 저장하고 , 필요시에 사용할 수 있는 저장장소 (directory). ■ 미리 정의된 패키지 (defined package)
▪ IEEE standard package : 표준 형 (types), 연산자 (operators), 객체 (objects)들을 선언 . library 와 use 를 사용할 필요가 없음 . ▪ IEEE Textio package : IEEE 에서 만든 문서 파일의 입ㆍ출력용 패키지로 문서의 입출력 관련형과 객체들을 정의 .
[ 형식 ] 패키지를 부르기 위한 library 의 형식 library example use example. test. all; ① ② ③ ①library 이름 , ②패키지 이름 , ③패키지의 모든 내용
▪ IEEE std_logic_1164 package : IEEE 에서 만든 확장된 표준 로직 패키지 [ 형식 ] 패키지를 부르기 위한 library 의 형식 library IEEE; use IEEE. std_logic_1164.all;
10.7 패키지와 라이브러리
사용자 선언 패키지 (user defined package) ▪ 패키지 선언 (package declaration) 외부에서 사용할 수 있도록 인터페이스를 담당하는 역할 ꋻ 외부에서 필요한 자료형ꋻ , 부품 , 부프로그램 ( 함수 , 프로시저 ) 을 선언
▪ 패키지 몸체 (package body) 패키지 선언부분에서 선언된 부프로그램의 구체적 내용을 정의 ꋻ [ 형식 ] package 의 구조 -- package 선언부 package 패키지 _이름 is { 자료형 선언 }; { 부프로그램 선언 }; end 패키지 _이름 ; -- package 몸체부 package body 패키지 _이름 is { 부프로그램 기술 } end 패키지 _이름 ;
10.7 패키지와 라이브러리
사용자 선언 패키지 (user defined package) ▪ 패키지 선언 (package declaration) 외부에서 사용할 수 있도록 인터페이스를 담당하는 역할 ꋻ 외부에서 필요한 자료형ꋻ , 부품 , 부프로그램 ( 함수 , 프로시저 ) 을 선언
▪ 패키지 몸체 (package body) 패키지 선언부분에서 선언된 부프로그램의 구체적 내용을 정의 ꋻ [ 형식 ] package 의 구조 -- package 선언부 package 패키지 _이름 is { 자료형 선언 }; { 부프로그램 선언 }; end 패키지 _이름 ; -- package 몸체부 package body 패키지 _이름 is { 부프로그램 기술 } end 패키지 _이름 ;
10.8 IEEE 표준논리
시뮬레이션을 위한 신호 정의 ▪ ‘0’ 과 ‘ 1’ 이외의 신호 정의
ꋻ ‘ Z’ 하이임피던스 혹은 비 연결 ꋻ ‘ X’ 값을 알 수 없는 경우
ꋻ ‘ U’ 초기화 되어 있지 않을 경우 ꋻ 신호에 대한 결정 함수
ꋻ 3 상태 버퍼를 사용한 버스 구동 표현
10.8 IEEE 표준논리
기본 연산에 대한 정의 ▪ std_logic_unsinged 패키지 사용
ꋻ std_logic_vector 를 부호 없는 숫자로 간주 하여 처리 ꋻ +,-,* 와 같은 산술 연산자와 비교 연산자들을 정의한다 .
비교연산을 수행할때 오퍼랜드크기가 서로 다르면 짧은 오퍼랜드에ꋻ 왼쪽을 0을 채워 비교 한다 .
ꋻ 2진 덧셈에 대한 코드
10.9 VHDL 의 컴파일과 시뮬레이션
시뮬레이션 하는 이유 ▪ VHDL 코드가 설계자가 원하는 기능으로 구현 되었는지 판별 ▪ 디지털 시스템의 사양에 맞게 설계 되었는지 검증
VHDL 코드를 이용한 작업 과정