VHDL 구문

1)주석문
 '--'로 시작.
 ‘--’ 부터 문장 끝(‘Enter')까지 주석으로 처리

 

2)식별자(Identifier)
VHDL에서 사용되는 variable, signal, label 명으로 대/소문자 구분이 없으며 문자로 시작해야 한다.
중간에 특수문자를 사용할 수 없다.

 

3) entity 선언 : 모듈의 입출력을 지정
entity <entity_name> is
generic (
   <generic_name> : <type> := <value>;
   <other generics>...   
);
port (
   <port_name> : <mode> <type>;
   <other ports>...
);
end <entity_name>;

 

4) port문

회로에서 사용될 port 및 port종류에 대해 기술한다.
I/O port 종류 : IN, OUT, INOUT, BUFFER
· IN : 신호의 입력
· OUT : 신호의 출력
· INOUT : 신호의 입력 및 출력(출력되는 신호를 회로 내에서 사용 불가능)
· BUFFER : 신호의 입력 및 출력(출력되는 신호를 회로 내에서 사용가능)
· LINKAGE : 동작에 영향을 주지 않고 port로서 연결된 경우

 

5) Architecture 선언 : 선언된 엔티티의 동작에 관련된 정의
 
architecture <arch_name> of <entity_name> is
   -- declarative_items (signal declarations, component declarations, etc.)
begin
   -- architecture body
end <arch_name>;


6) Process문 : 감지리스트에 있는 신호가 바뀌면 순차적으로 실행

process (<all_input_signals_seperated_by_commas>)
begin
   <statements>;
end process;


Wait문 : Wait문은 세가지 다른 형태로 사용가능

Wait on <감지리스트> : 신호가 바뀔 때까지 기다린다.
Wait for <시간> : 얼마의 시간동안 기다린다.
Wait until <부울대수 표현> : 표현식의 신호중 하나가 바뀔 때 계산되어 그 표현식이 '참'일 때 실행

7) 변수, 신호, 상수의 선언

constant <name>: <type> := <value>;
signal <name>: <type> := <value>; 
signal <name>: std_logic_vector(15 downto 0):= x"0000";
variable <name>: <type> := <value>;

variable <name>: std_logic_vector(15 downto 0):= x"0000";
변수는 Process안에서 선언되고 초기화되어야 하는 반면 신호는 Process밖에서 선언되고 초기화되어야 함.

사용가능한 Type

bit                '0' 또는 '1'
Boolean        True or false
interger         -(2^31-1)~2^31-1 범위의 정수
Real             -1.0E38~ +1.0E38 범위의 부동 소수점 숫자
Chearacter    대소문자, 아라비아숫자 특수문자를 포함하는 모든 합법적인 문자
time              fs, ps, ns, ms, sec, min 혹은 hr을 단위로 하는 정수

간단한 D-F/F 예제

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity d_ff is
   port ( clk, rst : in  std_logic;
          D        : in  std_logic;
          Q        : out std_logic);
end d_ff;

 

architecture top of d_ff is
begin

   process(clk, rst)
   begin
      if rst = '0' then
         Q <= '0';
      elsif clk = '1' and clk'event then
         Q <= D;
      end if;
   end process;

end top;