VHDL Syntax
VHDL 문법
※ VHDL의 Reserved Word와 Identifier는 대소문자를 구분짓지 않는다.
(즉, \(\texttt{IF, If, iF, if}\) 모두 같은 기능을 한다.)
※ VHDL의 Identifier는 아래와 같은 명명 규칙을 따라야 한다.
1) 첫 글자는 영문자, 다음 문자부터는 영문자, 숫자 언더바(_)만 사용할 수 있다.
2) 이름 중간에 공백을 사용할 수 없고, 다수의 이름을 사용하는 경우, 콤마(,)로 구분한다.
3) 이름이 한 라인을 초과할 수 없다.
Comment (주석)
\(\texttt{-- <comment>}\)
- 주석의 시작을 나타내며, 해당 Line의 끝까지 주석으로 처리한다.
Example. Comment
-- Comment
Semicolon (세미콜론)
- 문장과 문장 사이(한 문장의 끝)에는 세미콜론(;)을 사용한다.
Assignment (대입)
\(\texttt{:=}\)
- 값이 명시되는 즉시 대입된다.
Example.
I := I+1
Signal Assignment (신호 대입)
\(\texttt{<=}\)
- Signal에 대한 Assignment문(대입문)이다. (신호 대입문)
- 오른쪽 항의 Signal 값에 변화가 생기는 즉시, 왼쪽 항에 대입된다.
- 신호 대입문의 왼쪽항에는 입력 포트, 상수가 올 수 없으며,
출력 포트나, Signal 값이 올 수 있다.
- 신호 대입문의 오른쪽항에는 출력 포트가 올 수 없으며,
입력 포트나 Signal값, 상수가 올 수 있다.
* Propagation Delay
- \(\texttt{after}\)문을 통해, 왼쪽항의 값에 변화가 생긴 직후 일정 시간 동안의 Delay 이후에 값을 대입할 수도 있다.
Example.
C <= '1' after 2 ns;
Example. Two-Inputs AND Gate
use work.std_logic_1164.all;
ENTITY and2 IS
PORT( a, b : IN std_logic;
c : OUT std_logic );
END and2;
ARCHITECTURE signal_assignment OF and2 IS
BEGIN
c <= a AND b AFTER 0.8 ns;
END signal_assignment;
* Conditional Signal Assignment
- \(\texttt{WHEN}\)문을 통해, 조건에 따라 값의 대입 여부를 결정할 수 있다.
Example. 4 to 1 MUX
Inputs : \(I0, I1, I2, I4\) (4 Inputs)
Output : \(q\) (1 Output)
Selection Signal | Output | |
\(a\) | \(b\) | \(q\) |
0 | 0 | \(I0\) |
1 | 0 | \(I1\) |
0 | 1 | \(I2\) |
1 | 1 | \(I3\) |
use work.std_logic_1164.all;
ENTITY mux4 IS
PORT( I0, I1, I2, I3, a, b : IN std_logic;
q : OUT std_logic );
END mux4;
ARCHITECTURE mux4 OF mux4 IS
SIGNAL sel : INTEGER;
BEGIN
WITH sel SELECT
q <= I0 AFTER 10 ns WHEN 0,
I1 AFTER 10 ns WHEN 1,
I2 AFTER 10 ns WHEN 2,
I3 AFTER 10 ns WHEN 3,
'X' after 10 ns WHEN OTHERS;
sel <= 0 WHEN a = '0' AND b = '0' ELSE
<= 1 WHEN a = '1' AND b = '0' ELSE
<= 2 WHEN a = '0' AND b = '1' ELSE
<= 3 WHEN a = '1' AND b = '1' ELSE
4;
END mux4;
Entity (회로 개체)
ENTITY <entity_name> IS
PORT ( ... );
...
END <entity_name>;
- 회로의 IO 포트(External Connection)를 정의하는 구문이다.
(즉, 회로의 외적 연결을 선언하는 부분이며, 내부적 구조나 내부적 연결 상태 등은 고려하지 않아도 된다.)
- 회로의 내부 구조를 기술하는 구문은 \(\texttt{ARCHITECTURE}\) 구문이다.
Example. Entity
ENTITY OR2 IS
PORT (I1, I2 : IN bit;
O : OUT bit );
END OR2;
IO Port (입출력 포트)
\(\texttt{PORT(<inputs> : IN <type>;}\)
\(\qquad \texttt{<outputs> : OUT <type> );}\)
- \(\texttt{IN}\)으로 입력 포트를, \(\texttt{OUT}\)으로 출력 포트를 정의한다.
Example. IO Port
PORT (I1, I2 : IN bit;
O : OUT bit );
Interface Modes (인터페이스 모드)
\(\texttt{IN}\)
- Entity에 입력되는 값이다. (R-Value)
\(\texttt{OUT}\)
- Entity에 출력되는 값이다. (L-Value)
\(\texttt{INOUT}\)
- Entity에 입력되고, 0개 이상의 Source로 부터 업데이트되어 출력되는 값이다.
- 양방향으로 사용되는값이다.
- 입출력 제어 신호를 필요로 한다.
\(\texttt{BUFFER}\)
- Entity에 입력되고, 1개 이상의 Source로 부터 업데이트되어 출력되는 값이다.
- 양방향으로 사용되는 값이다.
- 신호 대입문에서 L-Value가 될 수도 있고, R-Value가 될 수도 있다.
Example. IO Port
PORT (I1, I2 : IN bit;
O : OUT bit;
A : INOUT bit;
B : BUFFER bit);
Port Mapping (포트 매핑)
\(\texttt{<entity_name> : <entity_type> PORT MAP(<port_list>);}\)
- \(\texttt{<entity_type>}\) 타입의 \(\texttt{<entity_name>}\) 회로의 입출력 포트를 \(\texttt{<port_list>}\)에 명시한대로 대응시킨다.
- \(\texttt{<port_list>}\)에 Parameter들을 연결하는 방법에는 Positional Association(위치 결합)과 Named Association(이름 결합)이 있다.
Example. Positional Association
HA1 : Half_Adder port map( X, Y, t_s, t_c1 );
HA2 : Half_Adder port map( t_s, Cin, S, t_c2 );
ORG : OR2 port map( t_c1, t_c2 C );
Example. Named Association
HA1 : Half_Adder port map (Carry=>t_c1, B=>Y, Sum=>t_s, A=>X);
HA1 : Half_Adder port map (B=>C, A=>t_s, Sum=>S, Carry=>t_c2);
ORG : OR2 port map (O=>C, I2=>t_c2, I1=>t_c1);
Architecture (아키텍처)
ARCHITECTURE <user-defined_body_name> OF <entity_name> IS
BEGIN
...
END <user-defined_body_name>;
- 설계하고자 하는 시스템 내부의 동작을 세부적으로 정의하는 부분이다.
- \(\texttt{ARCHITECTURE}\)문 내부에는 \(\texttt{<entity_name>}\) 회로의 기능들을 기술한 내용들이 포함된다.
- \(\texttt{ARCHITECTURE}\) 구문의 이름은 미리 정의된 \(\texttt{ENTITY}\)의 이름에 종속된다.
- 하나의 \(\texttt{ENTITY}\)는 여러 \(\texttt{ARCHITECTURE}\) 구문으로 정의될 수 있고,
다수의 \(\texttt{ARCHITECTURE}\) 구문 중 하나를 \(\texttt{CONFIGURATION}\) 구문으로 선택할 수 있다.
Example. entity and architecture Syntax
entity AND_GATE is
port ( A : in bit;
B : in bit;
C : out bit );
end AND_GATE;
architecture Dataflow of AND_GATE is
begin
C <= A and B;
end Dataflow;
Configuration (설정)
- \(\texttt{ENTITY}\)에 대한 세부구현을 선택하는 구문이다.
- 여러 \(\texttt{ARCHITECTURE}\) 구문 중 하나를 선택하게 된다.
Example. configuration
configuration rsffcon1 of rsff is
for behave
end for
end rsffcon1;
- \(\texttt{rsff {ENTITY}\)의 세부 구현을 \(\texttt{behave ARCHITECUTURE}\)로 설정한다.
Process (순차적 수행 동작)
PROCESS
BEGIN
...
wait on <signal_list>;
END PROCESS
- \(\texttt{<signal_list>}\)의 Signal들 중 하나라도 변화가 생기면, 해당 \(\texttt{PROCESS}\)문을 처음부터 다시 수행한다.
PROCESS (<sensitivity_signal_list>)
BEGIN
...
END PROCESS
- \(\texttt{<sensitivity_signal_list>}\)의 Signal들 중 하나라도 변화가 생기면, 해당 \(\texttt{PROCESS}\)문을 처음부터 다시 수행한다.
※ \(\texttt{PROCESS}\)문 내부에 기술된 문장들은 Sequential하게 동작된다.
- VHDL의 모든 문장들은 \(\texttt{PROCESS}\) 구문내에 위치하지 않으면, Concurrent하게 동작한다.
Example. Sequential Behavior
architecture sequential of rsff if
begin
process(set, reset)
begin
if set = '1' and reset = '0' then
q <= '0' after 2 ns;
qb <= '1' after 4 ns;
elsif set = '0' and reset = '1' then
q <= '1' after 4 ns;
qb <= '0' after 2 ns;
elsif set ='0' and reset = '0' then
q <= '1' after 2 ns;
qb <= '1' after 2 ns;
end if;
end process;
end sequential;
\(\texttt{for}\) Loop
FOR <loop_variable> IN <lower scope> to <upper scope> LOOP
...
END LOOP;
Example. for Loop
package array_example is
type large_bus is array (0 to 31) of bit;
type small_bus is array (0 to 7) of bit;
end array_example;
use work.array_example.all;
entity extract is
port (data_in : in large_bus;
data_out : out small_bus;
start : in integer );
end extract;
architecture test of extract is
begin
process (data_in, start)
begin
for i in 0 to 7 loop
data_out(i) <= data_in (i + start);
end loop;
end process;
end test;