ПЦУСБ/Лекция 5 — различия между версиями
Материал из Wiki
< ПЦУСБ
ANA (обсуждение | вклад) (Новая страница: «{{ПЦУСБ TOC}} <slideshow style="custis" headingmark="Слайд:" incmark=":step" scaled="true"> ;title: Операторы языка VHDL ;author: Авд…») |
ANA (обсуждение | вклад) м (→Слайд: Последовательный оператор loop) |
||
Строка 27: | Строка 27: | ||
− | === Слайд: | + | === Слайд: Оператор присваивания: <tt><=</tt> === |
+ | |||
+ | {{link|conditional_waveform_assignment}} ::= [§ '''10.5.3'''] | ||
+ | {{ref|target}} <= [ {{ref|delay_mechanism}} ] {{ref|conditional_waveforms}} ; | ||
+ | |||
+ | {{link|delay_mechanism}} ::= [§ '''10.5.2.1'''] | ||
+ | '''transport''' | ||
+ | | [ '''reject''' ''time''_expression ] '''inertial''' | ||
+ | |||
+ | Пример транспортной задержки: | ||
+ | transmission_line : process (line_in) is | ||
+ | begin | ||
+ | line_out <= '''transport''' line_in '''after''' 500 ps; | ||
+ | end process transmission_line; | ||
+ | |||
+ | Пример инерционной задержки: | ||
+ | inv : process (a) is | ||
+ | begin | ||
+ | y <= '''inertial''' not a after 3 ns; | ||
+ | {{Сн|'''или'''}} | ||
+ | y <= not a after 3 ns; | ||
+ | end process inv; | ||
+ | |||
+ | inv : process (a) is | ||
+ | begin | ||
+ | y <= '''reject''' 2 ns '''inertial''' not a after 3 ns; | ||
+ | end process inv; | ||
+ | |||
+ | <small> | ||
+ | * §5.2.5 Transport and Inertial Delay Mechanisms (стр. 158) | ||
+ | </small> | ||
+ | |||
+ | |||
+ | ==== Слайд: Оператор присваивания: <tt><=</tt> ==== | ||
+ | |||
+ | * EXAMPLE 5.10 An asymmetric delay element using transport delay | ||
+ | |||
+ | asym_delay : process (a) is | ||
+ | constant Tpd_01 : time := 800 ps; | ||
+ | constant Tpd_10 : time := 500 ps; | ||
+ | begin | ||
+ | if a then | ||
+ | z <= transport a after Tpd_01; | ||
+ | else -- not a | ||
+ | z <= transport a after Tpd_10; | ||
+ | end if; | ||
+ | end process asym_delay; | ||
+ | |||
+ | |||
+ | === Слайд: Оператор loop === | ||
+ | |||
+ | * бесконечный цикл | ||
+ | |||
+ | loop_statement ⇐ | ||
+ | [ loop_label : ] '''loop''' | ||
+ | { последовательные операторы } | ||
+ | '''end loop''' [ loop_label ] ; | ||
+ | |||
+ | * Пример | ||
+ | entity counter is | ||
+ | port ( clk : in bit; | ||
+ | count : out natural ); | ||
+ | end entity counter; | ||
+ | |||
+ | architecture behavior of counter is | ||
+ | begin | ||
+ | incrementer : process is | ||
+ | variable count_value : natural := 0; | ||
+ | begin | ||
+ | count <= count_value; | ||
+ | '''loop''' | ||
+ | wait until clk; | ||
+ | count_value := (count_value + 1) mod 16; | ||
+ | count <= count_value; | ||
+ | '''end loop'''; | ||
+ | end process incrementer; | ||
+ | end architecture behavior; | ||
+ | |||
+ | <small> | ||
+ | * 3.4 Loop Statements (стр. 84 (76)) | ||
+ | </small> | ||
+ | |||
+ | ==== Слайд: Оператор exit ==== | ||
+ | |||
+ | * Выход из цикла | ||
+ | {{link|exit_statement}} ::= [§ '''10.2'''] | ||
+ | [ {{ref|label}} : ] '''exit''' [ ''loop''_label ] [ '''when''' {{ref|condition}} ] ; | ||
+ | |||
+ | * Пример | ||
+ | {|cellspacing="0" cellpadding="5" border="1" | ||
+ | | <pre> | ||
+ | loop | ||
+ | if condition then | ||
+ | exit; | ||
+ | end if; | ||
+ | end loop; | ||
+ | </pre> | ||
+ | |<pre> | ||
+ | loop | ||
+ | ... | ||
+ | exit when ''условие''; | ||
+ | ... | ||
+ | end loop; | ||
+ | ... -- Управление перейдёт сюда | ||
+ | -- при выполнения условия внутри цикла loop</pre> | ||
+ | |} | ||
+ | |||
+ | loop_name : '''loop''' | ||
+ | ... | ||
+ | '''exit''' loop_name; | ||
+ | ... | ||
+ | '''end loop''' loop_name; | ||
+ | |||
+ | |||
+ | ==== Слайд: Оператор next ==== | ||
+ | |||
+ | * Переход на следующую итерацию цикла | ||
+ | |||
+ | {{link|next_statement}} ::= [§ '''10.11'''] | ||
+ | [ {{ref|label}} : ] '''next''' [ ''loop''_label ] [ '''when''' {{ref|condition}} ] ; | ||
+ | |||
+ | |||
+ | {| cellspacing="0" cellpadding="5" border="1" | ||
+ | |<pre> | ||
+ | loop | ||
+ | statement-1; | ||
+ | next when condition; | ||
+ | statement-2; | ||
+ | end loop;</pre> | ||
+ | |<pre> | ||
+ | loop | ||
+ | statement-1; | ||
+ | if not condition then | ||
+ | statement-2; | ||
+ | end if; | ||
+ | end loop;</pre> | ||
+ | |} | ||
+ | |||
+ | |||
+ | === Слайд: Оператор цикла while..loop=== | ||
+ | |||
+ | loop_statement ⇐ | ||
+ | [ loop_label : ] | ||
+ | '''while''' condition '''loop''' | ||
+ | { sequential_statement } | ||
+ | '''end loop''' [ loop_label ] ; | ||
+ | |||
+ | |||
+ | while index > 0 loop | ||
+ | ... -- statement A: do something with index | ||
+ | end loop; | ||
+ | ... -- statement B | ||
+ | |||
+ | |||
+ | === Слайд: Оператор цикла for..loop=== | ||
+ | |||
+ | loop_statement ⇐ | ||
+ | [ loop_label : ] | ||
+ | '''for''' identifier '''in''' discrete_range '''loop''' | ||
+ | { sequential_statement } | ||
+ | '''end loop''' [ loop_label ] ; | ||
+ | |||
+ | discrete_range ⇐ | ||
+ | simple_expression ( '''to''' | '''downto''' ) simple_expression | ||
+ | |||
+ | |||
+ | '''for''' count_value '''in''' 0 '''to''' 127 '''loop''' | ||
+ | count_out <= count_value; | ||
+ | wait for 5 ns; | ||
+ | '''end loop'''; | ||
+ | |||
+ | |||
+ | === Слайд: Оператор assert === | ||
+ | |||
+ | * проверяет условие, в случае нарушения которого может выдаваться сообщение | ||
+ | concurrent_assertion_statement ⇐ | ||
+ | [ label : ] | ||
+ | '''assert''' ''condition'' | ||
+ | [ '''report''' ''expression'' ] [ '''severity''' ''expression'' ] ; | ||
+ | |||
+ | '''assert''' initial_value <= max_value | ||
+ | '''report''' "initial value too large"; | ||
+ | |||
+ | '''assert''' current_character >= '0' '''and''' current_character <= '9' | ||
+ | '''report''' "Input number " & input_string & " contains a non-digit"; | ||
+ | |||
+ | check : '''assert''' not (s and r) | ||
+ | '''report''' "Incorrect use of S_R_flip_flop: " & | ||
+ | "s and r both '1'"; | ||
+ | |||
+ | * в пакете STANDARD: | ||
+ | '''type''' severity_level '''is''' (note, warning, error, failure); | ||
+ | |||
+ | '''assert''' free_memory >= low_water_limit | ||
+ | '''report''' "low on memory, about to start garbage collect" | ||
+ | '''severity''' note; | ||
+ | |||
+ | |||
+ | === Слайд: Оператор === |
Версия 22:28, 7 ноября 2013
- Заголовок
- Операторы языка VHDL
- Автор
- Авдеев Н.А.
- Нижний колонтитул
- ПЦУСБ/Лекция 5
- Дополнительный нижний колонтитул
- Авдеев Н.А., 22:33, 14 ноября 2013
Содержание |
Слайд: Последовательные операторы
- :=
- <=
- if
- case
- loop
- next
- exit
- null
- procedure call
- return
- assert
- wait
Используются в:
- process
- функциях
- подпрограммах
Слайд: Оператор присваивания: <=
conditional_waveform_assignment ::= [§ 10.5.3] target <= [ delay_mechanism ] conditional_waveforms ;
delay_mechanism ::= [§ 10.5.2.1] transport | [ reject time_expression ] inertial
Пример транспортной задержки:
transmission_line : process (line_in) is begin line_out <= transport line_in after 500 ps; end process transmission_line;
Пример инерционной задержки:
inv : process (a) is
begin
y <= inertial not a after 3 ns;
или
y <= not a after 3 ns;
end process inv;
inv : process (a) is begin y <= reject 2 ns inertial not a after 3 ns; end process inv;
- §5.2.5 Transport and Inertial Delay Mechanisms (стр. 158)
Слайд: Оператор присваивания: <=
- EXAMPLE 5.10 An asymmetric delay element using transport delay
asym_delay : process (a) is constant Tpd_01 : time := 800 ps; constant Tpd_10 : time := 500 ps; begin if a then z <= transport a after Tpd_01; else -- not a z <= transport a after Tpd_10; end if; end process asym_delay;
Слайд: Оператор loop
- бесконечный цикл
loop_statement ⇐ [ loop_label : ] loop { последовательные операторы } end loop [ loop_label ] ;
- Пример
entity counter is port ( clk : in bit; count : out natural ); end entity counter; architecture behavior of counter is begin incrementer : process is variable count_value : natural := 0; begin count <= count_value; loop wait until clk; count_value := (count_value + 1) mod 16; count <= count_value; end loop; end process incrementer; end architecture behavior;
- 3.4 Loop Statements (стр. 84 (76))
Слайд: Оператор exit
- Выход из цикла
exit_statement ::= [§ 10.2] [ label : ] exit [ loop_label ] [ when condition ] ;
- Пример
loop if condition then exit; end if; end loop; |
loop ... exit when ''условие''; ... end loop; ... -- Управление перейдёт сюда -- при выполнения условия внутри цикла loop |
loop_name : loop ... exit loop_name; ... end loop loop_name;
Слайд: Оператор next
- Переход на следующую итерацию цикла
next_statement ::= [§ 10.11] [ label : ] next [ loop_label ] [ when condition ] ;
loop statement-1; next when condition; statement-2; end loop; |
loop statement-1; if not condition then statement-2; end if; end loop; |
Слайд: Оператор цикла while..loop
loop_statement ⇐ [ loop_label : ] while condition loop { sequential_statement } end loop [ loop_label ] ;
while index > 0 loop ... -- statement A: do something with index end loop; ... -- statement B
Слайд: Оператор цикла for..loop
loop_statement ⇐ [ loop_label : ] for identifier in discrete_range loop { sequential_statement } end loop [ loop_label ] ;
discrete_range ⇐ simple_expression ( to | downto ) simple_expression
for count_value in 0 to 127 loop count_out <= count_value; wait for 5 ns; end loop;
Слайд: Оператор assert
- проверяет условие, в случае нарушения которого может выдаваться сообщение
concurrent_assertion_statement ⇐ [ label : ] assert condition [ report expression ] [ severity expression ] ;
assert initial_value <= max_value report "initial value too large";
assert current_character >= '0' and current_character <= '9' report "Input number " & input_string & " contains a non-digit";
check : assert not (s and r) report "Incorrect use of S_R_flip_flop: " & "s and r both '1'";
- в пакете STANDARD:
type severity_level is (note, warning, error, failure);
assert free_memory >= low_water_limit report "low on memory, about to start garbage collect" severity note;