[verilog | VHDL]

[VHDL] 기본 문법

시그널보내 2022. 4. 17. 15:31

1. 기본 구성

// AND_VHDL code

// package 부분
library ieee;
use ieee.std_logic_1164.all;

// entity 부분
entity AND_VHDL is
	port(A, B : in std_logic;
			c : out std_logic);
end AND_VHDL;

// architecture 부분
architecture Behavioral of and_VHDL is
begin
	process(A, B)
	begin
		if(A='1' and B ='1')then C<='1';
		else C<='0';
		end if;
	end process;
end Behavioral;

1) Package : 설계에 사용될 라이브러리 선언 ex) library ieee, use ieee.std_logic_1164.all

2) Entity : 회로의 입출력 단자를 명시, 반드시 entity 이름이 file이름과 같아야 함, generic절과 port절로 구성

 • generic절
  - 반드시 필요한 것은 아니며, 사용될 경우 선언된 식별어는 설계 엔티티 내부에서 상수처럽 사용됨. 따라서 별도로 정의하지 않더라도 자동적으로 constant클래스로 정의됨.
  - 정의한 모든 신호들은 입력모드로 동작하며, 자동으로 in모드로 정의됨

 • port절
  - 외부 인터페이스에 사용되는 입력, 출력 신호들을 정의하는데 사용
  - 선언된 식별어는 설계 엔티티 내부에서 신호(signal)로 사용되며 별도 정의 없어도 signal 클래스로 정의됨

 

3) Architecture : 회로의 동작(내부연산)을 기술한다.

 - 구조적, 동작적, 자료흐름적(dataflow) 총 3가지 표현 방법이 있음

 - 모든 문장들은 병렬문(concurrent statement)로 서술되어야 함

 - 임의의 개수의 병렬문이 올 수 있고, 각 병렬문은 서로 독립적으로 동작한다.

   (병렬문에 관해서는 추후에 자세히 다루도록 하자)

• 자료흐름적 모델링(Dataflow Modeling)
 - 프로세스문에서는 사용하지 않는다.
 - 일반적으로 boolean식이나 논리식(and, or 등)으로 하드웨어 동작표현
 - 논리식이 복잡해지면 정확한 표현을 찾기 어렵기 때문에 간단한 로직의 표현에 많이 사용한다.
 - 주로 동시신호할당문으로 기술한다.(when ~ else구문, with ~ select ~ when 구문)

• 동작적 모델링(Behavioral Modeling)
 - 시스템 내부적으로 어떤 하드웨어 구조를 가지는지 상관 없음
 - 입력상태에 대한 출력결과만을 고려한 기술방법, 오로지 진리표로 표현된 것을 수학적인 알고리즘을 사용하여 동작 기술
 - 차례대로 수행되는 순차문
 - 입력 변수가 많아지면 진리표 경우의 수 증가 -> 코드의 길이 증가
 - 주로 process문(병렬문) 내에서 wait, signal 할당문, if문, case ~ when문, loop문 등에 사용

구조적 모델링(Structural Modeling)
 - 다수의 하위 모듈의 연결로 구성
 - 가장 하드웨어적 표현에 가까움
 - 주로 게층적 설계에 사용(하위단계에서 설게한 설계 entity가 상위 단계에서 하나의 component로 사용 -> 대형 설계를 쉽게 할 수 있다)
 - 컴포넌트의 연결관게는 port map이라는 예약어를 이용하여 이루어짐
architecture behav of half_add is

component and_2 port(a,b : in std_logic, c : out std_logic);		//component불러옴
end component

component xor_2 port(a,b : in std_logic, c : out std_logic);		//component불러옴
end component

begin
	u1 : xor_2 port map (a => x, b => y, c => s0);
    u2 : and_2 port map (x, y, co);
end behav;

2. object(객체)

 - VHDL에서 값을 가질수 있는 객체는 총 3개로 신호(signal), 변수(variable), 상수(constant)가 있다.

1) 신호(signal)

 • 아키텍처내부의 begin전에 선언, 선언된 아키텍처 안에서만 전역적으로 사용

 • vhdl합성 시 선(wire)으로 구현

 • 신호의 값을 할당하기 위해서 <= 연산자를 사용한다.

 • signal은 process문 내에서 delta cycle이나 사용자 지정 시간 이후에 update된다.

architecture dataflow of div_logic is
	signal aorb : std_logic;	//aorb라는 이름을 갖는 signal선언
    signal ONE_state : std_logic := '1';		//ONE_stage라는 이름을 갖는 signal선언 후 1 대입
begin
	aorb <= A or B;		//arob신호에 A와 B의 or한 연산 대입
    Y <= aorb and C and ONE_state;
end dataflow;

 

2) 변수(variable)

 • process나 sub program(별도 모듈)안에서만 지역적으로 사용

 • signal과 달리 합성시에 구현이 안된다

 • 중간단계에서 주로 사용

 • 값을 할당하기 위해 := 연산자를 사용한다.

 • 변수에 대한 할당 연산은 즉시 실행되어 변수에 바로 값이 대입된다. 

 

3) 상수(constant)

 • architecture와 begin사이 혹인 패키지에서 선언한다.


3. 부프로그램(Subprogram)

 - 별도의 모듈로 사용한다.

 - 함수(function)과 프로시저(procedure) 두가지 종류로 구분

   cf) procedure는 리턴값을 가지지 않고 형식 매개변수의 out모드를 이용하여 값을 출력한다.

 - 부프로그램 선언과 본체로 나누어서 구성된다.

 - 부프로그램 본체에서 signal선언 불가

 - begin 다음에 오는 문장은 순차문

 - function은 wait문 사용 불가 -> 호출이 수식이고 리턴값이 1개

 - procedure는 wait문 허용 -> 호출이 문장이고 리턴값이 여러개

 

[function]

library ieee;
use ieee.std_logic_1164.all;

entity mux_function is
	port( I : in std_logic_vector(3 downto 0);
			S : in std_logic_vector(1 downto 0);
			Y : out std_logic);
end mux_function;

architecture behavioral of mux_function is
	
	function mux_func( input : in std_logic_vector(3 downto 0);
								sel : in std_logic_vector(1 downto 0))
								return std_logic is
								variable tmp : std_logic;
		begin
		case sel is
			when "11" => tmp := input(3);
			when "10" => tmp := input(2);
			when "01" => tmp := input(1);
			when others => tmp := input(0);
		end case;
		
		return tmp;
	end function;
	
begin
	process(I, S)
	begin
	Y <= mux_func(I, S);
	end process;
end behavioral;

[procedure]

library ieee;
use ieee.std_logic_1164.all;

entity mux_procedure is
	port( I : in std_logic_vector(3 downto 0);
			S : in std_logic_vector(1 downto 0);
			Y : out std_logic);
end mux_procedure;

architecture proc of mux_procedure is
	
	procedure mux_proc( signal input : in std_logic_vector(3 downto 0);
								signal sel : in std_logic_vector(1 downto 0 );
								signal o : out std_logic) is
		begin
		case sel is
			when "11" => o <= input(3);
			when "10" => o <= input(2);
			when "01" => o <= input(1);
			when others => o <= input(0);
		end case;
	end mux_proc;
	
begin
	process(I, S)
	begin
	mux_proc(I, S, Y);
	end process;
end proc;