반응형

절차적 블록 내에서 사용할 수 있는 두 가지 종류의 신호 할당, 블로킹(blocking) 및 논블로킹(non-blocking)이 있습니다.

 

블로킹 할당

블로킹 할당은 = 기호로 표시되며 각 명령문의 평가 및 할당은 즉시 수행됩니다. 블록 내의 각 할당은 병렬로 실행됩니다.

 

이 동작이 시스템에 대한 모든 입력을 포함하는 감지 목록과 결합될 때 이 접근 방식은 합성 가능한 조합 논리 회로를 모델링할 수 있습니다.

 

이 접근 방식은 절차 블록 외부의 연속 할당과 동일한 기능을 제공합니다. 설계자가 연속 할당 대신 블로킹 할당을 사용하는 이유는 Verilog 절차 블록 내에서 고급 프로그래밍 구성이 지원되기 때문입니다.

 

다음은 조합 논리 회로를 모델링하기 위해 절차 블록 내에서 블로킹 할당을 사용하는 방법을 보여줍니다.

 

 

논블로킹 할당

논블로킹 할당은 <= 기호로 표시됩니다. 논블로킹 할당을 사용할 때 대상 신호에 대한 할당은 절차 블록이 끝날 때까지 연기됩니다. 이렇게 하면 목록을 통해 중간 할당을 계단식으로 연결하지 않고도 할당이 블록에 나열된 순서대로 실행될 수 있습니다. 이 동작이 클록 신호의 차단을 트리거하는 것과 결합될 때 이 접근 방식은 합성 가능한 순차 논리 회로를 모델링할 수 있습니다.

 

다음은 논블로킹 할당을 사용하여 순차 논리 회로를 모델링하는 예를 보여줍니다.

 

 

블로킹 할당과 논블로킹 할당의 차이는 미묘하며 종종 Verilog를 처음 배울 때 파악하기 가장 어려운 개념 중 하나입니다. 혼란의 원인 중 하나는 단일 할당 또는 신호 상호 의존성이 없는 할당 목록을 포함할 때 블로킹 및 논블로킹 할당이 동일한 결과를 생성할 수 있다는 사실에서 비롯됩니다.

 

신호 상호 의존성은 할당의 대상(, 할당의 LHS에서)인 신호가 후속 명령문에서 인수(, 할당의 RHS에서)로 사용되는 경우를 나타냅니다.

 

다음은 블로킹 또는 논블로킹 할당이 사용되는지 여부에 관계없이 동일한 결과를 생성하는 두 가지 모델을 보여줍니다.

 

 

절차 블록 내의 명령문 목록에 신호 상호 의존성이 있는 경우 블로킹 및 논블로킹 할당은 다른 동작을 갖습니다.

 

다음은 신호 상호 의존성이 블로킹 할당과 논블로킹 할당 간에 어떻게 다른 동작을 유발하는지 보여줍니다. 이 예에서 모든 입력은 조합 논리를 모델링할 목적으로 신호감지 목록에 나열됩니다.

 

블로킹 대 논블로킹 할당을 사용할 때 다른 동작

이 예에는 신호의 상호 의존성이 있으며 모든 입력이 감지 목록에 나열됩니다. 신호감지 목록의 모든 입력을 나열함으로써 입력이 변경될 때마다 출력이 업데이트되도록 조합 논리를 모델링하는 것이 목적입니다.

 

 

두 경우 모두 명령문 1(n1에 대한 할당)은 동일한 결과를 생성합니다. 이는 할당이 입력 A B에만 의존하기 때문입니다. A B가 감지 목록에 나열되기 때문에 이들에 대한 변경은 블록을 트리거하고 현재 값은 n1에 대한 할당에 사용됩니다.

그러나 명령문 2(S에 대한 할당)는 신호의 상호 의존성을 포함하며 두 경우 모두 동일한 결과를 생성하지 않습니다.

블로킹 할당 사례(=): 블로킹 할당이 즉시 발생합니다. 이것은 명령문 1에서 n1에 대한 할당이 즉시 발생하고 명령문 2에서 n1의 업데이트된 값이 사용됨을 의미합니다. 민감도 목록의 모든 입력을 나열하는 것과 함께 사용되는 경우 이 접근 방식은 조합 논리를 성공적으로 모델링합니다.

 

논블로킹 할당 사례(<=): 논블로킹 할당은 절차 블록의 끝에서 발생합니다. 이것은 명령문 1 n1에 대한 할당이 명령문 2의 할당보다 먼저 발생하지 않음을 의미합니다. 명령문 2에서 사용된 n1의 값은 블록이 트리거될 때 n1의 값이 될 것이며 블록 내에 할당된 n1의 새로운 값이 아닙니다.  다시 말해서, 문장 2에서 사용된 n1의 값은 블록이 트리거된 "이전" 시간의 n1 또는 n1 "마지막" 값이 됩니다. 이것은 조합 논리를 모델링하지 않습니다.

 

 

다음은 신호의 상호 의존성이 블록 할당과 논블록 할당 간에 다른 동작을 일으키는 또 다른 경우를 보여줍니다. 이 예에서 절차 블록은 순차 논리의 두 단계를 모델링할 목적으로 클록 신호의 상승 에지에 의해 트리거됩니다.

 

 

 

이러한 절차적 할당의 동작은 혼란스러울 수 있지만 정확하고 합성 가능한 모델을 간단하게 만들 수 있는 두 가지 설계 지침이 있습니다.

1. 조합 논리를 모델링할 때 블로킹 할당을 사용하고 신호감지 목록에 모든 입력을 나열합니다.

2. 순차 논리를 모델링할 때 논블로킹 할당을 사용하고 신호감지 목록에 클록 및 리셋 라인(해당되는 경우)만 나열합니다.

 

명령문 그룹

명령문 그룹은 블록의 명령문이 처리되는 방식을 나타냅니다. Verilogbegin/end fork/join이라는 두 가지 유형의 명령문 그룹을 지원합니다.

begin/end를 사용할 때 그룹 내에 포함된 모든 명령문은 나열된 순서대로 평가됩니다.

fork/join을 사용할 때 그룹 내에 포함된 모든 명령문은 병렬로 평가됩니다.

procedural block 내에 하나의 statement만 있는 경우 statement group은 필요하지 않습니다.

절차 블록의 여러 명령문에는 명령문 그룹이 필요합니다. 명령문 그룹은 ":"가 앞에 오는 첫 번째 키워드 뒤에 추가되는 선택적 이름을 포함할 수 있습니다.

 

 

로컬변수

지역 변수는 절차 블록 내에서 선언할 수 있습니다. 명령문 그룹의 이름을 지정해야 하며 변수는 블록 외부에서 볼 수 없습니다. 변수는 변수 유형만 가능합니다.

 

initial
begin: stim_block  // it is required to name the block when declaring local variables
  integer i;       // local variables can only be of variable type
  I = 2;
end

반응형
반응형

VHDL의 조합 논리 회로 설계 및 동시 코딩

조합 논리 회로는 논리 연산자와 VHDL 문을 사용하여 구현할 수 있습니다. 논리 회로 구현에서 조건식을 사용할 수 있는 경우 VHDL when select가 구현에 사용됩니다. 조합 회로는 동시 코드를 통해 구현됩니다.

 

"when" "select"

VHDL when select는 동시 VHDL 코드에서 사용할 수 있습니다. 이러한 명령문은 순차, , 클록된 프로그램 단위에서 사용되지 않습니다.

 

조합 회로의 구현을 선택할 때 VHDL 문을 사용할 수 있습니다. 이러한 명령문은 논리 회로의 조건부 구현에 사용됩니다. when 문의 구문은 다음과 같습니다.

 

<signal object> <= <statement> when <condition> else

                         <statement> when <condition> else

                                           

                         <statement> when <condition> else

                         <statement>;

 

when select 문은 서로 유사합니다. 구현 구문만 다릅니다. select 문의 구문은 다음과 같습니다.

 

with <condition> select

<signal object> <= <statement> when <condition>,

                         <statement> when <condition>,

                                            

                         <statement> when others;

 

다음 예제는 논리 연산자를 사용하여 부울 함수 f(x, y, z) = x'y' + y'z를 구현합니다.

부울 함수 f(x, y, z) = x'y' + y'z는 다음을 사용하여 구현할 수 있습니다.

f <= (not(x) not(y)) 또는 (not(y) z)와 같은 논리 연산자

부울 함수 f(x, y, z) = x'y' + y'z를 구현하는 VHDL 프로그램은 다음과 같습니다.

 

entity f_function is
port
(

x, y, z: in bit;

f: out bit );
end entity;
architecture
logic_flow of f_function is
begin
  f<=(not(x) and not(y)) or (not(y) and z);
end architecture;

 

다음은 부울함수의 진리표를 보여주고 있습니다.

x y z f (x, y, z)
0 0 0 1
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 0

 

 

whenwith문을 사용하여 부울함수를 VHDL로 프로그램하면 다음과 같습니다.

 

f <= ‘1’ when(x = ‘0’ and y = ‘0’ and z = ‘0’) else

     ‘1’ when(x = ‘0’ and y = ‘0’ and z = ‘1’) else

‘1’ when(x = ‘1’ and y = ‘0’ and z = ‘1’) else

     ‘0’

 

with(x&y&z) select

f <= ‘1’ when “000”,

     ‘1’ when “001”,

     ‘1’ when “101”,

     ‘0’ when others;

 

아래 함수를 VHDL로 프로그램하면 다음과 같습니다.

entity fx_function is
port
( x: in integer;
     y: out integer range 0 to 4);
end entity;
architecture logic_flow of fx_function is
begin
with
x select
  y <= 2 when 1 | 2,
       4 when 3 to 6,
       0 when others;
end architecture;

 

Generate

VHDLgenerate는 동시 문입니다. 프로그램 세그먼트의 여러 인스턴스를 생성하는 데 사용됩니다. 생성 문에는 무조건 generate과 조건 generate라는 두 가지 다른 형식이 있습니다. 이 양식을 별도로 살펴보겠습니다.

 

무조건 generate

이름에서 알 수 있듯이 무조건 생성에는 조건부 부분이 없습니다. 구문은 다음과 같습니다.

 

Label : for parameter in number  -- range generate

[declarative part

begin]
Statements

end generate[Label] ;

 

Label의 사용은 generate 문에서 필수이며, 단어 begin generate 문에서 선언적 부분을 사용할 수 있는 경우에 사용됩니다.

 

다음은 generate문의 예제입니다.

Label 1 : for indx in 0 to 3 generate

             y(indx) <= x(indx) xor x(indx + 1)

       end generate;

 

위의 generate문을 다음과 같습니다.

y(0) <= x(0) xor x(1);

y(1) <= x(1) xor x(2);

y(2) <= x(2) xor x(3);

y(3) <= x(3) xor x(4);

 

다음 VHDL 문을 사용하여 벡터 x의 내용을 뒤집을 수 있습니다. 여기서 x, y8비트 벡터입니다.

 

entity reverse_vector is
port
( x_vec: in bit_vector(7 downto 0);
     y_rvec: out bit_vector(7 downto 0));
end entity;
architecture logic_flow of reverse_vector is
begin
reverse: for indx in 0 to 7 generate
          y_rvec(indx)<=x_vec(7-indx);
end generate;
end architecture;

 

조건 generate

조건 generate의 구문은 다음과 같습니다.

Label : if condition generate

           [declarative_part

       begin]

           Statement

       end generate[Label];

 

상수 양의 정수를 확인하고 짝수인지 홀수인지 감지하는 VHDL 문을 조건 generate로 작성하면 다음과 같습니다.

 

entity even_odd_detector is
port(
EvenFlag: out bit);
end entity;
architecture logic_flow of even_odd_detector is
constant
number: positive:=10001;   -- 31-bit positive integer
begin
  EvenDetector: if ((number mod 2)=0) generate
    EvenFlag<=1;
  end generate;

OddDetector: if ((number mod 2)=1) generate
EvenFlag<=0;

end generate;

end architecture;

 

반응형
반응형

순차 기능 모델링

동시 시스템의 동작은 현재 값에만 의존하는 출력을 가지기 때문에 조합 논리에 적합했습니다. 이는 신호 할당을 지속적으로 수행하는 모델이 이 회로 동작의 정확한 모델을 제공한다는 것을 의미합니다.

 

순차 회로(: D-플립플롭, 레지스터, 유한 상태 기계 및 카운터)를 살펴보기 시작하면 이러한 장치는 이벤트, 가장 자주는 클록 신호의 에지를 기반으로 출력만 업데이트합니다.

 

절차적 할당

Verilog는 이벤트를 기반으로 하는 신호 할당을 모델링하기 위해 절차적 할당을 사용합니다. 이벤트는 가장 일반적으로 신호의 전환입니다. 이는 클록 에지에서 할당을 트리거하여 D 플립플롭 및 유한 상태 머신과 같은 순차 논리 회로를 모델링하는 기능을 제공합니다. 절차적 할당은 가변 데이터 유형(: reg, 정수, 실수 및 시간)만 구동할 수 있습니다. 따라서 저장 장치를 모델링하는 데 이상적입니다. 절차적 신호 할당은 나열된 순서대로 평가할 수 있습니다. 따라서 순차적 할당을 모델링할 수 있습니다.

 

절차 할당은 모델에 대한 입력이 변경될 때 신호 할당을 수행하여 조합 논리 회로를 모델링하는 데 사용할 수도 있습니다. 할당의 왼쪽이 절차 할당에서 와이어 유형이 될 수 없음에도 불구하고 최신 합성기는 적절하게 설계된 조합 논리 모델을 인식하고 올바른 회로 구현을 생성합니다. 절차 할당은 또한 if-else 결정, 케이스 문 및 루프와 같은 표준 프로그래밍 구성을 지원합니다. 이것은 Verilog에서 절차적 할당을 강력한 모델링 접근 방식으로 만들고 디지털 시스템을 설계하고 테스트 벤치를 생성하기 위한 가장 일반적인 기술입니다.

 

절차 블록

모든 절차적 신호 할당은 절차적 블록 내에 포함되어야 합니다. Verilog에는 initial always의 두 가지 유형의 절차 블록이 있습니다.

 

1.    initial 블록

initial 블록은 시뮬레이션 시작 시 블록 안에 포함된 모든 명령문을 한 번 실행합니다. initial 블록은 합성 가능한 동작을 모델링하는 데 사용되지 않습니다. 대신 테스트 벤치 내에서 반복적인 신호의 초기 값을 설정하거나 단일 전환 세트만 있는 신호의 동작을 모델링하는 데 사용됩니다.

 

다음은 initial 블록의 구문입니다.

 

initial

begin

signal_assignment_1
signal_assignment_2
        :

end

 

테스트 벤치에서 리셋 라인을 모델링하기 위해 initial 블록이 어떻게 사용되는지에 대한 간단한 모델을 살펴보겠습니다.

 

다음 예에서 신호 "Reset_TB" DUT로 구동됩니다. 시뮬레이션 시작 시 Reset_TB의 초기 값은 논리 0으로 설정됩니다. 두 번째 할당은 15ns 단위 지연 후에 이루어집니다. 두 번째 할당 문은 Reset_TB를 논리 1로 설정합니다. 이 예의 할당은 지연 연산자로 인해 나열된 순서대로 순서대로 평가됩니다. initial 블록은 한 번만 실행되기 때문에 Reset_TB는 나머지 시뮬레이션 동안 마지막 할당 값을 유지합니다.

 

initial
begin
  Reset_TB =
1’b0;
  #15 Reset_TB =
1’b1;
end

 

2.    always 블록

always 블록은 영원히 또는 시뮬레이션 기간 동안 실행됩니다. always 블록을 사용하여 테스트 벤치에서 합성할 수 없는 동작 외에 합성 가능한 회로를 모델링할 수 있습니다.

 

다음은 always 블록의 구문입니다.

always
begin
  signal_assignment_1
  signal_assignment_2
            :
end

 

always 블록을 사용하여 테스트 벤치에서 클록 라인을 모델링하는 방법에 대한 간단한 모델을 살펴보겠습니다.

 

다음 예에서 신호 Clock_TB의 값은 10ns 단위마다 논리 값을 지속적으로 변경합니다.

 

always
begin
  #10 Clock_TB =
~Clock_TB;
end

 

자체적으로는 위의 always 블록이 작동하지 않을 것입니다. 시뮬레이션이 시작될 때 Clock_TB에 초기 값이 없으므로 시뮬레이터는 Clock_TB의 값이 시간 0에 있는지 알지 못하기 때문입니다. 또한 시간 단위 10에서 부정 연산(~)의 출력이 무엇인지 알 수 없습니다.

 

다음 예는 initial 블록과 always 블록을 조합하여 클록 신호를 모델링하는 올바른 방법을 보여줍니다. Verilog는 여러 절차 블록에서 동일한 변수에 대한 할당을 허용하므로 다음 예가 유효합니다. 시뮬레이션이 시작되면 Clock_TB에 논리 0이 할당됩니다. 이것은 시간 0에서 신호에 대해 알려진 값을 제공하고 initial 블록 부정이 결정적 값을 가질 수 있도록 합니다.

아래 예는 10ns 단위마다 토글하는 클록 신호를 생성합니다.

 

initial
begin
  Clock_TB
= 1’b0;
end


always
begin
  #10 Clock_TB =
~Clock_TB;
end

 

3.    감지신호 목록

감지신호 목록은 블록 내의 할당이 실행될 때 트리거하기 위해 절차 블록과 함께 사용됩니다. @ 기호는 감지신호 목록을 나타내는 데 사용됩니다. 그런 다음 절차 블록을 트리거할 @ 기호 뒤의 괄호 안에 신호를 나열할 수 있습니다. 다음은 감지심호 목록의 기본 구문입니다.

 

always @ (signal1, signal2)
begin
  signal_assignment_1
  signal_assignment_2
          :
end

 

이 구문에서 괄호 안에 나열된 신호에 대한 전환은 always 블록이 트리거되고 모든 할당이 한 번 발생하도록 합니다. always 블록이 종료되면 다시 트리거할 감지 목록의 다음 신호 전환을 기다립니다.

 

다음 예는 간단한 3입력 AND 게이트를 모델링하는 방법을 보여줍니다. 이 예에서 입력 A, B 또는 C에 대한 전환은 블록이 트리거되고 F에 대한 할당이 발생하도록 합니다.

 

always @ (A, B, C)
begin
  F =
A & B & C;
end

 

Verilog는 또한 상승 에지 또는 하강 에지 전환으로만 블록 트리거를 제한하는 키워드를 지원합니다. 키워드는 posedgenegedge입니다.

 

다음은 에지 감지 블록의 기본 구문입니다. 이 구문에서 신호1의 상승 에지 전환 또는 신호2의 하강 에지 전환만 블록을 트리거합니다.

 

always @ (posedge signal1, negedge signal2)
begin
  signal_assignment_1
  signal_assignment_2
           :
end

 

감지신호 목록에는 동작을 보다 명시적으로 설명하기 위해 부울 연산자가 포함될 수도 있습니다. 다음 구문은 위의 구문과 동일합니다.

 

always @ (posedge signal1 or negedge signal2)
begin
  signal_assignment_1
  signal_assignment_2
          :
end

 

에지 감도를 모델링하는 기능을 통해 순차 회로를 모델링할 수 있습니다.

 

다음 예는 간단한 D-플립플롭을 모델링하는 방법을 보여줍니다.

 

always @ (posedge Clock)
begin
  Q =
D;
end

 

Verilog-2001에서는 블록 내 할당의 오른쪽에 나열된 신호를 기반으로 트리거되는 감지신호 목록을 지원하는 구문이 추가되었습니다. 이 구문은 @*입니다.

 

다음 예는 이 모델링 접근 방식을 사용하여 3입력 AND 게이트를 모델링하는 방법을 보여줍니다.

 

always @*
begin
  F
= A & B & C;
end

반응형
반응형

구조 설계 및 계층 구조

Verilog의 구조 설계는 원하는 기능을 생성하기 위해 상위 모듈 내에 하위 시스템을 포함하는 것을 말합니다. 이것을 계층 구조라고 하며 디자인 분할을 가능하게 하기 때문에 좋은 디자인 방법입니다. 순전히 구조적 설계는 신호 할당과 같은 모듈의 동작 구성을 포함하지 않고 대신 다른 하위 시스템의 인스턴스화 및 상호 연결을 포함합니다. Verilog의 하위 시스템은 단순히 상위 수준 모듈에 의해 호출되는 또 다른 모듈입니다. 호출되는 각 하위 레벨 모듈은 호출 모듈에 의해 동시에 실행됩니다.

 

구조 설계 구성

저수준 모듈 인스턴스화

인스턴스화라는 용어는 시스템 내에서 하위 레벨 모듈을 사용하거나 포함하는 것을 말합니다. Verilog에서 하위 모듈을 인스턴스화하는 구문은 다음과 같습니다.

 

module_name <instance_identifier> (port mapping. . .);

 

인스턴스화의 첫 번째 부분은 호출되는 모듈 이름입니다. 대소문자를 포함하여 하위 수준 모듈 이름과 정확히 일치해야 합니다. 인스턴스화의 두 번째 부분은 선택적 인스턴스 식별자입니다. 인스턴스 식별자는 동일한 하위 모듈의 여러 인스턴스를 인스턴스화할 때 유용합니다. 인스턴스화의 마지막 부분은 포트 매핑입니다. 하위 레벨 모듈의 포트에 신호를 연결하는 두 가지 기술(명시적 및 위치적)이 있습니다.

 

1.    명시적 포트 매핑

명시적 포트 매핑에서 하위 수준 하위 시스템의 포트 이름은 연결되는 신호와 함께 제공됩니다. 하위 레벨 포트 이름 앞에는 마침표(.)가 있고 연결 중인 신호는 괄호로 묶입니다. 연결의 세부 사항(, 포트 이름에서 신호 이름으로)이 명시적이므로 포트 연결은 임의의 순서로 나열될 수 있습니다. 각 연결은 쉼표로 구분됩니다. 명시적 포트 매핑 구문은 다음과 같습니다.

 

module_name <instance identifier> (.port_name1(signal1), .port_name2(signal2), etc.);

 

다음은 두 개의 하위 모듈로 구성된 계층적 시스템의 Verilog 모델을 설계하는 방법을 보여줍니다.

 

 

1.    위치 포트 매핑

위치 포트 매핑에서 하위 레벨 모듈의 포트 이름은 명시적으로 나열되지 않습니다.

대신 하위 시스템에 연결될 신호가 하위 시스템에서 정의된 포트와 동일한 순서로 나열됩니다. 각 신호 이름은 쉼표로 구분됩니다. 이 접근 방식은 연결을 설명하는 데 필요한 텍스트가 적지만 신호 순서의 부주의한 실수로 인해 연결이 잘못될 수도 있습니다. 위치 포트 매핑 구문은 다음과 같습니다.

 

module_name : <instance_identifier> (signal1, signal2, etc.);

 

다음 그림은 동일한 구조의 Verilog 모델을 생성하지만 대신 위치 포트 매핑을 사용하는 방법을 보여줍니다.

 

 

게이트 레벨 프리미티브

Verilog는 프리미티브를 사용하여 기본 논리 기능을 모델링하는 기능을 제공합니다. 프리미티브는 명시적 모델링이 필요하지 않을 만큼 간단한 논리 연산입니다. 이 동작의 예는 기본 논리 게이트 또는 진리표일 수 있습니다. Verilog는 간단한 논리 연산을 모델링하기 위해 일련의 게이트 수준 기본 요소를 제공합니다. 이러한 게이트 레벨 프리미티브는 not(), and(), nand(), or(), nor(), xor(), xnor()입니다. 이러한 각 기본 요소는 위치 포트 매핑이 있는 하위 수준 하위 시스템으로 인스턴스화됩니다.

 

각 프리미티브의 포트 순서에는 출력이 먼저 나열되고 입력이 뒤따릅니다. 출력과 각 입력은 스칼라입니다. 게이트 레벨 프리미티브는 Verilog 표준의 일부로 제공되므로 명시적으로 생성할 필요가 없습니다. 게이트 레벨 프리미티브를 사용하는 이점 중 하나는 각 프리미티브가 증가하는 입력 수를 자동으로 수용할 수 있으므로 입력 수를 쉽게 확장할 수 있다는 것입니다.

 

또한 이 접근 방식을 사용한 모델링은 본질적으로 게이트 수준 넷리스트를 제공하므로 기술 매핑을 위해 준비된 매우 낮은 수준의 상세한 게이트 수준 구현을 나타냅니다.

 

 

사용자 정의 프리미티브

UDP(사용자 정의 기본 요소)는 논리 테이블을 사용하여 하위 수준 구성 요소의 동작을 설명하는 시스템입니다. 이것은 여러 번 사용할 조합 논리 기능을 만드는 데 매우 유용합니다. UDP는 기능을 표 형식으로 나열하는 것이 더 편리한 대형 진리표에도 유용합니다. UDP UPD가 자체 파일에서 생성되어야 한다는 점을 제외하고 게이트 수준 기본 요소와 마찬가지로 상위 수준 모듈에서 인스턴스화되도록 의도된 하위 수준 하위 시스템입니다. UDP 구문은 다음과 같습니다.

 

primitive primitive_name (output output_name, input input_name1, input_name2, ...);
table
  in1_val in2_val ... : out_val;
  in1_val in2_val ... : out_val;
            :
endtable
endprimitive

 

UDP는 포트 정의에서 먼저 출력을 나열해야 합니다. 또한 포트에 대해 유형을 정의할 필요가 없습니다. 조합 논리 UDP의 경우 모든 포트는 와이어 유형으로 간주됩니다.

다음 예제는 조합 논리 회로를 구현하기 위해 사용자 정의 프리미티브를 설계하는 방법을 보여줍니다.

 

프리미티브에 지연 추가

지연은 프리미티브에 추가할 수 있습니다. 지연은 기본 이름 뒤에 삽입되지만 인스턴스 이름 앞에 삽입됩니다.

 

지연이 2인 인버터의 게이트 레벨 프리미티브.

not #2 U0 (An, A);

 

지연이 3 AND 게이트의 게이트 레벨 프리미티브.

and #3 U3 (m0, An, Bn, Cn);

 

1의 지연이 있는 UDP.

SystemX_UDP #1 U0 (F, A, B, C);

반응형

+ Recent posts