АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Лекция 6

Читайте также:
  1. Вводная лекция.
  2. Вторая лекция. Расширяющаяся Вселенная
  3. ВычМат лекция 3. (17.09.12)
  4. Генетическая инженерия и генетическая селекция растений.
  5. Естествознание как отрасль научного познания. Классификация наук. (плюс то, что у вас в лекциях)
  6. И сразу наконец лекция здесь начинается
  7. Латинская Америка. Лекция от 12.10.
  8. Лекция . Конструирование гражданских зданий из крупных блоков.
  9. Лекция 02.10.2013. Основные технические документы, предъявляемые на государственные и контрольные испытания
  10. Лекция 08.10.2013. Технические условия (ТУ).
  11. Лекция 1
  12. Лекция 1

Структуризация описания

Позволяет улучшить понимание программы а также обеспечивает возможности многократного использования уже разработанных и отлаженных узлов. (в том числе библиотечных)

 

Возможности, которые предоставляет VHDL для структуризации программ

-оператор процесса

-оператор блока

-декларация и вызов подпрограмм

- оператор вхождения компонента

- генерации

 

Оператор блока – объединяет совокупность параллельных операторов с целью их выделения в тексте как подсхемы. С тоски зрения правил исполнения нет разницы между размещением параллельного оператора в блоке или вне его.

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

 

оператор блока>::=

<метка блока>: BLOCK [ (охранное выражение) ] [ IS ]

[ <раздел деклараций блока> ]

BEGIN

<раздел операторов блока>

END BLOCK [ <метка блока>];

Select_byte: BLOCK (select='1' and read='1') IS

BEGIN dbus<= reg(7 downto 0) WHEN QUARD and byte_sel="00" else

reg(15 downto 0) WHEN QUARD and byte_sel="01" else

reg(23 downto 16) WHEN QUARD and byte_sel ="10" else

reg(31 downto 24) WHEN QUARD and byte_sel ="11" else

"ZZZZZZZZ";

Process(reg,byte_sel,quard)

If quard -- =true

then

Case byte_sel is

When “00”=> dbus1<=reg1(7 downto 0);

….

End case;

End if;

End process;

END BLOCK select_byte;

BLOCK (select=’1’ and read='1')

SIGNAL data1: Std_logic_vector (N_-1 downto 0);

BEGIN

Data_bus<=QUARDED data1 AFTER <выражение задержки> when byte_sel="01" else ….

PROCESS BEGIN <Вычисление data1>

END PROCESS;

PROCESS BEGIN <Вычисление data2>

END PROCESS;

….

END BLOCK;

Программа допускает многократный вызов.

<тело подпрограммы>::=

<спецификация подпрограммы> IS

<раздел деклараций подпрограммы>

BEGIN

«<последовательный оператор>»

END [ PROCEDURE | FUNCTION ] <имя подпрограммы>;

<спецификация подпрограммы>::=

PROCEDURE <имя подпрограммы> [ (<интерфейсный список>) ]

| FUNCTION <имя подпрограммы> [ (<интерфейсный список>) ]

RETURN <тип>

<интерфейсный список>::=

<Элемент интерфейсного списка> «;<Элемент интерфейсного списка>»

<Элемент интерфейсного списка>::=

[ CONSTANT | VARIABLE | SIGNAL ]

<формальный параметр> «,<формальный параметр>»

:<направление> <тип> [:=<константное выражение> ]

Функция возвращает единственное значение через имя функции, процедура – сколько угодно через элемент интерфейсного списка, объявленного как OUT или INOUT

Вызов подпрограммы м ожжет быть параллельным и последовательным в зависимости от локализации вызова. Правила исполнения такие же как для любых последовательных и параллельных операторов.

<вызов подпрограммы>::=

<имя подпрограммы>[ <список соответствий> ]

<список соответствий>::=

([ <Формальный параметр>] =><фактический параметр>

«,[ <Формальный параметр> ] => <фактический параметр>»)

<фактический параметр>::=

<выражение> | <константа> | <имя сигнала> | <имя переменной> |

<вызов функции

 

ARCHITECTURE add_examples OF somethin IS

PROCEDURE add_SUBB

(signal a,b:IN integer;

signal Operation: in std_logic; -- '0' –add '1' — subb

signal Result: out integer) IS

BEGIN IF operation='0' THEN result<= a+b;

ELSE result<=a-b;

END IF;

END add_subb;

BEGIN

First: add_subb(x1,y1,controle,z1);

Second: add_subb(a=>x1,b=>y1, result=>z2, operation=>controle);

Third: PROCESS (x2,y2, controle)

BEGIN IF controle='0' THEN z3<= x2+y2;

ELSE z3<=x2-y2;

END IF;

END PROCESS;

fourth: PROCESS (controle)

BEGIN --.... <дополнительные операторы>

add_subb(x3,y3,controle, z4);

END PROCESS;

END add_examples;

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

If x=’0’ then z<=f(x1,x2);

ELse z<=f(x1,x3);

End if;

 

Вхождение компонента – оператор всегда параллельный. Включаемый компонент обязательно представлен в библиотеке скомпилированной декларацией Entity (теоретически может отсутствовать архитектурное тело).

Чтобы включить компонент необходимо в программе записать декларацию прототипа

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

COMPONENT <имя ENTITY компонента> IS

[ <образ настройки> ]

<образ порта>

END COMPONENT [ <имя ENTITY компонента> ];

<метка вхождения>: [ COMPONENT ] <имя компонента>

GENERIC MAP (<Список соответствий параметров настройки>)—без точки с запятой!

PORT MAP (<список соответствий порта>);

<список соответствий>::=

([ <Формальный параметр>] =><фактический параметр>

«,[ <Формальный параметр> ] => <фактический параметр>»)

В ДаНном случае фактический параметр это только имя сигнала!

 

 


ENTITY structure_example IS

PORT (input: IN std_logic (7 DOWNTO 0);

controle: IN std_logic (3 DOWNTO 0);

s: OUT std_logic);

END structure_example;

ARCHITECTURE structure OF primer IS

COMPONENT V

PORT(A:IN std_logic_vector (7 DOWNTO 0);

CONTROLE:IN std_logic_vector (3 DOWNTO 0);

B: OUT std_logic_vector (31 DOWNTO 0);

С:OUT std_logic);

END COMPONENT;

COMPONENT W

GENERIC (width:integer:=8);

PORT(A:IN integer RANGE 2**width-1 DOWNTO 0;

B: OUT integer RANGE 2**width-1 DOWNTO 0);

END COMPONENT;

COMPONENT Z

GENERIC (width:integer:=16);

PORT(A: IN std_logic_vector (width-1 DOWNTO 0)

C:in std_logic;

B,D: OUT std_logic);

END COMPONENT;

 

SIGNAL c, e: std_logic_vector (7 DOWNTO 0);

SIGNAL cI,eI:integer RANGE 0 TO 255;--цифровые эквиваленты сигналов С и Е

SIGNAL a, f: std_logic_vector(32 DOWNTO 0);

SIGNAL d: std_logic;

BEGIN

U1: v

PORT MAP (input, controle, a,d);

U2:W

PORT MAP (cI,eI);

U3:z

GENERIC MAP(width=>32)

PORT MAP(A=>f,C=>d, B=>S,D=>OPEN);

-- согласование типов данных

rename: c<= a(31 DOWNTO 24);

cI<= conv_integer (c);

e<= conv_std_logic_vector (eI, 8);

f<=e & a(23 DOWNTO 0);

END structure;

Конфигурация

<конфигурация компонента>::=

FOR <спецификация компонента> <индикатор привязки>;

<индикатор привязки>::=

ENTITY <имя Entity>(<имя архитектурного тела>)

<спецификация компонента>::= <список вхождений>: <имя компонента>

<список вхождений>::=

<метка вхождения> «, <метка вхождения>» | OTHERS | ALL

ENTITY bit_count_usage IS

Port (real_input:IN std_logic_vector(47 DOWNTO 0);

Real output:OUT inreger RANGE 0 TO 48);

END bit_count_usage;

ARCHITECTURE selected_architectures OF bit_count_usage IS

COMPONENT bit_count

PORT (input: IN std_logic_vector (15 DOWNTO 0);

output: OUT integer RANGE 0 TO 15);

END COMPONENT;

FOR m1: bit_count USE ENTITY work.bit_count(pure_behave);

FOR others: bit_count USE ENTITY work.bit_count(comb_logic);

SIGNAL first, second, third: integer RANGE 0 TO 15;

BEGIN

m1: bit_count

PORT MAP(input => real_input (15 DOWNTO 0),output=>first);

m2: bit_count

PORT MAP(input => real_input (31 DOWNTO 16), output=> second);

m3: bit_count

PORT MAP(input => real_input (47 DOWNTO 32),output=> third);

real_output<=first+second+third;

END selected_architectures;

<декларации конфигурации>::=

CONFIGURATION <имя конфигурации> OF <имя ENTITY> IS

FOR <имя архитектурного тела>

«<конфигурация компонента> END FOR»

END FOR:

END [ CONFIGURATION ] [ < имя конфигурации > ];

CONFIGURATION ttt OF bit_count_usage IS

FOR selected_architectures

FOR m1: bit_count USE ENTITY work.bit_count(pure_behave);

END FOR;

FOR OTHERS: bit_count USE ENTITY work.bit_count(comb_logic);

END FOR;

END FOR;

END CONFIGURATION;

 

 


1 | 2 |

Поиск по сайту:



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