курсовая работа
На тему: Основы языка VHDL
Москва, 2009
Содержание
1.1 Введение
1.2 Идентификаторы в языке VHDL
1.3 Объекты языка VHDL
1.4 Типы данных
1.5 Операции языка VHDL
1.6 Последовательные операторы
1.7 Параллельные операторы
1.8 Описание интерфейса устройства
1.9 Архитектура
1.10 Особенности синтеза схем по описаниям на языке VHDL
Литература
Рис. 1.1. Цифровое устройство и его модель
Вид изнутри определяет функциональные возможности устройства или его структуру. Внутреннее строение объекта определяет архитектура (architecture body).
Как и в языках программирования, язык VHDL имеет свои правила, в том числе правила описания имен переменных, объектов, типов данных и других параметров. Основные правила языка VHDL описаны в последующих разделах.
Abs |
Access |
after |
alias |
All |
|
And |
architecture |
array |
begin |
Block |
|
Body |
Buffer |
case |
component |
Configu-ration |
|
Constant |
disconnect |
downto |
else |
Elsif |
|
End |
Entity |
file |
for |
function |
|
generate |
Generic |
guarded |
if |
In |
|
inout |
Is |
label |
library |
linkage |
|
loop |
Map |
mod |
nand |
New |
|
next |
Nor |
not |
null |
Of |
|
on |
Open |
or |
others |
Out |
|
package |
Port |
procedure |
process |
Range |
|
record |
Register |
rem |
select |
severity |
|
signal |
Subtyupe |
then |
to |
Transport |
|
type |
Units |
until |
use |
vriable |
|
wait |
When |
while |
with |
Xor |
variable COUNT: INTEGER;
В результате порождается объект с именем COUNT, который хранит целочисленную величину. Кроме того, COUNT декларируется как класс variable.
Объекты - данные могут быть трех классов:
- сonstant (константа) - может хранить отдельное значение определенного типа. Это значение присваивается объекту в начале моделирования и не может изменяться в процессе моделирования.
- variable (переменная) - объект этого класса может хранить отдельное значение определенного типа, однако, в процессе моделирования ему могут присваиваться различные значения. Для этого используются выражения присваивания (variable assignment statement).
- signal (сигнал) - объект данного класса имеет предыдущее значение, имеет текущее значение и набор последующих значений.
Объекты класса signal моделируют проводные соединения в схемах, в то время как переменные (variable) и константы (constant) используются для моделирования поведения схемы, они аналогичны объектам, используемым в языках программирования C и Pascal.
signal CLOCK: BIT;
signal DATA_BUS: BIT_VECTOR(0 to 7);
signal GATE_DELAY: TIME := 10 ns;
В первом примере декларируется объект CLOCK типа BIT, начальное значение при моделировании будет взято по умолчанию, т.е. 0 (набор значений типа BIT: 0,1 и крайнее левое значение 0).
Не все объекты в языке VHDL создаются путем декларирования, например, входные/выходные порты всегда считаются объектами класса signal.
BIT_VECTOR(0, 1, 1) < BIT_VECTOR(1, 0, 1)
получен результат TRUE, т.к. первый элемент вектора слева меньше первого элемента вектора справа. Другой пример, если декларирован тип:
type MVL is (U, 0, 1, Z );
то результат сравнения:
MVL( U ) < MVL( Z )
будет TRUE, т.к. `U находится левее `Z.
`0 & `1
образуется массив символов “01”, или еще пример:
`C & `A & `T
дает “CAT”.
A rem B = A - ( A / B ) * B
Результат mod имеет знак второго операнда и определяется следующим образом:
A mod B = A - B * N,
где N - некоторое целое.
abar := not a;
задает новое значение переменной abar, а именно - инверсное значение a.
Оператор
z <= not (a and b);
задает новое значение сигнала z, которое получается справа от знака <=.
if булевское_выражение then
последовательностные_выражения
[elsif булевское_выражение then
последовательностные_выражения ]
[else
последовательностные_выражения]
end if;
Выражение if вычисляется путем просмотра условий одного за другим, пока не будет найдено истинное. Затем вычисляется набор последовательностных выражений, связанных с этим условием. Предложений вида elsif в выражении if может быть от 0 и более. Может использоваться и предложение else. Выражения if могут вкладываться одно в другое без ограничений.
Рассмотрим простой пример.
if CTRL = 1 then
MUX_OUT<= "10";
else
MUX_OUT<= "01";
end if;
Если управляющий сигнал CTRL1 равен `1, то выходной сигнал MUX_OUT принимает значение "10", иначе MUX_OUT примет значение "01". На этом оператор if завершается.
Рассмотрим более сложный пример.
if CTRLI = 1 then
if CTRL2 = 0 then
MUX_OUT<= "0010";
else
MUX_OUT<= "0001";
end if;
else
if CTRL2 = 0 then
MUX_OUT <= "1000";
else
MUX_OUT <= "0100";
end if;
end if;
Если управляющий сигнал CTRL1 равен `1, тогда при условии (открывается вложенное if) CTRL2=0 выходной сигнал MUX_OUT<= "0010", иначе (т.е. при любых других значениях сигнала CTRL2) MUX_OUT<= "0001". Здесь завершается внутренний (вложенный) оператор if. Иначе (т.е. при любых других значениях сигнала CTRL1), если (открывается новый вложенный оператор if) CTRL2=0, тогда MUX_OUT<= "1000", иначе (т.е. при любых других значениях сигнала CTRL2) MUX_OUT<= "1000". Здесь завершается внутренний (вложенный) оператор if, а также завершается и наружный.
case выражение is
when вариант выбора => последовательностные_выражения
when вариант выбора => последовательностные_выражения
-- произвольное число вариантов выбора.
when others => последовательностные_выражения]
end case;
При вычислении выражения case выбирается одна из ветвей в соответствии со значением выражения. Выражение может иметь значения типа перечислимого или типа одномерного массива. Рассмотрим пример:
type WEEK_DAY is (MON, TUE, WED, THU, FRI, SAT, SUN);
type DOLLARS is range 0 to 10;
variable DAY: WEEK_DAY;
variable POCKET_MONEY: DOLLARS;
case DAY is
when TUE => POCKET_MONEY := 6; -- ветвь 1
when MON I WED => POCKET_MONEY := 2; -- ветвь 2
when FRI to SUN => POCKET_MONEY := 7; -- ветвь 3
when others => POCKET_MONEY := 0; -- ветвь 4
end case;
Переменная WEEK_DAY имеет значения перечислимого типа (дни недели). Переменная DOLLARS имеет целочисленные значения в диапазоне от 0 до 10. Ветвь 1 выбирается, когда день недели TUE. Ветвь 2 выбирается в случае когда дни недели MON или WED (вертикальная черта означает ИЛИ). Ветвь 3 покрывает значения от FRI до SUN, т.е. FRI, SAT и SUN. Ветвь 4 покрывает все оставшиеся значения, т.е. THU.
[ярлык для loop: ] итерационная схема loop
последовательностные_выражения
end loop [ярлык для loop ] ;
Существует три итерационных схемы. Первая имеет форму:
for идентификатор in диапазон
Пример использования схемы:
FACTORIAL := 1;
for NUMBER in 2 to N loop
FACTORIAL := FACTORIAL * NUMBER;
end loop;
Тело loop исполняется N-1 раз, при этом идентификатор NUMBER в конце каждой итерации увеличивается на 1. Подразумевается, что идентификатор целочисленного типа и значения его лежат в диапазоне от 2 до N.
Второй итерационной схемой является следующая:
while булевскоe_выражение
Пример использования схемы:
J:=0;SUM:=10;
WH-LOOP: while J<20 loop -- loop имеет ярлык WH_LOOP
SUM := SUM * 2;
J:=J+3;
end loop;
Выражения в теле loop выполняются одно за другим и эта последовательность повторяется, пока условие J<20 истинно.
Третьей cхемой является конструкция, в которой итерационная схема не задается и выход из loop осуществляется с использованием выражений: exit, next или return, например:
SUM:=1;J:=0;
L2: loop --loop имеет ярлык
J:=J+21;
SUM := SUM* 10;
exit when SUM > 100;
end loop L2;
В этом примере выражение exit заставляет выходить из петли L2 когда SUM становится больше 100. При отсутствии выражения exit loop будет исполняться бесконечно.
[имя процесса:][postponed] process [(список)]
раздел деклараций
begin
операторы
end process [имя процесса];
Имя процесса и ключевое слово [postponed] являются необязательными и часто отсутствуют. Список, находящийся после ключевого слова process, хотя и является необязательным, на практике используется достаточно часто для указания сигналов запуска. Перед ключевым словом могут находиться различного рода декларации типов, констант атрибутов и т. д.
Хотя процесс является параллельным оператором, он может содержать последовательные операторы. Внутри процессов не мегут быть декларированы сигналы.
entity half_adder is
port(a, b: in BIT; sum, cur: out BIT);
end half_adder;
Здесь описание с именем half_adder имеет два входных порта, a и b (in - означает входной порт), и два выходных порта, sum и carry (out - означает выходной порт). Тип портов определен как BIT - означает, что сигналы на линиях портов могут принимать значения: `0 или `1.
Другим примером может послужить дешифратор, показанный на рис. 1.3.
entity dec2x4 is
port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));
end dec2x4;
Здесь описание с именем dec2x4 имеет три входных порта и четыре выходных. Выходные порты описаны как массив. BIT_VECTOR - это одномерный массив, диапазон задается параметром Z (0 to 3).
Рис. 1.3. Декодер 2х4
Каждый интерфейсный порт может функционировать в следующих режимах:
in - значение порта только считывается для использования внутри модели,
out - значение порта может только обновляться моделью, но не считывается,
inout - двунаправленный порт, значение считывается и обновляется моделью,
buffer - буферный порт, значение считывается и обновляется моделью, но источником сигнала может быть либо буфер, либо одиночный источник.
entity dec2x4 is
port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));
end dec2x4;
architecture dec_seq of dec2x4 is
begin
process (a, b, enable)
variable abar, bbar: BIT;
begin
abar:= not a; --выражение 1
bbar:= not b; -- выражение 2
If enable = `1 then -- выражение 3
z(3) <= not (a and b); -- выражение 4
z(2) <= not (a and bbar); -- выражение 5
z(1) <= not (abar and b); -- выражение 6
z(0) <= not (abar and bbar); -- выражение 7
else z <= “1111”;
end if;
end process;
end dec_seq;
Архитектура имеет свое имя dec_seq. О принадлежности архитектуры к описанию интерфейса dec2х4 говорит выражение: dec_seq of dec2x4. Список сигналов, которыми запускается процесс, дан в скобках: process (a, b, enable). До начала процесса, если необходимо, декларируются переменные variable abar, bbar: BIT. Зона действия их ограничена данным процессом (от begin до end process). Предположим, что в момент T произошло изменение сигнала а. Новое значение переменной abar (выражение 1) вычисляется и присваивается без задержки - мгновенно (в качестве знака присваивания в данном случае используется =). Без задержки будут вычислены выражения 2 и 3.
Далее в ходе процесса одно за другим вычисляются выражения от 4 до 7, а новые значения сигналам z(0), z(1), z(2), z(3) будут присвоены (в качестве символа оператора присвоения используется <= ) лишь через некоторую, пусть даже фиктивную (бесконечно малую), задержку . Это существенное отличие процедур присвоения для переменных и для сигналов.
Рассмотрим пример мультиплексора 4х1 (рис.1.4). Четыре входных сигнала A, B, C и D выводятся через один порт Z. Коммутация осуществляется сигналом CTRL.
Рис. 1.4. Мультиплексор 4х1.
entity MUX is
port (A, B, C, D: in BIT; CTRL: in BIT_VECTOR(0 to 1);
Z: out BIT);
end MUX;
architecture MUX_BEHAVIOR of MUX is
begin
PMUX: process (A, B, C, D, CTRL)
variable TEMP: BIT;
begin
case CTRL is
when "00" => TEMP := A:
when "01" => TEMP := B;
when "10" => TEMP := C;
when "11" => TEMP := D;
end case;
Z <= TEMP;
end process PMUX;
end MUX_BEHAVIOR;
Архитектура получила название MUX_BEHAVIOR, процесс имеет ярлык PMUX. Переменной TEMP в зависимости от значения сигнала CTRL присваивается значение одного из входных портов: A, когда CTRL имеет значение “00”; B, когда CTRL имеет значение “01”; A, когда CTRL имеет значение “10”; D, когда CTRL имеет значение “11”.
Для описания синхросигналов обычно используется атрибу EVENT. Он истинен когда происходит “событие” - изменение сигнала. Например, поведение D-триггера, показанного на рис.1.5, можно описать так:
Рис.1.5. D-триггер
entity dff is
port (data, clk: in BIT
q, notq: out BIT);
end dff;
architecture behav of dff is
begin
process (clk)
begin
if (clkevent and clk = `1) then
q <= data;
notq <= not data;
end if;
end process;
end behav;
Выражение (clkevent and clk = `1) задает условие: если сигнал clk меняется с `0 на `1
entity full_adder is
port (a, b, cin: in BIT; sum, cout: out BIT);
end full_adder;
architecture full_ad_conc of full_adder is
begin
sum <= (a xor b) xor cin after 15 ns;
cout <= (a and b)or(b and cin)or(cin and a) after 10ns;
end full_ad_conc;
Для описания потока данных здесь используются два выражения. Всегда, когда происходят изменения сигналов a, b или cin, оба выражения вычисляются и сигналам sum и cout присваиваются новые значения через 15ns и 10ns, соответственно. Знак <= оператор присваивания. Выражение after 15ns означает задержку, вносимую логикой, реализующей вычисление выражения для sum. Если задержка не введена явно, то предполагается наличие бесконечно малой задержки . Такой прием позволяет упорядочить события модели dataflow. Рассмотрим схему рис. 1.7 и ее модель.
Рис. 1.7. Цепочка инверторов
entity fast_inverter is
port (a: in BIT; z: out BIT);
end fast_inverter;
architecture delta_delay of fast_inverter is
signal b,c: BIT;
begin
z <= not c; -- выражение 1
c <= not b; --выражение 2
b <= not a; --выражение 3
end delta_delay;
В выражениях 1, 2 и 3, присваивающих значения переменным z, c, b, подразумевается задержка . Например, в момент T происходит изменение сигнала a. Запускается процесс вычисления выражения 3 и через задержку переменной b будет присвоено новое значение (в момент T+). В свою очередь изменение сигнала b запустит процесс вычисления выражения 2 и значение сигнала с будет обновлено в момент T+2. Изменение сигнала с приведет к запуску процесса вычисления выражения 1 и значение сигнала z будет изменено в момент T+3. Временные соотношения в схеме иллюстрирует рис. 1.8.
Рис. 1.8. Временные соотношения в цепочке инверторов.
Рис. 1.9. Устройство местного управления
entity ctr_lck is
port (data, mr, clk, din: in BIT; rdy, ctrla:out Bit);
end ctr_lck;
architecture str_view of ctr_lck is
component AND2 -- декларируется компонент AND2
port (x,y in BIT; z: out BIT);
end component;
component DFF -- декларируется компонент DFF
port (d, clock: in BIT; Q,NOTQ: out BIT);
end component;
component NOR2 -- декларируется компонент NOR2
port (a,b: in BIT; z: out BIT);
end component;
signal s1,s2: BIT;
begin
D1: DFF port map (data, clk, s1,s2); -- выражение 1
A1: AND2 port map (s2, din, ctrla); -- выражение 2
N1: NOR2 port map (s1, mr, rdy); -- выражение 3
end str_view;
Здесь декларируются три компонента: AND2, DFF и NOR2. В тело архитектуры экземпляры компонентов вводятся с помощью выражений 1, 2 и 3. Компоненты связаны между собой сигналами s1 и s2. В декларации называется имя компонента и его интерфейс, что очень схоже с декларацией интерфейса устройства. Выражение для экземпляра компонента должно в первую очередь дать имя экземпляру или ярлык. Например, D1 - это ярлык для экземпляра триггера DFF. Далее следует список связей (association list). Он устанавливает связь между портами компонента и портами и сигналами устройства. Существует два варианта связи: позиционный и поименный. В позиционном списке первый порт декларации (слева направо) компонента соответствует первому порту экземпляра компонента (слева направо), второй - второму и так далее. Именно такой вариант списка был использован в приведенном выше примере. Вместо этого можно было использовать поименный вариант списка связей, например, выражение 3 можно было бы записать так:
N1: NOR2 port map (a=>s1, b=> mr, z=>rdy);
Рассмотрим еще пример. На рис.1.2 была приведена схема полусумматора. Его структурная модель должна предстать как набор следующих компонентов: XOR на два входа (например, 7486 или отечественный аналог ЛП5) и AND на два входа (например, 7408 или отечественный аналог ЛИ1 ).
entity half_adder is
port(a, b: in BIT; sum, cur: out BIT);
end half_adder;
architecture h_a_str of half_adder is
component a_7486
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end component;
component a_7408
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end component;
begin
X1: a_7486 port map (a, b, sum);
A1: a_7408 port map (a, b, cur);
end h_a_str;
Названия компонентов и их портов приведены такими, какими они даны в библиотеке фирмы ALTERA - известного производителя программируемых логических схем.
Декларации компонентов, использованные в архитектуре h_a_str полусумматора half_adder, можно упаковать в отдельный файл, например, maxplus2.vhd:
package maxplus2 is
component a_7486
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end component;
component a_7408
port (a_2: in BIT;
a_3: in BIT;
a_1: out BIT);
end maxplus2;
Файл maxplus2 при компиляции может быть помещен в библиотеку, например, с названием altera. Ссылка на библиотеку позволит не декларировать компоненты в архитектуре:
library altera;
use altera.maxplus2.all;
entity half_adder is
port(a, b: in BIT; sum, cur: out BIT);
end half_adder;
architecture h_a_str of half_adder is
begin
X1: a_7486 port map (a, b, sum);
A1: a_7408 port map (a, b, cur);
end h_a_str;
Рис.1.10. Одноразрядный сумматор
library altera;
use altera.maxplus2.all;
entity full_adder is
port (a, b, cin: in BIT; sum, cout: out BIT);
end full_adder;
architecture fa_mix of full_adder is
signal s1:BIT;
begin
X1: a_7486 port map (a,b,s1); --выражение 1
process (a, b, cin) --выражение 2
variable t1, t2, t3: BIT;
begin
t1:= a and b;
t2:= b and cin;
t3:= a and cin;
cout <= t1 or t2 or t3;
end process;
sum <= s1 xor cin; --выражение 3
end fa_mix;
1. Бибило П.Н. Синтез логических схем с использованием языка VHDL. М.: Солон-Р, 2002.
2. Суворова Е. А., Шейнин Ю. Е. Проектирование цифровых систем на VHDL. - СПб.: БХВ-Петербург. 2003.
! | Как писать курсовую работу Практические советы по написанию семестровых и курсовых работ. |
! | Схема написания курсовой Из каких частей состоит курсовик. С чего начать и как правильно закончить работу. |
! | Формулировка проблемы Описываем цель курсовой, что анализируем, разрабатываем, какого результата хотим добиться. |
! | План курсовой работы Нумерованным списком описывается порядок и структура будующей работы. |
! | Введение курсовой работы Что пишется в введении, какой объем вводной части? |
! | Задачи курсовой работы Правильно начинать любую работу с постановки задач, описания того что необходимо сделать. |
! | Источники информации Какими источниками следует пользоваться. Почему не стоит доверять бесплатно скачанным работа. |
! | Заключение курсовой работы Подведение итогов проведенных мероприятий, достигнута ли цель, решена ли проблема. |
! | Оригинальность текстов Каким образом можно повысить оригинальность текстов чтобы пройти проверку антиплагиатом. |
! | Оформление курсовика Требования и методические рекомендации по оформлению работы по ГОСТ. |
→ | Разновидности курсовых Какие курсовые бывают в чем их особенности и принципиальные отличия. |
→ | Отличие курсового проекта от работы Чем принципиально отличается по структуре и подходу разработка курсового проекта. |
→ | Типичные недостатки На что чаще всего обращают внимание преподаватели и какие ошибки допускают студенты. |
→ | Защита курсовой работы Как подготовиться к защите курсовой работы и как ее провести. |
→ | Доклад на защиту Как подготовить доклад чтобы он был не скучным, интересным и информативным для преподавателя. |
→ | Оценка курсовой работы Каким образом преподаватели оценивают качества подготовленного курсовика. |
Курсовая работа | Деятельность Движения Харе Кришна в свете трансформационных процессов современности |
Курсовая работа | Маркетинговая деятельность предприятия (на примере ООО СФ "Контакт Плюс") |
Курсовая работа | Политический маркетинг |
Курсовая работа | Создание и внедрение мембранного аппарата |
Курсовая работа | Социальные услуги |
Курсовая работа | Педагогические условия нравственного воспитания младших школьников |
Курсовая работа | Деятельность социального педагога по решению проблемы злоупотребления алкоголем среди школьников |
Курсовая работа | Карибский кризис |
Курсовая работа | Сахарный диабет |
Курсовая работа | Разработка оптимизированных систем аспирации процессов переработки и дробления руд в цехе среднего и мелкого дробления Стойленского ГОКа |
Курсовая работа | Управление конфликтами в организации |
Курсовая работа | Анализ эффективного использования материальных ресурсов |
Курсовая работа | Организация управления малым предприятием |
Курсовая работа | Педагогические условия организации самостоятельной работы учащихся |
Курсовая работа | Финансовое планирование на предприятии |
Курсовая работа | Банкротство (несостоятельность) юридических лиц |
Курсовая работа | Анализ производства продукции растениеводства |
Курсовая работа | Оценка производственных мощностей предприятия |
Курсовая работа | Реструктуризация предприятия |
Курсовая работа | Институциональное направление в экономике |
Курсовая работа | ОТВЕТСТВЕННОСТЬ ЗА КРАЖУ ПО УК РФ |
Курсовая работа | Анализ финансового состояния предприятия |
Курсовая работа | Стратегическое управление организацией на примере ОАО "РЖД" |
Курсовая работа | Негосударственные пенсионные фонды в РФ. Современное состояние. Перспективы развития |
Курсовая работа | Организация и развитие складского хозяйства оптового предприятия |