|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Лекция 6Структуризация описания Позволяет улучшить понимание программы а также обеспечивает возможности многократного использования уже разработанных и отлаженных узлов. (в том числе библиотечных)
Возможности, которые предоставляет 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;
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.012 сек.) |