Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример выполнения задания на разработку многофункционального регистра (МФР) на языке VHDL
Требуется разработать МФР, который выполняет следующий набор микроопераций:
Примечание: Х – означает, что микрооперация выполняется независимо от значения на данном входе. Для решения задачи будем использовать смешанный стиль составления VHDL описания, сочетающий элементы структурного и поведенческого стилей. Структурное описание базируется на представлении объекта проектирования (проекта) в виде структуры – функциональных модулей и связей между ними. В общем случае описание функциональных модулей может быть также структурным. То есть каждый функциональный модуль может быть представл в виде структуры, состоящей из модулей более низкого уровня иерархии. При смешанном стиле используется поведенческое описание функциональных модулей с использованием параллельных и потоковых операторов. Поведенческое описание основано на представлении функционального модуля в виде «черного ящика», а составление такого описания называют макромоделированием. Ключевым понятием для структурного описания в VHDL являются объекты COMPONENT (компонент). Каждый функциональный модуль проекта реализуется при помощи соответствующего компонента в виде экземпляра компонента. Компоненты и экземпляры компонентов объявляются в теле архитектуры при помощи карт портов (PORT MAP). Для соединения экземпляров компонентов в структуру используются внутренние сигналы (SIGNAL), также определяемые в теле архитектуры. Типы сигналов должны строго соответствовать типам, указанным при описании интерфейсов компонентов. Рассмотрим порядок составления структурного описания, соответствующего следующей функциональной схеме МФР: Назначение отдельных модулей: 1. Модуль (COMPONENT) POZ – служит для формирования на выходе значения суммы единиц во входном двоичном векторе. Для удобства последующей обработки значение суммы представляется с использованием типа integer. 2. Модуль (COMPONENT) SM – сумматор, для описания работы которого используются сигналы типа integer. 3. Модуль (COMPONENT) RG – служит для непосредственной реализации микроопераций.
Создаваемому описанию для наглядности сопоставим структурную схему, представленную на рисунке.
Пример составления VHDL описания смешанного типа для регистра с заданным перечнем микроопераций:
library IEEE; use IEEE.std_logic_1164.all;
-- Описание интерфейса проекта;
entity MFR is port ( x0: in BIT; x1: in BIT; x2: in BIT; x3: in BIT; z0: in BIT; z1: in BIT; z2: in BIT; z3: in BIT; SI: in BIT; Y0: in BIT; Y1: in BIT; EN: in BIT; CLK: in BIT; CLR: in BIT; q0: buffer BIT; q1: buffer BIT; q2: buffer BIT; q3: buffer BIT ); end MFR;
-- Описание архитектуры проекта;
architecture MFR_arch of MFR is
-- Объявление внутренних сигналов для связывания экземпляров компонентов;
signal s1: integer range 0 to 4; signal s2: integer range 0 to 4; signal s3: integer range 0 to 8;
-- Объявление компонента POZ, в котором с функциональным преобразованием совмещено преобразование типов;
COMPONENT POZ PORT ( D0: in BIT; D1: in BIT; D2: in BIT; D3: in BIT; F: out integer range 0 to 4 ); end COMPONENT;
-- Объявление компонента SM;
COMPONENT SM PORT ( A: in integer range 0 to 4; B: in integer range 0 to 4; S: out integer range 0 to 8 ); end COMPONENT;
-- Объявление компонента RG;
COMPONENT RG PORT ( SI: in BIT; SMM: in integer range 0 to 8; D0: in BIT; D1: in BIT; D2: in BIT; D3: in BIT; Y0: in BIT; Y1: in BIT; EN: in BIT; CLK: in BIT; CLR: in BIT; Q0: buffer BIT; Q1: buffer BIT; Q2: buffer BIT; Q3: buffer BIT ); end COMPONENT;
-- Объявление экземпляров компонентов и описание их связей;
Begin -- Объявление экземпляров компонента POZ с именами DD1 и DD2;
DD1: POZ PORT MAP ( D0 => x0, D1 => x1, D2 => x2, D3 => x3, F => s1 ); DD2: POZ PORT MAP ( D0 => z0, D1 => z1, D2 => z2, D3 => z3, F => s2 );
-- Объявление экземплярa компонента SM; DD3: SM PORT MAP ( A => s1, B=> s2, S => s3 ); -- Объявление экземплярa компонента RG;
DD4: RG PORT MAP ( SI => SI, SMM => s3, D0 => z0, D1 => z1, D2 => z2, D3 => z3, Y0 => Y0, Y1 => Y1, EN => EN, CLK => CLK, CLR => CLR, Q0 => q0, Q1 => q1, Q2 => q2, Q3 => q3 );
end MFR_arch; -- Окончание структурной части описания проекта и начало поведенческого описания компонентов; library IEEE; use IEEE.std_logic_1164.all; -- Описание интерфейса entity компонента в точности совпадает с описанием интерфейса при объявлении компонента;
entity POZ is PORT ( D0: in BIT; D1: in BIT; D2: in BIT; D3: in BIT; F: out integer range 0 to 4 ); end POZ; -- Поведенческое описание архитектуры компонента POZ; architecture RTY_arch of POZ is begin process (D0, D1, D2, D3) variable D: BIT_VECTOR (3 downto 0); begin D: = D3 & D2 & D1 & D0; case D is when " 0000" => F< = 0; when " 0001" => F< = 1; when " 0010" => F< = 1; when " 0011" => F< = 2; when " 0100" => F< = 1; when " 0101" => F< = 2; when " 0110" => F< = 2; when " 0111" => F< = 3; when " 1000" => F< = 1; when " 1001" => F< = 2; when " 1010" => F< = 2; when " 1011" => F< = 3; when " 1100" => F< = 2; when " 1101" => F< = 3; when " 1110" => F< = 3; when " 1111" => F< = 4; end case; end process; end RTY_arch;
-- Описание интерфейса и архитектуры компонента SM;
library IEEE; use IEEE.std_logic_1164.all;
entity SM is PORT ( A: in integer range 0 to 4; B: in integer range 0 to 4; S: out integer range 0 to 8 ); end SM;
architecture ADD_arch of SM is begin S < = A + B; end ADD_arch;
-- Описание интерфейса и архитектуры компонента RG;
library IEEE; use IEEE.std_logic_1164.all;
entity RG is PORT ( SI: in BIT; SMM: in integer range 0 to 8; D0: in BIT; D1: in BIT; D2: in BIT; D3: in BIT; Y0: in BIT; Y1: in BIT; EN: in BIT; CLK: in BIT; CLR: in BIT; Q0: buffer BIT; Q1: buffer BIT; Q2: buffer BIT; Q3: buffer BIT ); end RG;
architecture RG_arch of RG is
begin process (clk, clr, en) begin if clr = '1' then Q0 < = '0'; Q1 < = '0'; Q2 < = '0'; Q3 < = '0'; elsif EN = '0' then null; elsif CLK'event and CLK = '1' then if Y0 = '0' and Y1 = '0' then Q0 < = D0; Q1 < = D1; Q2 < = D2; Q3 < = D3; elsif Y0 = '0' and Y1 = '1' then Q0 < = SI; Q1 < = Q0; Q2 < = Q1; Q3 < = Q2; elsif Y0 = '1' and Y1 = '0' then Q0 < = '0'; Q1 < = Q0; Q2 < = Q1; elsif Y0 = '1' and Y1 = '1' then
case SMM is when 0 => Q0 < = '0'; Q1 < = '0'; Q2 < = '0'; Q3 < = '0'; when 1 => Q0 < = '1'; Q1 < = '0'; Q2 < = '0'; Q3 < = '0'; when 2 => Q0 < = '0'; Q1 < = '1'; Q2 < = '0'; Q3 < = '0'; when 3 => Q0 < = '1'; Q1 < = '1'; Q2 < = '0'; Q3 < = '0'; when 4 => Q0 < = '0'; Q1 < = '0'; Q2 < = '1'; Q3 < = '0'; when 5 => Q0 < = '1'; Q1 < = '0'; Q2 < = '1'; Q3 < = '0'; when 6 => Q0 < = '0'; Q1 < = '1'; Q2 < = '1'; Q3 < = '0'; when 7 => Q0 < = '1'; Q1 < = '1'; Q2 < = '1'; Q3 < = '0'; when 8 => Q0 < = '0'; Q1 < = '0'; Q2 < = '0'; Q3 < = '1'; end case SMM;
--with SMM select --Q0 < = '1' when 1 | 3 | 5 |7, '0' when others; --with SM select --Q1 < = '1' when 2 | 3 | 6 | 7, '0' when others; --with SM select --Q2 < = '1' when 4 | 5 | 6 | 7, '0' when others; --with SM select --Q3 < = '1' when 8, '0' when others
end if; end if; end process; end RG_arch;
Порядок выполнения работы
1. В соответствии с порядком создания проекта и макроэлемента с VHDL описанием, изложенным в пособии «Инструментальные средства …..» сформировать VHDL шаблон регистра. 2. Изучив пример составления смешанного VHDL описания регистра составить описание в соответствии с индивидуальным заданием. 3. Заменить шаблон созданным описанием регистра. 4. Выполнить последовательно проверку синтаксиса описания, синтез и создание макроэлемента. 5. Выполнить функциональное моделирование макроэлемента, руководствуясь следующим требованием к тестовой временной диаграмме: Выполняя моделирование необходимо показать, что при выполнении каждой микрооперации, каждый разряд регистра переходит как из состояния «1» в состояние «0», так и наоборот. Очевидно, что при таком требовании каждая микрооперация в тесте может выполняться несколько раз. Микрооперации в тесте могут выполняться в любой последовательности. При невозможности применения этого правила к какой-либо микрооперации, вследствие ее специфики, следует привести соответствующее объяснение. 6. Подготовить проект с макроэлементом для загрузки в ПЛИС (см. рисунок). 7. Выполнить загрузку проекта в ПЛИС и продемонстрировать работу регистра на стенде.
|