회로도의 동작이나 구조 서술을 위한 프로세스나 블록간 연결상태를 서술하는 용도로 사용한다.
보통 아키텍처 본체 내부의 문장 부분을 구성하게 되며 프로세스문 내부는 순차문, 프로세스문 자체는 병렬문이다.
병렬분의 종류는 프로세스문, 블록문, 병렬주장문, 병렬신호배정문 등이 있다.
1. 프로세스문(Process statement)
- 기본적으로 동시처리인 VHDL에서 순차적 처리를 가능하게 해주는 문법이다.
- 감지리스트(sensitivity list)에 들어가는 신호는 process내에서 선언 불가능하다.
- 모듈 내부는 순차적으로 이루어지므로 순차문을 사용한다.(if, case)
- 프로세스문 자체는 병렬문이며 여러개의 프로세스문이 있으면 서로 병행적으로 수행한다.
- 프로세스문은 일종의 무한루프처럼 동작한다.
- 감지리스트나 wait문을 이용하여 내부의 순차문을 처리한다.
- 보통 모든 input signal들을 감지리스트에 포함한다.
- 신호감지절의 signal중 적어도 하나의 값이 변해야 process문이 동작한다.
- output signal이 신호감지절에 포함되는 경우 무한루프 발생 가능성이 있다.
// process문 사용 예
process(A, B) //감지리스트(A, B)
begin
if A>B then
Y <= '0';
else
Y <= '1';
end if;
end process;
//wait if로 process문 사용예 (그러나 위의 방법이 직관적이기 때문에 위의 방식으로 권장)
process
begin
if A>B then
Y <= '0';
else
Y <= '1';
end if;
wait on A,B;
end process
//무한루프 발생 가능성(output signal이 신호감지절에 포함)
begin
process(a)
a <= not a;
end process
1) 델타(∆)지연 : 감지리스트 신호의 변화가 발생하면 델타지연으로 모델링된다.
- 순차문들이 순차적으로 진행된다.
- 실제적인 시간 지연은 없다.
신호배정문 : 델타지연 발생
변수배정문 : 델타지연 발생 X
①신호배정문의 델타지연의 예
delta_cycle : process(b,c)
begin
c <= b;
d <= c;
end process;
- 20ns지점에 b신호가 0에서 1로 변했다고 가정하자.
- 델타지연이라는 논리적인 시간이 지난 후 c의 값이 변하며 또 일정 델타지연이 발생한 후 d가 바뀌게 된다.
- 총 2번의 델타지연 발생
- 물리적인 시간은 모두 20ns에 동시적으로 합성되지만 논리적인 시간은 델타지연이 발생한다.
시간 | b | c | d |
20ns | 1 | 0 | 0 |
20ns + ∆ | 1 | 1 | 0 |
20ns + 2∆ | 1 | 1 | 1 |
② 신호, 변수배정의 델타지연 예
delta_cycle : process(a, b, c)
variable x, y : std_logic;
begin
x := a;
y := x;
b <= y;
c <= b;
d <= c;
end process;
- 60ns 지점에 a신호가 0에서 1로 변했다고 가정
- x, y는 변수이기 때문에 동시에 60ns지점에 둘다 1이 저장된다.(델타지연 X)
- 일정 델타시간이 지날때 마다 b, c, d의 값이 변한다.
- 총 3번의 델타지연에 걸쳐 b, c, d값 변화
- 물리적인 시간은 모두 60ns에 동시에 합성
시간 | a | B | c | d |
60ns | 1 | 0 | 0 | 0 |
60ns + ∆ | 1 | 1 | 0 | 0 |
60ns + 2∆ | 1 | 1 | 1 | 0 |
60ns + 3∆ | 1 | 1 | 1 | 1 |
2) Signal Driver
- process안에 있는 신호배정문은 signal에 대해 driver를 생성한다
- signal driver는 해당 signal의 현재값과 미래값을 sequence(배열)형태로 가진다.
- process문이 끝나야지만 update된 신호값을 가진다.
// ex
signal A, Z : integer
process(A) // A가 T라는 시간에 변동이 있다고 가정하면
variable V1, V2 : integer
begin
V1 := A - V2; // V1은 변수이므로 델타지연없이 T시점에 새로운 값을 가진다.
Z <= -V1; // Z는 신호이기 때문에 현재값, 미래값을 동시에 가짐
V2 := Z + V1 * 2; // process문이 끝나지 않았기 때문에 Z는 이전값으로 계산한다.
end process;
2. 병렬 조건 신호 배정문(when ~ else)
- 순차문에서의 if문과 비슷한 역할이며 if는 process내부에서 사용하며 when else는 process외부에 사용된다.
- 동작 원리는 if문과 동일하게 조건 우선순위를 배정하여 결과를 선택한다.
- 여러 조건을 검사하여 참이면 해당 파형을 할당
- 조건을 예측할 수 없는 경우에 사용
- 나머지 경우를 처리할 때 others를 사용하지 않음
z_out <= input_a when (selece = "00") else
input_b when (selece = "01") else
input_c when (selece = "10") else
input_d when (selece = "11");
3. 병렬 선택 신호 배정문(with ~ select ~ when)
- 순차문 내부의 case문과 동일한 역할 수행하며 with select는 process문 외부에 사용한다.
- 수식 또는 변수의 값과 선택의 값이 일치하는 경우에 해당하는 파형을 지정한다.
library ieee;
use ieee.std_logic_1164.all;
entity mux_4x1 is
port( I : in std_logic_vector(3 downto 0);
S : in std_logic_vector(1 downto 0);
Y : out std_logic);
end mux_4x1;
architecture dataflow of mux_4x1 is
begin
with S select
Y <= I(3) when "11",
I(2) when "10",
I(1) when "10",
I(0) when others;
end dataflow;
4. 컴포넌트 실체화문(port map)
- 설계 엔티티 내부 사용되는 컴포넌트들의 입출력 신호들과 다른 내부 신호와의 연결관계를 정의하는데 사용한다.
- process내부에 사용 불가
- 컴포넌트 실체화문을 사용하기 위해서는 컴포넌트들이 사전에 설계되어 있어야 한다.
- 출력에 연결되는 매개변수가 없을 경우, open이라는 예약어를 사용한다.(반드시 출력포트에만 사용, 입력포트에는 사용 불가)
U0 : cpu_model //U0, U1, ... 레이블 : 동일한 컴포넌트들이 여러개가 사용될때, 이를 구분하기 위한 용도
port map(
reset_n => reset_n,
cpu_adder => host_adder(10 downto 1),
cpu_data => host_data(15 downto 0),
nirq => nIRQ);
// open 예약어
U0 : half_adder
port map(a => A, b => B, s => open, c => open);
5. 생성문(for ~ generate)
- 회로를 서술함에 있어서 반복구조를 가질 경우
begin
U0 : FullAdder port map(X => DA(0), Y => DB(0), Cin => ci, Cout => t(1), Sout => S(0));
U1 : FullAdder port map(X => DA(1), Y => DB(1), Cin => t(1), Cout => t(2), Sout => S(1));
U2 : FullAdder port map(X => DA(2), Y => DB(2), Cin => t(2), Cout => t(3), Sout => S(2));
U3 : FullAdder port map(X => DA(3), Y => DB(3), Cin => t(3), Cout => Co, Sout => S(3));
end struct_top
// 위에서 반복되는 문장을 생성문(for generate)을 이용하여 아래와 같이 기술 가능
begin
gen0 : for i in 0 to 3 generate
U0 : FullAdder port map(X => DA(i), Y => DB(i), Cin => t(i), Cout => t(i+1), Sout => S(i));
end generate;
t(0) <= Ci; //초기값 강제대입
Co <= t(4); //결과값 강제대입
ent struct_top;
'[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] 순차문 (0) | 2022.04.17 |
[VHDL] 기본 문법 (0) | 2022.04.17 |