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

1.4. Демультиплексор

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

Число виходів демультиплексора зазвичай дорівнює 2n, де n — число розрядів двійкового коду адреси.

Нижче наведений приклад опису демультиплексора, що має однорозрядний інформаційний вхід IN, трирозрядний адресний вхід ADR[2..0], вхід дозволу роботи (вибору кристала) CS і восьмирозрядний вихід Q[7..0].

SUBDESIGN DMX

(

IN, ADR[2..0], CS : INPUT;

Q[7..0] : OUTPUT;

)

BEGIN

IF CS THEN

CASE ADR[] IS

WHEN 0 => Q[0] = IN;

WHEN 1 => Q[1] = IN;

WHEN 2 => Q[2] = IN;

WHEN 3 => Q[3] = IN;

WHEN 4 => Q[4] = IN;

WHEN 5 => Q[5] = IN;

WHEN 6 => Q[6] = IN;

WHEN 7 => Q[7] = IN;

END CASE;

END IF;

END;

У кожному рядку оператора CASE (тобто на кожному наборі аргументів) явно задане значення тільки одного виходу модуля. Оскільки оператор DEFAULTS не був використаний, то на інших виводах при даному наборі аргументів буде присутній сигнал логічного нуля.

На рис. 9. наведено результати моделювання описаного вище демультиплексора.

Рис. 9.

Розглянемо параметризований опис демультиплексора, що має WIDTH+1-розрядний інформаційний вхід (IN[WIDTH..0]), трирозрядний вхід адреси (ADR[2..0]), вхід дозволу роботи (CS) і вісім WIDTH-розрядних виходів (Q[7..0][WIDTH..0]).

PARAMETERS (WIDTH = 7);

ASSERT (WIDTH != 1)

REPORT "Value of parameters WIDTH = %" WIDTH

SEVERITY INFO;

ASSERT (WIDTH > 0)

REPORT "Value of parameter WIDTH must be greater then %" WIDTH

SEVERITY ERROR;

SUBDESIGN LPM_DMX

(

IN[WIDTH..0], ADR[2..0], CS : INPUT;

Q[7..0][WIDTH..0] : OUTPUT;

)

BEGIN

IF CS THEN

CASE ADR[] IS

WHEN 0 => Q[0][WIDTH..0] = IN[WIDTH..0];

WHEN 1 => Q[1][WIDTH..0] = IN[WIDTH..0];

WHEN 2 => Q[2][WIDTH..0] = IN[WIDTH..0];

WHEN 3 => Q[3][WIDTH..0] = IN[WIDTH..0];

WHEN 4 => Q[4][WIDTH..0] = IN[WIDTH..0];

WHEN 5 => Q[5][WIDTH..0] = IN[WIDTH..0];

WHEN 6 => Q[6][WIDTH..0] = IN[WIDTH..0];

WHEN 7 => Q[7][WIDTH..0] = IN[WIDTH..0];

END CASE;

END IF;

END;

У наведеному описі використана двовимірна група ОUT[7..O][WIDTH..0], у якій параметризований один діапазон зміни індексів (розрядність шини, що комутується).

Результати моделювання параметризованого демультиплексора при WIDTH=7 наведено на рис. 10.

Рис. 10.

1.5. Перетворювач коду

Перетворювач коду - комбінаційний пристрій, призначений для зміни коду подання інформації.

Розглянемо варіант опис перетворювача чотирирозрядного двійкового коду в п’ятирозрядний двійково-десятковий:

SUBDESIGN BIN_DEC

(

CS, BINARY_CODE[3..0] : INPUT;

BINARY_DECIMAL[4..0] : OUTPUT;

)

BEGIN

IF CS == VCC THEN

IF BINARY_CODE[] <= 9 THEN

BINARY_DECIMAL[] = (0, BINARY_CODE[]);

ELSE

BINARY_DECIMAL[] = (1, BINARY_CODE[]-10);

END IF;

ELSE

BINARY_DECIMAL[] = B"00000";

END IF;

END;

У наведеному прикладі для опису алгоритму роботи перетворювача коду використаний оператор IF THEN. Цей самий алгоритм роботи пристрою можна описати й іншим способом, наприклад, з використанням оператора TABLE.

SUBDESIGN BIN_DEC

(

CS, BINARY_CODE[3..0] : INPUT;

BINARY_DECIMAL[4..0] : OUTPUT;

)

BEGIN

TABLE

BINARY_CODE[] => BINARY_DECIMAL[];

B”0000” => B”00000”;

B”0001” => B”00001”;

B”0010” => B”00010”;

B”0011” => B”00011”;

B”0100” => B”00100”;

B”0101” => B”00101”;

B”0110” => B”00110”;

B”0111” => B”00111”;

B”1000” => B”01000”;

B”1001” => B”01001”;

B”1010” => B”10000”;

B”1011” => B”10001”;

B”1100” => B”10010”;

B”1101” => B”10011”;

B”1110” => B”10100”;

B”1111” => B”10101”;

END TABLE;

END;

Обидві програми абсолютно ідентичні й при моделюванні дають однаковий результат. Їхня відмінність тільки в довжині використовуваного опису.

Рис. 11.

У пристроях індикації часто використаються перетворювачі двійкового й двійково-десяткового кодів у семисегментний код. На рис. 12 зображений семисегментний індикатор з позначеннями сегментів.

Рис. 12.

Нижче наведений приклад текстового опису перетворювача двійково-десяткового коду в семисегментний код.

SUBDESIGN DEC_SEGM

(

BINARY_DECIMAL[3..0], ENABLE : INPUT;

A, B, C, D, E, G, F : OUTPUT;

)

BEGIN

IF ENABLE

THEN

TABLE

BINARY_DECIMAL[] => A, B, C, D, E, F, G;

B"0000" => 1,1,1,1,1,1,0;

B"0001" => 0,1,1,0,0,0,0;

B"0010" => 1,1,0,1,1,0,1;

B"0011" => 1,1,1,1,0,0,1;

B"0100" => 0,1,1,0,0,1,1;

B"0101" => 1,0,1,1,0,1,1;

B"0110" => 1,0,1,1,1,1,1;

B"0111" => 1,1,1,0,0,0,0;

B"1000" => 1,1,1,1,1,1,1;

B"1001" => 1,1,1,1,0,1,1;

END TABLE;

END IF;

END;

Наведений перетворювач кодів має вхід дозволу роботи - (Enable). При Enable=0 (робота заборонена) значення логічних функцій А, В, С, D, E, F, G не були явно задані. Тому їм буде присвоєне значення логічного нуля.

Результати моделювання перетворювача наведено на рис. 13.

Рис. 13.