Уровни описания описания
Скачать 210.79 Kb.
|
Основы Основы VHDL VHDL вторник вторник , 24 , 24 ноября ноября 2009 2009 г г Уровни Уровни описания описания РЭА РЭА системный уровень уровень вычислительных процессов функционально-логический уровень схемотехнический уровень компонентный уровень Функционально Функционально - - логический логический уровень уровень подуровень функционирования ЭВМ подуровень устройств (узлов) ЭВМ регистровый подуровень вентильный уровень Требования Требования к к HDL HDL стандартность; многоаспектность и иерархичность; пригодность для восприятия человеком и обработки на ЭВМ. Аспекты Аспекты описания описания РЭА РЭА функциональный (реализуемая функция, алгоритм) временной (задержки, время отклика) структурный (типы и связи компонент) ресурсный (число вентилей, площадь кристалла) надёжностный (время наработки на отказ) конструктивный (вес, габариты) стоимостной и т.д. Степень Степень детализации детализации аспектов аспектов Поведение Команды Алгоритмы устройств Микрооперации Булевы функции Фронты сигналов Микротакты Время Структура Такты П ер ек л ю ч ат ел и В ен ти л и М и к р о сх ем ы Р ег и ст р ы Б аз о в ы е у зл ы У ст р о й ст в а Э В М и В С HDL HDL как как язык язык программирования программирования Компоненты VHDL Проблемно-ориентированный компонент Общеалгоритмический компонент Последовательные операторы Типы данных Типы данных Целые Действительные Записи Массивы, строки Символьные Перечислимые Агрегаты Присваивание Выбор Условие Повторение Вызов подпрограмм Структурное описание Описание поведения во времени Физические Логические Ограниченные Подтипы Категория signal Представление задержек Представление параллельных процессов Структурное архитектурное тело Описание вхождений Описание конфигураций Параметры настройки Оператор условной генерации Параллельные операторы Оператор process Охраняемые блоки и выражения Операторы ожидания событий VHDL VHDL Языки Языки описания описания аппаратуры аппаратуры ( ( Hardware Description Language Hardware Description Language , , HDL) HDL) позволяют описывать блоки в первую очередь на функционально- логическом уровне, наибольшее распространение имеют на регистровом и вентильном подуровнях и при описании узлов ЭВМ. Проекты на языках HDL могут быть использованы и для решения задач системного уровня проектирования. Кроме того, специальные расширения, например, VHDL-AMS могут рассматриваться как промежуточный подуровень описания между вентильным подуровнем функционально- логического уровня и схемотехническим уровнем, что даёт возможность моделировать не только цифровую, но и аналоговую аппаратуру. Язык VHDL VHDL ( Very high speed integrated circuit Hardware Description Very high speed integrated circuit Hardware Description Language Language — язык описания сверхскоростных БИС) был разработан международной группой по заданию Министерства обороны США в начале 80-х годов с целью обеспечения единообразного понимания подсистем различными проектными группами. Структура Структура проекта проекта Проект в системе проектирования на основе VHDL представляется совокупностью иерархически связанных текстовых фрагментов, называемых проектными модулями . Различают первичные и вторичные проектные модули, при этом: < первичный модуль >::= < декларация сущности > | < декларация пакета > | < декларация конфигурации > < Вторичный модуль >::= < архитектурное тело > | < тело пакета > Сущности Сущности и и архитектуры архитектуры Декларация сущности сущности (entity) определяет имя проекта и его интерфейс, т.е. порты и параметры настройки. Архитектурное Архитектурное тело тело сущности описывает тем или иным образом функционирование устройства и (или) его структуру. Каждой сущности сопоставляется одно или несколько архитектурных тел. Несколько вторичных модулей, соответствующих одному первичному, составляют набор возможных альтернативных реализаций объекта, представленного первичным модулем. Например, одной сущности может соответствовать несколько архитектурных тел, отличающихся степенью детализации описания и даже алгоритмом преобразования данных. Структура Структура программы программы программа >::= { {< объявление библиотеки >} {< объявление использования >} < первичный модуль > } {< вторичный модуль >} < объявление библиотеки >::= library < имя библиотеки >; < объявление использования >::= use < имя библиотеки >.< имя пакета >.< имя модуля >; Например: Library IEEE; Use IEEE.std_logic_1164.all; Декларации Декларации сущностей сущностей < Декларация сущности >::= entity < имя проекта > is [< объявление параметров настройки >] [< объявление портов >] [< раздел деклараций >] [begin < раздел опреаторов >] end [entity] < имя проекта >; < объявление параметров настройки >::= generic (< имя >:< тип > [:=< выражение >] {;< имя >:< тип > [:=< выражение >]}); < объявление портов >::= port (< имя >:< режим > < тип > [:=< выражение >] {;< имя >:< режим > < тип > [:=< выражение >]}; < режим >::= in | out | inout Архитектурные тела < Архитектурное тело >::= architecture < имя архитектуры > of < имя сущности > is < раздел деклараций > begin < раздел операторов > end [architecture] < имя архитектуры >; Архитектурные тела Архитектурные тела представляют содержательное описание проекта. Архитектурное тело в некотором смысле подчинено соответствующей сущности. Различают структурные архитектурные тела (описывают проект в виде совокупности компонентов и их соединений), поведенческие архитектурные тела (описывающие проект как совокупность исполняемых действий) и смешанные тела Формальных признаков, по которым тело можно было бы отнести к тому или иному типу, не существует — речь идёт скорее не о чёткой классификации, а о стилях описания, для каждого из которых характерными являются определённые операторы и которые лучше отражают разные аспекты одного и того же объекта (структурный и поведенческий соответственно). Синхронный D-триггер T D C Q nQ Синхронный D-триггер library IEEE; use IEEE.STD_LOGIC_1164.all; entity D_trigger is port( D : in STD_LOGIC; C : in STD_LOGIC; Q : out STD_LOGIC; nQ : out STD_LOGIC ); end D_trigger; Синхронный D-триггер architecture D_trigger of D_trigger is begin Q <= D after 10 ns; nQ <= not Q; end D_trigger; architecture D_trigger of D_trigger is signal State : STD_LOGIC; begin State <= D; Q <= State after 10 ns; nQ <= not State after 10 ns; end D_trigger; Синхронный D-триггер architecture D_trigger of D_trigger is signal State : STD_LOGIC; begin process (C) begin if (C='1') then State <= D; end if; end process; Q <= State after 10 ns; nQ <= not State after 10 ns; end D_trigger; Синхронный D-триггер & & & & Q D Q C 4 3 2 1 S4 S3 S2 S1 Синхронный D-триггер architecture D_trigger2 of D_trigger is signal S1, S2, S3, S4 : STD_LOGIC; component na2 port( X1 : in STD_LOGIC; X2 : in STD_LOGIC; Y : out STD_LOGIC ); end component na2; begin na2_1: na2 port map (D, C, S1); na2_2: na2 port map (S1, C, S2); na2_3: na2 port map (S1, S4, S3); na2_4: na2 port map (S2, S3, S4); Q <= S3; nQ <= S4; end D_trigger; Одноразрядный сумматор Сin B A S Сout SUM ( ) ( ) ) ( B A Cin B A Cout B A Cin B A B A Cin S + ⋅ + ⋅ = ⊕ ⋅ + ⋅ + ⋅ ⋅ = Одноразрядный сумматор library IEEE; use IEEE.STD_LOGIC_1164.all; entity sum is port( Cin : in STD_LOGIC; A : in STD_LOGIC; B : in STD_LOGIC; S : out STD_LOGIC; Cout : out STD_LOGIC ); end sum; Одноразрядный сумматор architecture sum of sum is begin S <= (Cin and ((A and B) or ((not A)and (not B)))) or ((not Cin) and (A xor B)); Cout <= (A and B) or (Cin and (A or B)); end sum; Одноразрядный сумматор 1 1 1 2 1 3 & 4 1 1 A B CIN COUT S & 1 & 2 M2 1 1 2 & 3 1 4 & 5 1 3 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 N-разрядный сумматор Сin B A S Сout SUM Сin B A S Сout SUM A(i) B(i) A(i+1) B(i+1) S(i) S(i+1) N-разрядный сумматор library IEEE; use IEEE.STD_LOGIC_1164.all; entity sum_n is generic( N : integer := 8 ); port( Cin : in STD_LOGIC; A : in STD_LOGIC_VECTOR(N-1 downto 0); B : in STD_LOGIC_VECTOR(N-1 downto 0); Cout : out STD_LOGIC; S : out STD_LOGIC_VECTOR(N-1 downto 0) ); end sum_n; N-разрядный сумматор architecture sum_n of sum_n is component sum is port( Cin : in STD_LOGIC; A : in STD_LOGIC; B : in STD_LOGIC; S : out STD_LOGIC; Cout : out STD_LOGIC ); end component sum; signal C_in : STD_LOGIC_VECTOR(0 to N); signal C_out : STD_LOGIC_VECTOR(0 to N-1); begin C_in(0) <= Cin; sums: for i in 0 to N-1 generate sum: sum port map (C_in(i), A(i), B(i), S(i), C_out(i)); C_in(i+1) <= C_out (i); end generate; Cout <= C_out(N-1); end sum_n; Запоминающее Запоминающее устройство устройство CS RW A DI DO 1 X X X Z 0 0 A Data Z 0 1 A X Data Хранение Хранение Запись Запись Чтение Чтение Запоминающее Запоминающее устройство устройство library ieee; use ieee.std_kogic_1164.all; entity RAM is generic (N, K : integer; t_cs, tsu_a_cs, tsu_rw_cs, tsu_di_cs : time); port (A : in std_logic_vector (0 to N-1); DI : in std_logic_vector (0 to K-1); DO : in std_logic_vector (0 to K-1); CS, RW : in std_logic); end entity; Запоминающее Запоминающее устройство устройство architecture myRAM of RAM is const NW : integer := 2**N; type memory is array (NW-1 downto 0) of std_logic_vector (K-1 downto 0); signal M : memory; function value (arg : in std_logic_vector) return integer is variable tmp : integer := 0; begin for i in arg’high downto arg’low loop tmp := tmp * 2; if arg(i)=‘1’ then tmp := tmp + 1; end if; end loop; return tmp; end value; Запоминающее Запоминающее устройство устройство begin process (CS) begin if CS=‘0’ and not CS’stable then if A’stable(tsu_a_cs) and RW=‘0’ and RW’stable(tsu_rw_cs) and DI’stable(tsu_di_cs) then M (value(A)) <= DI after tcs; elsif A’stable(tsu_cs) and RW=‘1’ and RW’stable(tsu_rw_cs) then DO <= M (value(A)) after t_cs; else for I in 0 to (K-1) loop DO(i) <= ‘Z’; end loop; end if; end if; end process; end myRAM; |