Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции(2013)

.pdf
Скачиваний:
12
Добавлен:
12.05.2015
Размер:
448.08 Кб
Скачать

port (d: in bit_vector (0 to w-1); q: out bit_vector (0 to w-1);…); end reg;

В данном случае размер границы вектора задается при реализации компонентов: architecture sx1 of sx is

component reg generic ( w: positive := 3) ;

port ( d: in bit_vector (0 to w-1); q : out bit_vector (0 to w-1)); end component reg;

signal x1, y1 : bit_vector (0 to 5); begin

k: reg generic map (6) port map( d=> x1, q=> y1);

………….

Таким образом, значение generic-константы можно задавать:

в entity

в описании component

в описании реализации component

Каждое следующее назначение отменяет предыдущее.

Отличие между прямой реализации интерфейса и component:

Интерфейс описывает конкретную модель устройства. Описание может быть откомпилировано и помещено в библиотеку. В каждой реализации элемента структурной модели используется прямая ссылка на интерфейс и архитектуру модели этого устройства.

Component -это виртуальный интерфейс модели, т.е. модуль, который находится в теле архитектуры структурной модели схемы. Реализации элементов в структурном описании схемы используют ссылки на этот модуль, который в дальнейшем можно связывать с разными интерфейсами и архитектурами, не внося изменений в структурное описание схемы. Для этих целей используется отдельный модуль конфигурации (configuration).

Конфигурация компонентов

Рассмотрим пример с использованием configuration:

Пусть структурная схема counter использует в качестве элементов несколько 4-х разрядных регистров, состоящих из D-триггеров.

Entity counter is

………………

End counter;

Architecture register of counter is

Component D_reg is

Port (… );

End component D_reg;

Begin

Val0: component D_reg port map (…); Val1: component D_reg port map (…);

end register;

21

Пусть в библиотеке star.lib есть описание D-триггера с 2-мя архитектурами:

Entity edge_DFF is

…………

end edge_DFF;

architecture normal of edge_DFF is

………………

end normal;

architecture basic of edge_DFF is

…………….

End basic;

Пусть в рабочей библиотеке work имеется структурное описание регистра, который использует component триггера

Entity reg4 is

…………..

end reg4;

architecture struct of reg4 is

component Flip_Flop is port (… );

end component Flip_Flop; begin

bit0: Flip_Flop port map (… ); bit1: Flip_Flop port map (… );

……….

End struct;

Таким образом, Counter использует регистр, а регистр использует триггер. Теперь необходимо настроить компоненты структурных моделей, т.е. связать их с конкретными моделями элементов.

Library star.lib;

Параллельная конфигурация

 

Use star.lib. edge_DFF;

 

Configuration full of counter is

 

For register

-- архитектура counter

For all: D_reg

-- component counter

Use entity work.reg4(struct);

 

For struct

-- архитектура reg4

For bit0: Flip_Flop

--component reg4

Use entity edge_DFF(normal);

 

End for;

 

For others: Flip_Flop

 

Use entity edge_DFF (basic);

 

End for;

 

End for;

-- для struct

End for;

-- для D_reg

…………………………….

 

(при необходимости связывание других копий компонентов внутри register)

22

End for;

-- для register

End configuration full;

 

Другим способом конфигурации может быть последовательная конфигурация как более наглядная:

Последовательная конфигурация:

Library star.lib;

Use star.lib. edge_DFF;

Configuration reg4_gate of reg4 is

For struct

-- архитектура reg4

For bit0 : Flip_Flop

 

Use entity edge_DFF (normal);

End for;

 

For others: Flip_Flop

 

Use entity edge_DFF (basic);

 

End for;

 

End for;

--конец struct

End configuration reg4_gate;

 

Configuration cou_down of counter is

For register

-- архитектура counter

For all: D_reg

Use configuration work.reg4_gate; End for;

. . . . . . . . . . . . .

--связывание других копий компонентов внутри register (если нужно)

end for;

--конец архитектуры register

end configuration cou_down;

 

Правила связывания компонентов

Если для экземпляра компонента нет конфигурации, то применяется связывание по умолчанию: выбирается подсхема, которая имеет имена: entity, port(), и generic констант аналогичные тем, которые указаны в описании компонента (пример сдвигового регистра на рис.6).

Если к интерфейсу может относиться несколько архитектур, то будет использована последняя из откомпилированных. Чаще всего инструменты автоматического синтеза схем не поддерживают конструкцию конфигурации и требуют связывания по умолчанию.

Алгоритмическое описание модели схемы

Для описания функционирования схемы в виде алгоритма, наиболее удобным в языке VHDL является параллельный оператор process, внутри которого расположены последовательные операторы структурного программирования.

Общая форма записи:

[имя_процесса:] process [(список чувствительных входов)]

область объявления констант и переменных

23

begin

wait условие -- оператор ожидания возобновления процесса

последовательные операторы

wait условие

последовательные операторы

. . . . . . . . . . . . . . . . .

end process [имя_процесса:]

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

wait оператор

Существует несколько форм wait оператора:

1.wait for time

Примеры: wait for 10 ns;

wait for clk_Period (2);

2.wait until<условие>

Примеры:

wait until clk=’1’;

wait until CE and (not R);

3.wait on<событие>

Примеры: wait on clk;

wait on R, S, Data;

Следует обратить внимание на то, что форма until эквивалентна некоторому циклу с использованием формы on :

 

 

loop

wait until El =‘1’;

равносильно

wait on El;

 

 

exit when El = 1;

 

 

end loop;

Т.е. сначала ожидается изменение сигналов-аргументов условия, а потом проверяется выполнение условия.

4.Комплексный wait оператор: Пример:

Wait on A, B until (C=’0’) for 50 ns;

24

Оператор приостанавливает процесс до момента изменения А или В, после будет проверено С=0 и если результат проверки будет истинным процесс возобновится, но независимо от этих условий возобновление процесса произойдет через 50 ns.

5. Не явная форма wait оператора:

 

Process (A, B, C)

 

process

begin

равносильно

begin

последовательные операторы

последовательные операторы

end process;

 

wait on A, B, C;

 

 

end process;

Данный процесс запускается при изменении одной из переменных списка чувствительных входов А, В или С, но первый раз процесс выполняется, безусловно.

Здесь стоит сделать некоторое отступление. Поскольку моделирование с использованием языка VHDL использует событийных алгоритм, то запуск любого параллельного оператора происходит только при наличии события. В нулевой момент модельного времени сигналы на входах схемы не меняются, и поскольку события отсутствуют, процессы на них реагировать не будут. Для установления модели в начальное состояние в соответствии со значениями входных сигналов и предназначена форма со списком чувствительных входов. Однако это является некоторой абстракцией, особенно для последовательностных схем, которые имеют внутреннюю память. Для установки таких схем в начальное состояние обычно предусматриваются специальные входы и режимы работы схемы. Очевидно, что модель со списком чувствительных входов не позволяет проверить правильность проекта в этой части. Более адекватную модель можно создать, если использовать форму оператора wait on после begin и многозначную логику, а конкретные значения сигналов на входах схемы начинать задавать с символической задержкой в несколько ps. Тогда изменения значений сигналов из начальной неопределенности “U”(по умолчанию) в новые (после задержки) будут порождать события, и процессы активизируются.

Изменение сигналов внутри процесса происходит при использовании оператора присваивания: А<= выражение. Однако, как отмечалось ранее, сигнал изменит свое значение только после того, как процесс перейдет в режим ожидания выполнения очередного wait - условия. Внутри процесса сигналы значений не меняют в отличие от переменных. Поэтому для вычисления промежуточных значений выражений лучше пользоваться переменными, объявленными в процессе, а конечный результат присваивать сигналам.

Пример: Пусть значения сигналов A, B, C, D и E изначально были равны «1», в момент времени t = 2ns сигнал D изменил свое значение на 2, запустился процесс VS.

VS: process (D, C)

variable AV, BV, EV: integer : = 0;

begin

 

A<=D+1;

A=1

AV: = 2;

AV=2

BV: = D+2;

BV=4

EV: = AV*2;

EV=4

A<=AV;

A=1

B<=BV;

B=1

E<=EV;

E=1

end process VS;

 

25

После выполнения всех операторов и достижении конца процесса, выполнение снова передается на его начало, и процесс переходит в режим ожидания изменения значений переменных из списка чувствительных входов (D,C). Только после этого сигналам будут присвоены новые значения: А=2, В=4, Е=4.

При многократном присваивании значений сигналу, результат будет определяться последним из них. Поэтому операция A<=D+l просто игнорируется.

Последовательные операторы

Условный оператор if

Используется несколько форм оператора:

1)if <условие> then <оператор>; …<оператор>; end if; Пример:

DFF: process (D, Cl) begin

if rising_edge (Cl) then Q<=D; nQ<= not (D);

end if; end process DFF;

2)if<условие> then <оператор>; … <оператор>; else <оператор>; …<оператор>;end if;

Пример:

if x=’1’ and y=’1’ then z<=’1’; else z<=’0’; end if

3)if <условие> then <оператор>; ...<оператор>; elseif <условие> then <оператор>;…<оператор>; [else <оператор>; …<оператор>;] end if;

if code = ‘1’ then F:=OP1+OP2;

elseif code1=’1’ then F:= OP1-OP2; else F:=”0000”;

end if;

Оператор case

Пример:

Pr: process (Mode, Pr, Pr1) begin

case Mode is:

when “000” => Pr<=Pr+Pr1;…..; when ”001” => Pr<=Pr-Pr1;…..; when ”101” => Pr<=Pr or Pr1;…..; when others => Pr<=’0’;

end case; end process;

Оператор цикла loop

Используется несколько форм оператора: 1) без итерационный цикл

Пример:

L1: loop cl<= not cl after 50ns; --генерируется периодический сигнал

26

end loop L1;

2) цикл с внутренней итерационной переменной

Примеры:

 

L2: for i in 0 to 9 loop

-- (переменную i явно объявлять не нужно)

exit L2 when A ( i ) >20;

--выход за пределы цикла

next when A ( i ) >10;

--выход на конец цикла

sum := sum A( i );

 

end loop L2;

 

кроме EXIT и NEXT существует еще один оператор NULL, который не выполняет никаких действий (его удобно использовать для наглядности в ветвях if-операторов и циклах).

Примеры использования смысловых констант для обозначения количества итераций: subtype Range1 is positive range 1 to 8;

…………….

L5: for cou in Range1 loop

…………….

const MSB : natural := 7;

subtype BusRange is natural range MSB downto 0;

…………….

for k in BusRange loop

…………….

3) цикл с внешней итерационной переменной Иногда в качестве переменной цикла удобно использовать смысловую переменную, которую

можно использовать за пределами цикла: Пример:

Sh3: process (in1) Variable i: positive: =1; Begin

L3: while i <=8 loop

Out ( i ) <=in1 (i+8) after 5ns; i= i+1;

end loop L3; Out_C<=i; end process;

Алгоритм событийного моделирования

Алгоритмы логического моделирования схем делятся на итерационные и событийные. Недостаток итерационных алгоритмов в большом количестве вычислений, которое резко

возрастет с увеличением объема моделируемых схем.

В событийных алгоритмах учитываются свойства цифровых схем изменять состояние только тех элементов схемы, сигналы на входах которых изменили свои логические значения. Пассивные элементы не оказывают влияния на работу схемы. При событийном моделировании еще одним допущением, справедливым для цифровых схем, считается однонаправленность элементов (выход не воздействует на вход).

Мы будем рассматривать событийный алгоритм применительно к его реализации в языке VHDL.

27

Каждый параллельный оператор имеет список чувствительных входов - перечень тех входов, при изменении значения сигнала на любом из которых, выходные сигналы данного оператора могут изменить свои значения. Потому всякий раз, когда переменные из списка чувствительных входов данного оператора изменяют свои значения, уравнения оператора необходимо пересчитывать. Каждый сигнал имеет список связей (разветвлений) по выходам, т.е. перечень параллельных операторов, которые имеют данный сигнал в своем списке чувствительных входов. В языке VHDL используются два типа событий:

1)события, связанные с изменением значений сигналов;

2)события, связанные с необходимостью вычисления параллельных операторов. События привязываются к моментам времени. Моделирование начинается всегда с

момента t=0. В Std_logic всем сигналам при t=0 присваиваются значения U, а в bit – значение

0.

Обязательным элементом событийного алгоритма есть временная очередь событий. Как правило, сейчас используются списки событий(СС) динамические с переменным шагом. Списки упорядочиваются по возрастанию модельного времени. В начальный момент список пустой, потом в него могут добавляться или удаляться события.

Процесс моделирования можно представить следующим образцом:

Тм -текущее модельное время Сi-событие

СС-список событий

While (есть Сi в СС)

{

if (нет Сi для Тм ) then Tм=Tсi (min из СС)

Извлечь из СС все Сi для Тм

Для каждого Сi в любом порядке { If Сi -значение {

Update значение сигнала;

28

По списку разветвления сигнала сформировать Сi -вычисления для всех операторов и поместить их в СС}

Else {-- Сi вычисление Вычислить оператор;

Поместить в СС Сiзначения для выходных сигналов }

}} }

Пример:

10B0: entity work.Mod port map (A=>q1, B=>q2, C=>D);

…………..

entity Mod is

port (A, B: in bit; C: out bit); end Mod;

Architecture ModA of Mod is signal E, K: bit:=’1’;

begin

11C<=E+B after 5ns;

12E<=A*2 after 5ns;

13K<=E+2 after 5ns; end ModA;

В этом фрагменте есть 4 параллельных оператора : 10,11,12,13. Оператор 10 содержит в своем списке чувствительных входов все сигналы из списка сопоставлений (A, q1, B, q2, C, D), оператор 11 – сигналы E и B, 12 – сигнал А, 13 – сигнал Е. Пусть t1 стало текущим временем моделирования и в этот момент изменилось значение q1, тогда

1)В списке разветвлений переменной q1 есть оператор 10-реализации экземпляра элемента. Создается вычислительное событие для оператора 10 и момента t1 и помещается в СС (список событий);

2)Из СС извлекается только что записанное событие. Выполняется оператор 10. В результате выполнения этого оператора изменится сигнал А. Создается событиеизменение для В0.А в момент t1 и помещается в СС;

3)Из СС извлекаем событие-изменение сигнала В0.А. В его списке разветвлений есть оператор 12 модуля Mod. Для оператора 12 создается вычислительное событие в момент t1;

4)Из СС извлекается событие для оператора 12, оператор вычисляется, сигнал В0.Е изменяется, для сигнала В0.Е создается событие-изменение в момент t2, t2=t1+5ns и помещается в СС ;

5)Для t1 в СС событий больше нет. Тм становится равным минимальному времени из СС, т.е t2;

6)В дальнейшем меняется сигнал В0.Е, в CC из его списка разветвлений ставятся вычислительные события для операторов 11 и 13. Вычисляются 11 и 13, в СС ставятся события-изменения для В0.С и В0.К, для t3=t2+5ns;

7)В момент t3 изменится сигналы В0.С и В0.К. Сигнал В0.С содержит в своем списке разветвлений оператор 10. Это приведет к активизации оператора 10, в результате выполнения которого изменится сигнал D. (С=>D) и т.д.

Параллельный оператор процесса имеет в реализации алгоритма некоторые особенности. У процесса список чувствительных входов во время моделирования может изменяться, а точка входа в процесс может динамически помещаться или удаляться из списков разветвления сигналов.

29

Пример содержит описание 2-х разрядного сдвигового регистра с двухфазной синхронизацией. По переднему фронту сигнала ph1 переключается нечетный разряд регистра, по переднему фронту ph2 переключается четный разряд. В примере используется некоторая функция rising_edge(Х) – определения переднего фронта сигнала Х.

А:Process

1wait on rising_edge (ph1);

2Q0 <=D;

3wait on rising_edge (ph2);

4Q<=Q0;

end process;

При первой активизации процесса А в список его чувствительных входов помещается сигнал ph1, так как он присутствует в первом wait-операторе, а в список связей сигнала ph1 добавляется точка входа 1 в процесс А.

Если ph1 изменится в результате выполнения других процессов, то в СС будет помещено вычислительное событие для процесса А (оператор 1). Если условие 1 будет удовлетворено, то из списка чувствительных входов процесса удалится сигнал ph1, а из списка связей сигнала ph1 - точка входа 1 в процесс А. Затем выполнится оператор 2 и оператор 3. С появлением следующего wait-оператора в список чувствительных входов процесса включается сигнал ph2, а в список связей ph2 добавится точка входа 3 в процесс А. Теперь при изменении значения сигнала ph2 будет проверяться условие 3. Если условие не удовлетворяется , тогда точка 3 будет оставаться в списке разветвлений ph2, а переменная ph2 оставаться в списке чувствительных входов процесса. Если условие удовлетворится - будет выполняться оператор 4, а затем выполнение снова перейдет на оператор 1. В списке чувствительных входов процесса снова появится ph1, из списка разветвлений ph2 точка входа 3 в процесс А будет удалена, а точка входа 1 будет добавлена в список связей ph1.

Оператор сообщения assert <условие>

[report<выражение типа string>] [severity <ключевое слово>]

ключевое слово := note, warning, error, failure….

Если условие не выполняется false, тогда выполняется оператор report и severity. В операторе report пишется словесная строка сообщения, а в severity степень серьезности ошибки. Оператор assert может быть последовательным, если он применяется в теле процесса, а может быть параллельным, если он используется как один из элементов структурного описания схемы.

Атрибуты сигналов

Различают следующие виды сигналов: скалярные и агрегированные: векторы и массивы. Сигналы имеют ряд предопределенных атрибутов. Кроме того, список атрибутов может быть расширен пользователем.

Общая форма записи: <имя сигнала> ‘<атрибут>

Рассмотрим наиболее распространенные атрибуты:

Временные атрибуты сигнала

1)s’event - будет истинно, если событие-изменение произошло на текущей итерации для текущего модельного времени;

2)s’transaction – параметр типа bit, в начальный момент модельного времени принимает значение 0, и каждый раз меняет значение на противоположное в те моменты

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]