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;
'[verilog | VHDL]' 카테고리의 다른 글
[VHDL] MUX, DEMUX, 4비트 비교기 설계 (0) | 2022.04.19 |
---|---|
[VHDL] 4비트 병렬 가감산기(4-bit Full adder / subtractor) (0) | 2022.04.19 |
[VHDL] 1비트 가감산기 설계(half / full, adder / subtractor) (0) | 2022.04.19 |
[VHDL] 병렬문(Concurrent Statement) (0) | 2022.04.19 |
[VHDL] 순차문 (0) | 2022.04.17 |