Pitonbl4 0 8 августа, 2014 Опубликовано 8 августа, 2014 · Жалоба Добрый день! Пусть я с помощью state machine генерирую некоторый сигнал. И пусть, в нем(сигнале) существует периодический кусок. Я представлю фрагмент кода. Кто-нибудь может подсказать как не писать сто раз ;) блок when? Можно ли в данном случае применить цикл for, как в других языках программирования? Если да, то как? process(clk) variable state : integer range 0 to 40 := 0; begin case state is ................... when 3 => if(counter = time_2) then sclk_temp <= '0'; d_in_temp <= Command_data(6); state:= state + 1; counter <= 1; else counter <= counter + 1; end if; when 4 => if(counter = time_2) then sclk_temp <= '1'; state:= state + 1; counter <= 1; else counter <= counter + 1; end if; when 5 => if(counter = time_2) then sclk_temp <= '0'; d_in_temp <= Command_data(5); state:= state + 1; counter <= 1; else counter <= counter + 1; end if; when 6 => if(counter = time_2) then sclk_temp <= '1'; state:= state + 1; counter <= 1; else counter <= counter + 1; end if; when 7 => if(counter = time_2) then sclk_temp <= '0'; d_in_temp <= Command_data(4); state:= state + 1; counter <= 1; else counter <= counter + 1; end if; ...................... end case; end process; Буду очень благодарен! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 августа, 2014 Опубликовано 8 августа, 2014 · Жалоба если у вас есть зависимость того что под when от i то можно. for i in 0 to 7 loop if(state = i) if(counter = time_2) then sclk_temp <= '0'; d_in_temp <= Command_data(i); counter <= 1; state:= state + 1; else counter <= counter + 1; endif endif end loop; примерно так, если я правильно помню VHDL синтаксис и правильно определил что у вас зависит от i общий смысл что циклы в описании железа - это сокращенная запись. Любой цикл представляет собой просто тело цикла в столбик друг за другом. Ну правильнее конечно вынести из цикла повторяющие куски типа counter <= counter + 1 и подобное, но я давно не vhdl не писал трудно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 9 августа, 2014 Опубликовано 9 августа, 2014 · Жалоба Добрый день! Пусть я с помощью state machine генерирую некоторый сигнал. И пусть, в нем(сигнале) существует периодический кусок. Я представлю фрагмент кода. Кто-нибудь может подсказать как не писать сто раз ;) блок when? Можно ли в данном случае применить цикл for, как в других языках программирования? Если да, то как? Этот код можно рассмотреть, как три вложенных конечных автомата, образуемых состояниями (counter,sclk_temp,state), смена состояния внутреннего автомата происходит при завершении цикла на более внешнем. И лучше использовать сигнал для хранения state. if counter /= time_2 then counter <= counter + 1; else counter <= 1; sclk_temp <= not sclk_temp; if sclk_temp = '1' then d_in_temp <= command_data(state_to_command_data_index(state)); if state=state_end then state <= state_start; else state <= state+1; end if; end if; end if; Если state имеет также и нециклические состояния, то вышеприведённую циклическую часть можно внести в ветку others=> для нециклического case state и if state=state_end убрать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitus_strom 0 9 августа, 2014 Опубликовано 9 августа, 2014 · Жалоба Попробуйте так When 3 | 4 | 5 => {first case set} When others => {others cases} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба ну или when 3 to 5 => {first case set} when 6|7|12 => {second case set} when 256 downto 14 ... When others => {others cases} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться