Скачать 77.17 Kb.
|
Управление Последовательностью положений Введение Ключевые вопросы: Процессы в которых операторы выполняются только последовательно совершенно редки. Так как процессы представляют реальные системы, которые существуют в непрерывно меняющихся условиях внешней среды, то они обычно отличаются от одного выполнения до другого. Изменяющиеся условия внешней среды представлены в VHDL четырьмя классами условных операторов: Условное выполнение операторов (если … затем … операторы); Условное выполнение с альтернативами (если … затем … еще … и если … затем … elsif … операторы); Многократный выбор операторов (случай … операторы); Циклы позволяют повторение выполнения некоторых операторов (до тех пор пока делать………. и для …, делать … операторы). Примеры: Ниже приведенный пример показывает конечный автомат, обнаруживающий последовательность 101 в потоке битов на входе X. Для этого используются различные условные операторы, которые является типичным для процессов, представляющих конечные автоматы. ![]() Рисунок: ![]() ^ Ключевые вопросы: Некоторые операторы выполняются только, когда встречаются в списке условий. Такие операторы называются условными и их реализация неформально может быть определена как: if condition_met then execute_operations Это VHDL действие подразумевает следующую процедуру: 'Condition_met' предложение принимает значения типа Boolean ( истинна или ложь); если оно истинно, то предложение ‘then’ активизировано; После ‘then’ имеется список операторов, которые нужно выполнить; каждый оператор заканчивается точкой с запятой; Завершить условные операторы и отделить их от операторов, которые следуют после оператора 'end if '. Примеры: I1 : if Status_Signal = hold then A1: Outputs <= 'X'; end if I1; Signal Code_of_Operation : bit_vector(2 downto 0); if Code_of_Operation(2) = '1' then F := Operand_1 + Operand_2; end if; if Code_of_Operation(1) = '1' then F := Operand_1 - Operand_2; end if; if Code_of_Operation(0) = '1' then F := "00000000"; end if; Рисунок: ![]() ^ Ключевые вопросы: Выше описанные условные операторы совершенно просты и требуют некоторых расширений для большей гибкости. Например, нам нужно реализовать случай типа, ", если условие выполнено, некоторые действия предприняты, но если нет, другой набор действий выполняется ". Это конструирует, представления типа " если … затем … еще … " операторы. Эти операторы ветвления могут быть далее расширены. Когда 'еще' предложение активно, то оно может содержать другое условные операторы, формируя иерархические условия. Такая ситуация может быть обработана в VHDL конструкцией " если … затем … elsif … ". Примеры: Ниже приведена поведенческая модель схем ExOr и Or.В модели применяют операторы если … затем … еще … и если … затем … elsif …, соответственно. Все сигналы (In1, In2 и Y) имеют бит тип. architecture ExOr_Gate_Arch1 of ExOr_Gate is begin process (InA, InB) begin if InA=InB then Y <= '0'; else Y <= '1'; end if; end process; end architecture ExOr_Gate_Arch1; architecture Or_Gate_Arch1 of Or_Gate is begin process (InA, InB) begin if InA='1' then Y <= '1'; elsif InB='1' then Y <= '1'; else Y <= '0'; end if; end process; end architecture ExOr_Gate_Arch1; Рисунок: ![]() ^ Ключевые вопросы: Конструкции " Если … затем … elsif … " – это операторы множественного выбора, которые позволяют выбирать отдельные ветви в зависимости от проанализированных условий. Однако, такие конструкции трудночитаемы, если число ветвей больше трех. В этих случаях применение операторов множественного выбора - намного лучший выбор. Вместо Булева условия, операторы проверяют выражение дискретного типа (любое перечисление или тип целого числа) или типа массив литер. Практически, это выражение – обычно имя объекта. Каждая альтернативная группа действий определяется выражением " когда выбор = > " предложение "выбора", которое определяет значения выражения. Одни значения могут быть единственные, другие находиться в диапазоне значений, однако они не могут использоваться совместно друг с другом. Примеры: Конструкции из предыдущей страницы, если … затем … еще …, могут быть заменены оператором case: architecture ExOr_Gate_Arch2 of ExOr_Gate is begin process (InA, InB) variable temp : bit_vector (1 downto 0); begin temp := InA & InB; case temp is when "00" => Y <= '0'; when "01" => Y <= '1'; when "10" => Y <= '1'' when "11" => Y <= '0'; end case; end process; end architecture ExOr_Gate_Arch2; Рисунок: ![]() ^ Ключевые вопросы: Операторы условных циклов начинаются с логических условий и функционируют аналогично условному оператору " если … затем … ", но выполняют переход к началу цикла после самого последнего оператора. Цикл повторяется до тех пор пока условие в начале цикла истинно. Сначала, условие проверяется и если оно истинно, то операторы внутри цикла выполняются. Если условие ложно, цикл заканчивается, и управление передается к самому первому оператору, который следует после цикла. Обычно, такие циклы используются, для того чтобы многократно выполнять набор действий, до тех пор пока сигнал или переменная принимает выбранное значение. Пример приведенный справа счетчик, который считает накопление CLK до тех пор, пока сигнал Level '1'. Заметьте, что устойчивость сигнала Level не анализируется. Все что только проверяется в начале цикла - это то является ли Level = '1', тогда ребро накопления CLK обнаружено. При этом не имеет значение, если Level изменил значение по сравнению с предыдущей проверкой. Примеры: Shift_1: process (Input_X) variable i : positive := 1; begin L1: while i <= 8 loop Output_X(i) <= Input_X(i+8) after 5 ns; i := i + 1; end loop L1; end process Shift_1; Рисунок: ![]() ^ Ключевые вопросы: Цикл с условием продолжения повторяет тело неограниченное число раз, пока условие, указанное в заголовке цикла истинно. Однако, иногда необходимо повторить действия заданное число раз. Чтобы выполнить это, более удобно использовать цикл со счетчиком вместо цикла с условием продолжения. Фактически такой цикл используются на практике намного чаще чем циклы с условием продолжения. Цикл со счетчиком не содержит Булево условие. Вместо него, дискретный диапазон начала и конца цикла задается. После того, как закончен один проход цикла , переменной цикла присваивается следующее значение из указанного диапазона. Счетчик, который не объявляется (по спецификации в заголовке цикла он равен декларации), трактуется как постоянный внутренний цикл и не может использоваться в операциях присваивания, индексации или выражениях, где он может быть изменен. Кроме того, счетчик существует только внутри цикла, в котором он объявлен. Счетный диапазон не должен быть определен в классической форме как от … до …. Он может быть внесен в список как перечисляемый тип или подтип. В таком случае только подтип определен как диапазон счетчика. Примеры: Shift_2: process (Input_X) begin L2: for count_value in 1 to 8 loop Output_X(count_value) <= Input_X(count_value + 8) after 5 ns; end loop L2; end process Shift_2; Shift_3: process (Input_X) subtype Range_Type is positive range 1 to 8; begin L3: for count_value in Range_Type loop Output_X(count_value) <= Input_X(count_value +8) after 5 ns; end loop L3; end process Shift_3; Рисунок: ![]() ^ Ключевые вопросы: Итерации условных и безусловных циклов повторяются и выполняют все свои операторыдо тех пор, пока условие цикла истино. Однако иногда, , желательно игнорировать некоторые из операторов цикла на текущей итерации и идти непосредственно на следующую итерацию того же самого цикла. Такая ситуация встречается например при подсчете битов со значением '1' в бит векторе (рисунок справа): когда бит – 1 то происходит приращение счетчика, а если бит нулевой, цикл должна игнорировать эту итерацию. Оператор next выполняет этот вид действий. Помимо оператора next, который выполняет переход на следующую итерацию, имеются ситуации, которые требуют завершения итераций, даже если условие истинно. Оператор exit может выполнять это. Переход на следующую итерацию и выход из цикла может быть назначен при помощи условия их выполнения. Так как это действие используется довольно часто, VHDL имеет упрощенный метод поддержки для next и exit операторов: это условие определено в предложении when, которое следует за оператором. Примеры: L4: loop A:= A+1; exit L4 when A > 10; end loop L4; L5: for count_value in 1 to 10 loop exit L5 when reset = '1'; A_1: A(count_value) := '0'; end loop L5; A_2: B <= A after 10 ns; Рисунок: ![]() Резюме
|
![]() | Если именованный объект может использоваться как компонент тогда, почему мы должны рассматривать другие конструкции для той же самой... | ![]() | Однако, часто неудобно использовать эту форму. Так как одна буква представлена 8 битами, и каждое обращение к памяти pc требует,... |
![]() | Найди в Internet ответы на следующие вопросы. Запиши ключевые слова, которые использовались для поиска. Запиши адреса серверов, на... | ![]() | Ключевые вопросы анамнеза, которые необходимо выяснить у беременнной или роженицы во время визита анестезиолога |
![]() | «Не дай бог реформировать чиновников и просвещение!!!» сказал в конце 19-го века Премьер России С. Ю. Витте | ![]() | Аннотация и ключевые слова приводятся на трех языках (украинском, русском и английском). Аннотацию и ключевые слова на языке публикуемого... |
![]() | Украины, по-прежнему открытыми остаются ключевые вопросы, ответы на которые определят не только будущее развитие энергетики, но и... | ![]() | Концепция порта уже была упомянута ранее и пришло время обсудить ее более подробно |
![]() | Хартія про особливе партнерство між Україною та Організацію Північно-Атлантичного договору, Мадрид, 9 липня 1997 року | ![]() | Ключевые слова: сердечная недостаточность, кардиогемодинамика, почки, цистатин С, тфр- β1, β2-мг, фно- α |