Синтезатор Leonardo Spectrum для микросхемы MAX3128ATC144 из данного VHDL-кода сгенерирует схему, показанную на рисунке 13. — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Синтезатор Leonardo Spectrum для микросхемы MAX3128ATC144 из данного VHDL-кода сгенерирует схему, показанную на рисунке 13.

2022-11-27 36
Синтезатор Leonardo Spectrum для микросхемы MAX3128ATC144 из данного VHDL-кода сгенерирует схему, показанную на рисунке 13. 0.00 из 5.00 0 оценок
Заказать работу

Если в выражение WORK.NAND2X3(bbb) подставить архитектуру ddd, то Leonardo все равно сгенерирует такую же схему, можете проверить. Повторю, что данная схема получилась для конкретной микросхемы (технологии) ПЛИС. Другое дело если Вы пишите VHDL-модель, тогда разные архитектуры могут вести себя по-разному. Кстати, обратите внимание, что объявление компонента NAND2X3 закомментировано. VHDL допускает не объявлять используемые компоненты, если они определены ранее и подключаются записью типа:

· NAME: entity WORK.NAME_ENTITY(NAME_ARCHITECTURE)

· generic map(...)

· port map(...);

ПРОЦЕССЫ

... процесс пошел.

Давайте продолжим развивать наш VHDL-проект. Пусть наше устройство будет программируемым, и сигналами разрешения/запрещения индикации ошибки будет управлять внешний процессор через управляющий регистр RegUpr. Итак, нам нужен регистр. Давайте напишем VHDL-интерфейс нашего регистра.

· ---------------------------------

· -- VHDL-интерфейс регистра

· ---------------------------------

· library ieee;

· use ieee.std_logic_1164.all;

· ---------------------------------

· entity RegUpr is

· port (

· wr, cs: in std_logic;

· addr: in std_logic_vector(1 downto 0);

· datain: in std_logic_vector(7 downto 0);

· en1, en2: out std_logic

· );

· end RegUpr;

· ---------------------------------

Теперь нам нужно сделать так, чтобы регистр реагировал на определенную комбинацию сигналов rw, cs и addr. В языке VHDL добиться этого можно несколькими способами. Один из способов это организовать процесс. В общем виде VHDL-процесс записывается так:

· LABEL: process (лист чувствительности)

· -- область деклараций

· begin

· --VHDL операторы

· end process;

Язык VHDL допускает процессы без меток, а также отсутствие листа чувствительности при наличии в теле процесса хотябы одного оператора wait. C учетом вышесказанного, напишем архитектуру регистра на VHDL:

· -----------------------------------

· -- VHDL-архитектура регистра

· -----------------------------------

· architecture arch of RegUpr is

· signal regupr: std_logic_vector(7 downto 0);

· begin

· -------------------------------

· -- VHDL-процесс регистра

· -------------------------------

· process (wr, cs, addr)

· begin

· if (cs = '1' and wr = '0') then

· case addr is

· when "01" => regupr <= datain;

· when others => null;

· end case;

· end if;

· end process;

· en1 <= regupr(0);

· en2 <= regupr(1);

· end arch;

Теперь осталось соединить наш VHDL-регистр со схемой формирования ошибки и у нас получится работоспособное программируемое устройство.

· --------------------------------------------------

· -- VHDL код управления индикацией

· --------------------------------------------------

· library ieee;

· use ieee.std_logic_1164.all;

· ---------------------------------

· entity ERR_LED is

· port (

· ERR1, ERR2, wr, cs: in std_logic;

· addr: in std_logic_vector(1 downto 0);

· data: in std_logic_vector(7 downto 0);

· LED: out std_logic

· );

· constant GND: std_logic:='0';

· constant TRI: std_logic:='Z';

· end ERR_LED;

· ---------------------------------

· architecture led_arch of ERR_LED is

· signal serror, en1, en2: std_logic;

· begin

· C0: entity WORK.RegUpr(arch) port map(wr => wr, cs => cs, en1 => en1, en2 => en2, datain => data, addr => addr);

· C1: entity WORK.NAND2X3(bbb) port map(a => ERR1, b => en1, c => ERR2, d => en2, q => serror);

· LED <= GND when serror = '1' else TRI;

· end led_arch;

Синтезатор Leonardo Spectrum для микросхемы MAX3128ATC144 из данного VHDL-кода сгенерирует схему, показанную на рисунке 14.

Все хорошо, но смущает сигнал выбора устройства. Конечно без него никак, потому как адресная шина процессора наверняка больше, чем наши два разряда. Но есть вопрос, кто его формирует. Конечно, многие современные процессоры могут сами формировать несколько CS для разных областей адресного пространства, но мы в учебных целях будем считать, что дешифрация адреса возложена на периферию. Итак, нам нужен дешифратор адреса. Пусть адрес стробируется сигналом ALE. Тогда нам надо как-то ловить этот строб. Вот таким вот путем мы и подошли к атрибутам VHDL, которые и рассмотрим в следующем разделе.

АТРИБУТЫ

... а компьютер считался атрибутом буржуазного общества.

Атрибуты - это различные характеристики объектов VHDL. Они делятся на предопределенные и пользовательские. Мы рассмотрим и те и другие, хотя использование пользовательских атрибутов очень обременительно и мало что дает, но может кому-то и понравится.

Предопределенные атрибуты делятся на три группы - атрибуты сигналов, атрибуты массивов и атрибуты типов. Давайте мы их так и будем рассматривать. В таблице 1 приведены атрибуты сигналов, в таблице 2 - массивов, в таблице 3 - типов данных.

Таблица 1

Атрибут Описание
S'active TRUE, если было присвоение, но текущее значение еще прежнее
S'delayed(t) Значение сигнала, существовавшее на время t перед вычислением данного атрибута
S'event TRUE, если происходит изменение сигнала
S'last_active Время от последнего присвоения значения сигналу до момента вычисления атрибута
S'last_event Время от последнего изменения сигнала до момента вычисления атрибута
S'last_value Последнее присвоенное сигналу значение
S'stable(t) TRUE, если не происходило изменение сигнала в течение времени t
S'transaction TRUE, если происходит очередное присвоение значения сигналу
S'quiet FALSE, если было присвоение, но текущее значение еще прежнее

 

Таблица 2

Атрибут Описание
A'left(N) Левая граница N-го индекса массива А
A'right(N) Правая граница N-го индекса массива А
A'high(N) Верхняя граница N-го индекса массива А
A'low(N) Нижняя граница N-го индекса массива А
A'range(N) Диапазон N-го индекса массива А
A'reverse_range(N) Обратный диапазон N-го индекса массива А
A'length(N) Длина диапазона N-го индекса массива А

 

Таблица 3

Атрибут Описание
T'base Базовый тип данных
T'left Левая граница значений T
T'right Правая граница значений T
T'high Верхняя граница значений T
T'low Нижняя граница значений T
T'pos(X) Позиция значения Х в наборе значений Т
T'val(N) Значение элемента в позиции N набора значений Т
T'succ(X) Значение в наборе значений T, на одну позицию большее X
T'pred(X) Значение в наборе значений T, на одну позицию меньшее X
T'succ(X) Значение в наборе значений T, на одну позицию вправо от X
T'pred(X) Значение в наборе значений T, на одну позицию влево от X

 

Несколько слов о пользовательских атрибутах в языке VHDL. Раньше было модно назначать пины микросхемы прямо в VHDL-коде через пользовательские атрибуты, и компилятор брал эти значения и минуя синтезатор передавал их разводчику. Но сейчас такое почти нигде не практикуется. Во первых Вы можете не знать на этапе написания VHDL-кода, какую микросхему примените, во вторых сам компилятор может не знать, каким разводчиком Вы воспользуетесь, потому что серьезные разработчики практически не пользуются программами "все в одном флаконе", да и нет сейчас таких фирм, чтобы сами все делали, все равно синтезаторы от одной фирмы, компиляторы от другой, разводчики от третьей, а симуляторы от четвертой, все это в одну оболочку собрали и обозвали, к примеру, КВАРТУС II.

Но в качестве примера такие атрибуты подойдут в самый раз:

· entity example is

· port (res, clk: in std_logic;

· data_in: in std_logic_vector(3 downto 1);

· data_out: out std_logic_vector(3 downto 1)

· );

· attribute pinnum: string;-- Определили атрибут pinnum

· attribute pinnum of res signal is "5";-- Здесь и далее назначаем пины

· attribute pinnum of clk signal is "9";

· attribute pinnum of data_in signal is "11, 12, 13";

· attribute pinnum of data_out signal is "18, 20, 64";

· end example;


Поделиться с друзьями:

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.023 с.