Перейти к содержанию
    

применение цикла for к state machine

Добрый день!

 

Пусть я с помощью 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;

 

Буду очень благодарен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если у вас есть зависимость того что под 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 не писал трудно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

 

Пусть я с помощью 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 убрать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну или

when 3 to 5 =>

{first case set}

when 6|7|12 =>

{second case set}

when 256 downto 14

...

When others =>

{others cases}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...