fb_210700_ddm1_lbm2
.pdfОписание процесса, построенное по данной схеме, называют также опера- тором процесса. Он определяет поведение (процесс функционирования) неко- торой части проектируемого устройства, описанное совокупностью включен- ных в данный оператор последовательных операторов.
Имя процесса (метка процесса) необязательно, но если оно есть в конце (после слов end process), то должно быть и в начале (перед словом process).
При описании оператором процесса нетактируемой (асинхронной) части устройства в список чувствительностей включаются все ее входные сигналы. В случае тактируемой (синхронной) части устройства в указанный список вклю- чаются только сигнал тактирования и входные сигналы асинхронного управле- ния, т. е. те, которые способны влиять на состояние описываемой части устрой- ства независимо от действия (или отсутствия) тактирующих импульсов.
В декларативной части процесса могут быть декларации типов, констант, переменных и др. Сигналы не могут быть декларированы внутри оператора процесса.
Примером использования оператора процесса является следующее описа- ние объекта (рис. 12):
entity ANDOR is
port (e0,e1,e2 : in bit; z : out bit);
end ANDOR;
architecture RTL1 of ANDOR is signal f : bit;
begin
a0 : process (e0,e1) begin
f <= not (e0 and e1); end process a0;
a1 : process (f, e2) variable y : bit;
begin
y := f or e2; z <= y;
end process a1; end RTL1;
Внутри оператора процесса с меткой a0 декларативная часть отсутствует. Аналогично мог бы быть составлен оператор процесса a1. Однако, в приведен- ном VHDL-тексте он составлен в таком варианте, который содержит деклара- тивную часть.
Операторы процесса можно использовать для описания тех частей устрой- ства (каждая из них описывается отдельным оператором процесса), которые должны функционировать одновременно (параллельно), например, для повы-
21
шения быстродействия устройства. Часто оператор процесса используется для описания "единственной части" устройства, так как оно может использоваться в качестве одной из составных частей другого устройства.
6.9.Последовательные операторы
ВVHDL последовательные операторы подобны операторам языков высо- кого уровня. Они могут использоваться внутри параллельных операторов или самостоятельно (без параллельных операторов) внутри тела архитектуры.
6.9.1.Оператор присваивания значения переменной
Оператор присваивания значения переменной ":=" используется для заме- ны текущего значения переменной новым значением. Такая замена осуществ-
ляется по схеме:
имя_переменной := новое_значение_переменной;
Разумеется, такой строке должна предшествовать декларация переменной. В качестве нового значения может выступать число, запись логического преоб- разования или какое-либо иное выражение. В 6.5. приведены как примеры дек- ларации переменных, так и примеры использования рассматриваемого операто- ра присваивания. Один из этих примеров показывает, что присваивание значе- ний переменной может осуществляться непосредственно при ее декларации.
Отметим, что переменные в языке VHDL является локальными. Это озна- чает, в частности, что если какая-либо переменная продекларирована, напри- мер, внутри описания определенного процесса, то при ее использовании под тем же именем внутри описании другого процесса или в ином месте тела архи- тектуры она будет восприниматься компилятором как новая переменная и по- этому должна заново декларироваться.
6.9.2. Присваивание значений сигналам (назначение сигналов)
Оператор присваивания значения сигналу “<=” используется (после декла- рации сигнала) в следующей схеме:
имя_сигнала <= значение_сигнала;
Как и для переменной, значением сигнала может быть число, запись логи- ческого преобразования или какое-либо иное выражение. Некоторые примеры использования данного оператора приведены в 6.2 и 6.8. В качестве дополни-
тельных примеров приведем следующие:
...
signal z_bus : bit_vector (3 downto 0); signal c_bus : bit_vector (0 to 4);
...
z_bus (3 downto 2) <= "00";
c_bus (1 to 2) <= z_bus (3 downto 2);
...
22
Сигналы и переменные одного и того же типа могут быть присвоены друг другу (см. пример в 6.8).
6.9.3. Оператор "если" (if)
Оператор if языка VHDL подобен операторам if в других языках про- граммирования. Рассмотрим лишь тот случай, когда данный оператор размеща- ется внутри оператора процесса. В этом случае для оператора if используется
следующая схема:
if (условие) then
...; -- операторы elsif (условие) then
...; -- операторы else
...; -- операторы end if;
Выражение условия имеет тип BOOLEAN. Переход к операторам, записан- ным после некоторого условия, осуществляется, если это условие выполняется (имеет значение TRUE). В указанном случае реализуется также переход от дан- ных операторов к строке end if (игнорируются иные предшествующие ей операторы). В одном операторе if может быть одна (ни одной) либо более час- тей elsif. Ключевое слово elsif следует отличать от слов else if. Часть else может быть только одна (или ни одной). Переход к операторам, записан- ным в этой части, осуществляется, если ни одно из записанных выше (после оператора if) условий не выполняется.
Объект (рис. 12) при использовании оператора if можно описать следую-
щим образом:
entity ANDOR is
port (e0,e1,e2 : in bit; z : out bit);
end ANDOR;
architecture RTL1 of ANDOR is begin
process (e0,e1,e2) begin
if ((e0 and e1) = '0') then z <= '1';
elsif (e2 = '0') then z <= '0';
else
z <= '1'; end if;
end process; end RTL1;
23
6.9.4. Оператор "случай" (case)
Оператор case выбирает одну из альтернатив и используется внутри опе-
ратора процесса в соответствии со следующей схемой: case выражение is
when выбор 1 => операторы;
...
when выбор N => операторы; when others => операторы;
end case;
Тип выражения может быть любым. Выбираемая альтернатива (случай) определяется значением выражения. При этом записывается несколько вариан- тов значений выражения. В приведенной схеме такие варианты обозначены как "выбор 1", ... , "выбор N ". Если упомянутое выражение принимает значение "выбор n " ( n =1, ..., N ), то осуществляется переход к операторам, записан-
ным в соответствующей строке схемы. Операторы, записанные в строке с клю- чевыми словами when others, выполняются, если выражение не принимает ни одной из значений: "выбор 1", ... , "выбор N ". Эти значения должны быть того же типа, что и выражение.
Объект (рис. 12) при использовании оператора case можно описать сле-
дующим образом:
entity ANDOR is
port (e0,e1,e2 : in bit; z : out bit);
end ANDOR;
architecture RTL1 of ANDOR is begin
process (e0,e1,e2) begin
case e0 and e1 is
when '0' => z <= '1'; when '1' =>
if (e2 = '1') then z <= '1';
else
z <= '0'; end if;
end case; end process;
end RTL1;
24
6.9.5. Оператор "компонент" (component)
Оператор component употребляется, для того чтобы использовать ранее созданные проекты в составе нового проекта. Употребление данного оператора
осуществляется в соответствии со схемой:
сomponent имя_компонента1
port (карта-список портов с указанием их типов); end component;
Пример использования данного оператора приведен в 6.2, где, в частности,
обращается внимание на требования к записи имени компонента и его портов при декларации, а также на необязательность использования меток.
...; -- |
аналогичная декларация других компонентов |
-- |
и их портов |
...; -- |
декларация сигналов, переменных и констант |
begin |
операторы |
...; -- |
|
метка_1 |
: имя_компонента1 port map (новая карта портов); |
...; -- |
операторы |
метка_2 |
: имя_компонента2 port map (новая карта портов); |
...; -- |
операторы |
7.Задание на проектирование и порядок его выполнения
7.1.Общая формулировка задания и его варианты
Вкачестве задания к данной лабораторной работе предлагается проекти- рование генератора сигнала в виде отрезка псевдослучайной последовательно- сти (ПСП). ПСП представляет собой последовательность элементов di (i – но-
мер элемента, являющийся целым числом), повторяющихся с периодом N , т. е. di+ N = di . Каждый из элементов может принимать одно из двух значений: + 1
или − 1. При выполнении данной лабораторной работы должны быть созданы два проекта генератора, формирующего отрезок ПСП, длина которого совпада- ет с периодом N = 7 . Чтобы записать такой отрезок ПСП, необходимо задать первые 3 элемента последовательности (d1, d2 , d3) согласно номеру варианта
задания и табл. 6, а другие 4 элемента определить по следующим рекуррентным
соотношениям:
di = -di−3 × di−2 |
– для вариантов 1-7; |
di = -di−3 × di−1 |
– для вариантов 8-14. |
Упомянутые два проекта генератора должны быть следующими. |
Первый проект выполняется с помощью текстового редактора САПР Quartus II по аналогии с проектированием такого же генератора средствами графического редактора, рассмотренным в [2]. Т. е. генератор составляется из двух частей (компонентов): блока (счетчика) COUNTER2 и комбинационного преобразователя кодов. При этом указанные два компонента необходимо
25
|
|
|
Таблица 6 |
№ варианта |
d1, d2 , d3 |
№ варианта |
d1, d2 , d3 |
задания: |
|
задания: |
|
1 |
–1,–1,+1 |
8 |
–1,–1,+1 |
2 |
–1,+1,–1 |
9 |
–1,+1,+1 |
3 |
+1,–1,+1 |
10 |
+1,+1,+1 |
4 |
–1,+1,+1 |
11 |
+1,+1,–1 |
5 |
+1,+1,+1 |
12 |
+1,–1,+1 |
6 |
+1,+1,–1 |
13 |
–1,+1,–1 |
7 |
+1,–1,–1 |
14 |
+1,–1,–1 |
описать на поведенческом уровне (присваивая первому из них новое имя COUNTER2, а второму – KCC) и объединить средствами VHDL. Упомянутое объединение компонентов означает использование в проекте структурного опи- сания объекта. Структуру объекта при таком проектировании графически мож- но представить так, как показано на рис. 14. Здесь два компонента связаны ме- жду собой 3-разрядной (образованной тремя линиями-проводами) шиной, а вы- ходные сигналы действуют на 4-разрядной шине OUTG .
|
|
COUNTER2 |
|
KCC |
|
|
START |
|
START |
3 |
|
4 |
|
|
|
|||||
|
|
COUNT |
|
COUNT OUTG |
|
OUTG |
|
|
|
|
|||
CLK |
|
CLK |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
Рис. 14
Компонент COUNTER2 должен функционировать как 3-разрядный дво- ичный счетчик тактовых импульсов, поступающих на счетный вход CLK (ко- эффициент счета – 8). Срабатывание по фронтам положительных перепадов
CLK при условии формирования соответствующего сигнала на входе запуска START. Исходным должно быть нулевое состояние счетчика (параллельный код 000 на выходной 3-разрядной шине). При этом счетчик готов к реакции на сигнал START (в иных состояниях сигнал START не оказывает влияния на работу счетчика). Для начала счета и последовательного изменения выходных сигналов счетчика на вход START подается уровень логической единицы, ко-
торый должен сохраняться хотя бы до завершения формирования переднего фронта одного положительного импульса CLK . Тогда с этого импульса начи- нается счет. Результат счета (количество импульсов, поступивших на вход CLK ) отражается параллельным двоичным кодом на выходной 3-разрядной шине COUNT. После 7-го тактового импульса с момента начала счета на ней появится число 7 в двоичном коде 111. Следующим (8-м) тактовым импульсом счетчик сбрасывается в исходное нулевое состояние 000. Если в это время на входе START действует уровень логической единицы, то счет повторяется. В
26
противном случае счет прекращается, т. е. счетчик остается в нулевом состоя- нии до следующего импульса START.
В результате формирование сигнала START = 1 необходимой длительно- сти (от 1 до 8 периодов повторения импульсов CLK , например, 2 периода) по-
зволяет реализовать однократную последовательную смену восьми состояний счетчика (двоичных чисел на шине COUNT) от 000 до 111 с последующим возвратом в состояние 000. Семь из них (от 001 до 111) являются порядковыми номерами элементов отрезка ПСП (элементов сигнала) и должны обеспечить формирование этих элементов. Т. е. в упомянутых семи состояниях должен ге- нерироваться сигнал, принимающий значения + 1 или − 1 (параллельные до- полнительные коды 0001 или 1111 соответственно), а вне временного интерва- ла генерации сигнала (в состоянии 000 счетчика) проектируемый генератор должен формировать дополнительный код нуля ( 0000). Такое преобразование кодов, появляющихся на шине COUNT, в указанные дополнительные коды должен осуществлять компонент KCC (рис. 14).
Второй проект генератора должен выполняться с использованием только поведенческого описания объекта. При этом генератор необходимо описать на языке VHDL как автомат с памятью, соответствующий диаграмме состояний (рис. 15). На этой диаграмме CLK =1 соответствует формированию фронта по-
ложительного тактового импульса. |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Началь-е |
CLK×START |
Дополни- |
CLK |
Дополни- |
|||
|
|
|
|
сост-е |
|
|
|
тельный |
|
тельный |
|
|
|
|
(0000) |
|
|
|
код d1 |
|
код d2 |
|
CLK |
START |
CLK |
|
|
|
|
|
CLK |
|
|
|
|
Дополни- |
|
|
|
|
|
Дополни- |
|
|
|
|
|
тельный |
|
|
|
|
|
тельный |
|
|
|
|
код d7 |
|
|
|
|
|
код d3 |
|
|
|
|
CLK |
|
|
|
|
|
CLK |
|
|
|
Дополни- |
|
|
|
Дополни- |
CLK |
Дополни- |
|
|
|
|
|
CLK |
||||||
|
|
|
|
тельный |
|
|
|
тельный |
|
тельный |
|
|
|
|
код d6 |
|
|
|
код d 5 |
|
код d4 |
Рис. 15
7.2. Методика составления VHDL-описаний проектируемых устройств
Составление VHDL-описаний проектируемых генераторов поясним на примерах. При этом для простоты рассмотрим тот случай, когда требуется
27
спроектировать генератор сигнала, составленного не из семи, а из трех элемен-
тов: d1 = +1, d2 = +1, d3 = −1.
7.2.1.VHDL-описание генератора для первого проекта
Вслучае 3-элементного сигнала можно провести рассуждения о структуре генератора и функционировании двух его компонентов по аналогии с 7.1. При этом убедимся, что компонент COUNTER2 должен будет иметь двухразряд- ную выходную шину COUNT. Тогда в результате формирования сигнала START = 1 необходимой длительности (от 1 до 4 периодов повторения им- пульсов CLK , например, 2 периода) должна происходить однократная после- довательная смена четырех кодов на шине COUNT от 00 до 11 с последую- щим возвратом в состояние 00. С учетом этого VHDL-описание (при поведен- ческом подходе к нему) компонента COUNTER2 может быть составлено в
следующем виде: entity counter2 is
--декларация 2-разрядной выходной шины COUNT путем
--указания пределов возможных изменений (от 0 до 3)
--данных типа NATURAL
port (start, clk : in bit;
count : out natural range 0 to 3); end counter2;
architecture example of counter2 is begin
process (clk)
--в связи с тем, что внутри оператора процесса
--не могут декларироваться сигналы (см. 6.8), вводится
--вспомогательная переменная - аналог состояния
--выходной шины COUNT
variable number : natural range 0 to 3;
--переменная, единичное значение которой будет
--использоваться как признак появления сигнала START variable push : bit;
begin
if (clk'event and clk = '1') then -- строка с записью
--условия формирования фронта положительного
--тактового импульса
if (start = '1') then push := '1';
end if;
if (push = '1') then number := number + 1;
else
number := 0; -- сброс (обнуление) счетчика
28
end if;
if (number = 3) then push := '0';
end if; end if;
count <= number; end process;
end example;
Описание компонента KCC составим с учетом того, что в случае 3-
элементного сигнала данный компонент должен осуществлять преобразование двоичных кодов 01, 10, 11 соответственно в четырехразрядные дополнитель- ные коды значений элементов d1 = +1, d2 = +1, d3 = −1, т. е. в параллельные
коды 0001, 0001, 1111. Код 00 должен преобразовываться в дополнительный код 0000 числа 0. VHDL-текст с таким поведенческим описанием может иметь
следующий вид: entity kcc is
port (count : in natural range 0 to 3; outg : out integer range –8 to +7);
end kcc;
architecture ind of kcc is begin
process (count) begin
case count is
when 0 => outg <= 0; when 1 => outg <= +1; when 2 => outg <= +1; when 3 => outg <= –1;
end case; end process;
end ind;
VHDL-текст со структурным описанием объединения компонентов COUNTER2 и KCC согласно рис. 14 (при 2-разрядной шине COUNT) можно
представить в виде entity generator2 is
port (start, clk : in bit;
outg : out integer range –8 to +7); end generator2;
architecture exe of generator2 is component counter2
port (start, clk : in bit;
count : out natural range 0 to 3); end component;
component kcc
29
port (count : in natural range 0 to 3; outg : out integer range –8 to +7);
end component;
signal F : natural range 0 to 3; begin
a0 : counter2 port map (start, clk, F);
a1 : kcc port map (F, outg); end exe;
Напомним, что описанием генератора, соответствующего первому проек- ту, является совокупность трех последних VHDL-текстов.
7.2.2.VHDLописание генератора для второго проекта
Вслучае 3-элементного сигнала в диаграмме, аналогичной рис. 15, будут
отсутствовать состояния, соответствующие дополнительным кодам d4 , d5, d6 , d7 . При этом VHDL-текст с поведенческим описанием генератора можно
составить в следующем виде: entity generator3 is
port (start, clk : in bit;
outg : out integer range –8 to +7); end generator3;
architecture example of generator3 is begin
process (clk)
--декларация 2-битной переменной, которая вводится в
--связи с совпадением значений (+1 или –1) отдельных
--элементов генерируемого сигнала и моделирует
--некоторый 2-разрядный счетчик номеров четырех
--состояний выходной шины генератора
variable count : natural range 0 to 3 := 0; variable result : integer range –8 to +7 := 0; variable push : bit := '0';
begin
if (clk'event and clk = '1') then if (start = '1') then
push := '1'; end if;
if (push = '1') then count := count + 1;
else
count := 0; end if;
case count is
when 0 => result := 0;
30