Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи мови AHDL_частина1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
669.7 Кб
Скачать

3.15. Прототип модуля

Мова АHDL дозволяє при описі модуля використовувати в якості його компонентів створені раніше модулі. Для цього текстовий опис модуля верхнього рівня ієрархії повинен містити опис прототипів цих модулів.

Прототип задається за допомогою оператора Function Prototype Statement, що може бути розташований або безпосередньо в текстовому описі, або у файлі включення (Include File), вміст якого приєднується до текстового опису на етапі компіляції.

Файл включення (Include File) з описом прототипу модуля слід створювати за допомогою команди Create Default Include File (меню File), яка виконується у вікні текстового редактора пакета MAX+plus II, що містить опис модуля.

У мові AHDL визначені два способи звертання до прототипу модуля:

  • Безпосереднє звернення (In_Line Reference).

  • Присвоєння прототипу символічного імені, тобто оголошення змінної і звертання до нього, як до змінної.

Відзначимо, що зазначені способи звертання до прототипу збігаються з описаними раніше способами звертання до примітива.

У мові AHDL визначено два типи модулів:

  • Параметризовані (Parameterized).

  • Непараметризовані (Unparameterized).

При цьому, як ті, так і інші можуть бути створені або самим розроблювачем, або фірмою Altera.

Як приклад, розглянемо варіанти текстового опису модуля Top_level_module, представленого на рис. 22.

Рис. 22.

У ньому використано три компоненти, кожна з яких являється модулем більш низького рівня в ієрархії описів. Припустимо, що для модулів Module_1 і Module_LPM створені файли включення:

Файл Module_1.inc

Function Module_1 (D[8..1], clk)

Returns (Out[8..1]).

Файл Module_LPM.inc

Function Module_LPM (A[WIDTH..1], B[WIDTH..1])

With (WIDTH)

Returns (Out[WIDTH..1]).

Нижче представлений текстовий опис, у якому здійснюється безпосереднє звертання до прототипів модулів.

INCLUDE “Module_1.inc”;

INCLUDE “Module_LPM.inc”;

FUNCTION Module_2(Data[8..1], clk, Reset)

RETURNS (Data_out[8..1]);

SUBDESIGN Top_level_Module

(

Din[8..1], CLK, Reset : INPUT;

Dout[8..1] : OUTPUT;

)

VARIABLE

Int_A[8..1] : NODE;

Int_D[8..1] : NODE;

BEGIN

Int_A[ ] = Module_1(.CLK = CLK, .D[] = Din[]);

-- Int_A[ ] = Module_1(Din[], CLK);

Int_D[] = Module_LPM(.A[] = Int_A[], .D[] = Dout[])

WITH (WIDTH = 8);

-- Int_D[] = Module_LPM(Int_A[], Dout[])

-- WITH (WIDTH = 8);

Dout[] = Module_2(.CLK = CLK, .Data[] = Int_D[], .Reset = Reset);

-- Dout[] = Module_2(Int_D[], CLK, Reset);

END;

Прототипи модулів Module_1 і Module_LPM, що знаходяться у файлах включення, приєднуються до даного текстового опису за допомогою оператора Include, а прототип модуля Module_2 заданий безпосередньо в текстовому описі.

У розділі Variable оголошені дві змінні Int_A[8.. 1] і Int_D[8.. 1], що є символічними іменами шин, що зв'язують компоненти Module_1 і Module_LPM, Module_LPM і Module_2 відповідно.

Рівняння Int_A[]=Module(.CLK=CLK,.D[]=Din[]) ілюструє безпосереднє звертання до прототипу модуля і зіставлення входів прототипу й переданих значень за іменами. Значення, що повертається, іншими словами вихідний сигнал компоненти, присвоюється внутрішній змінній Int_A[].

У наступному рядку текстового опису, у рядку з коментарями, наведене рівняння, логічно еквівалентне рівнянню, розглянутому вище. Однак у ньому використовується позиційне зіставлення входів прототипу й переданих значень.

Значення параметра WIDTH задається при безпосереднім звертанні до прототипу параметризованого модуля.

Розглянемо тепер текстовий опис модуля Top_Level_Module, у якому компоненти оголошуються внутрішніми змінними.

INCLUDE “Module_1.inc”;

INCLUDE “Module_LPM.inc”;

FUNCTION Module_2(Data[8..1], clk,Reset)

RETURNS (Data_out[8..1]);

SUBDESIGN Top_level_Module

(

Din[8..1], CLK, Reset : INPUT;

Dout[8..1] : OUTPUT;

)

VARIABLE

Var_Module_1 : Module_1;

Var_Module_2 : Module_2;

Var_Module_LPM : Module_LPM WITH (WIDTH = 8);

BEGIN

Var_Module_1.CLK = CLK;

Var_Module_2(CLK, Reset) = (CLK, Reset);

Var_Module_1(D) = Din[];

Var_Module_LPM.A[] = Var_Module_1 .OUT[];

Var_Module_LPM .B[] = Dout[];

Var_Module_2 .Data[] = Var_Module_LPM .OUT[];

Dout[] = Var_Module_2 . Data_out[];

END

У розділі змінних оголошені три змінні - символічні імена модулів, використовуваних у даному текстовому описі як компоненти.

Відзначимо, що при оголошенні змінної Var_Module_LPM, що позначає параметризований модуль, задане значення параметра WIDTH.

ЛІТЕРАТУРА

  1. Осадчий Ю.Ф. Язык описания аппаратуры AHDL. Метод. указания.