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

Общее условие для всех состояний в state machine.

1 hour ago, des00 said:

ндя, процесс то второй должен быть комбинационным. @dvladim же вам написал 

включайте голову, читайте и понимайте литературу, в противном случае, разводить ПЛИС вы будете долго и печально

так у меня так же как у @dvladim. ааа... без клока? здрасте! мне клок нужен. у меня же не просто переход из стейта в стейт, там наверное логика всякая отрабатывается.

Изменено пользователем jenya7

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


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

Код из первого поста вроде должен работать, если case поместить в else условия сброса. 

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


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

1 hour ago, jenya7 said:

так у меня так же как у @dvladim. ааа... без клока? здрасте! мне клок нужен. у меня же не просто переход из стейта в стейт, там наверное логика всякая отрабатывается.

эммм, вам наверное рано еще писать, книгу курс молодого бойца лучше изучить сейчас, там на пальцах объясняется что такое плис, регистры, комбинационная логика, как они описываются вместе. Сомневался что вам это надо, но вот этой репликой, вы показали что совершенно плаваете в разработке на плис, в независимости от языка. Книга легко изучается за неделю)

12 minutes ago, Strob said:

Код из первого поста вроде должен работать, если case поместить в else условия сброса. 

+1, а можно просто enable, работающий как синхронный сброс поставить ниже case, задав правильный приоритет) 

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


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

1 час назад, jenya7 сказал:

так у меня так же как у @dvladim. ааа... без клока? здрасте! мне клок нужен. у меня же не просто переход из стейта в стейт, там наверное логика всякая отрабатывается.

 

https://habr.com/ru/post/254885/

Вам нужно понимание, что такое цифровой автомат.

Вот пример совсем примитивный. Но показывающий суть:

library ieee;
    use ieee.std_logic_1164.all;

entity svet is 
port
    (
        button      : in  std_logic;                    
        clk         : in  std_logic;                    
        output_data : out std_logic_vector (1 downto 0) 
    );
end entity;

architecture rtl of svet is
    type state_type  is     --состояния светофора
    (
        green,           
        yellow, 
        red
    );
    signal next_state, press_state : state_type := red;  
    attribute syn_encoding  : string;
    attribute syn_encoding  of state_type : type is "safe";  -- Сделать автомат безопасным

begin

    --================================================
    -- Первый процесс - регистры, хранящие состояние автомата
    --================================================
    FSM_REGS : process(clk)
    begin
        if (rising_edge(clk)) then
            press_state <= next_state;  -- с каждым фронтом clk меняем состояние на next_state
        end if;
    end process;

    --============================================================================
    -- Второй процесс - комбинационная логика, вычислающая новое состояние автомата
    --============================================================================
    process(all)
    begin
        case press_state is
            when red =>         
                            next_state <= red;           -- Крутимся в состоянии красного цвета
                            if (button = '1') then       -- Когда нажимаем кнопку
                                next_state <= green;     -- Переходим в состояние зеленого цветаы 
                            end if;                      
            --=======================================================================================
            when green =>                                    
                            next_state <= green;         -- Крутимся в состоянии зеленого  цвета
                            if (button  = '1') then      -- Когда нажимаем кнопку
                                next_state <= yellow;    -- Переходим в состояние желтого цвета                    
                            end if;                            
            --=======================================================================================
            when yellow =>                                  
                            next_state <= yellow;        -- Крутимся в состоянии желтого  цвета
                            if  (button = '1') then      -- Когда нажимаем кнопку
                                next_state <= red;       -- Переходим в состояние красного цвета         
                            end if;
            --=======================================================================================
            when others =>  next_state <= red;
        end case;       
    end process;
    
    --==========================================================================
    -- Третий процесс - комбинационная логика, формирующая выходные сигналы
    --==========================================================================
    process(all)
    begin
        case press_state is
            when red     => output_data <= "00";  
            when green   => output_data <= "01";  
            when yellow  => output_data <= "10";  
            when others  => output_data <= "00";
        end case;
    end process;
end architecture;   

 

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


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

1 hour ago, Strob said:

Код из первого поста вроде должен работать, если case поместить в else условия сброса. 

ну это же совсем другое дело. просто и со вкусом.

1 hour ago, Flip-fl0p said:

https://habr.com/ru/post/254885/

Вам нужно понимание, что такое цифровой автомат.

Вот пример совсем примитивный. Но показывающий суть:

 

у вас button выполняет роль клока.

 

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


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

3 минуты назад, jenya7 сказал:

ну это же совсем другое дело. просто и со вкусом.

у вас button выполняет роль клока.

 

Роль клока выполняет clk. button  отвечает за переход между состояниями.

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


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

1 hour ago, Flip-fl0p said:

Роль клока выполняет clk. button  отвечает за переход между состояниями.

я имею ввиду что это "клокирующее" условие. вот мне клок нужен вместо button.

хотя...я так посмотрел...можно переписать в принципе. вопрос надо ли.

Изменено пользователем jenya7

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


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

2 минуты назад, jenya7 сказал:

я имею ввиду что это "клокирующее" условие. вот мне клок нужен вместо button.

Такого термина нет. Вообще-то по клоку каждый раз происходит только одно: присвоение регистру press_state значения next_state.

Ваша задача понять суть цифрового автомата. Поймете суть - написать что-то рабочее не составит труда. Сейчас у меня сложилось впечатление, что Вы совсем не понимаете как та или иная строчка реализуется в ПЛИС. 

 

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


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

1 hour ago, Flip-fl0p said:

Такого термина нет. Вообще-то по клоку каждый раз происходит только одно: присвоение регистру press_state значения next_state.

Ваша задача понять суть цифрового автомата. Поймете суть - написать что-то рабочее не составит труда. Сейчас у меня сложилось впечатление, что Вы совсем не понимаете как та или иная строчка реализуется в ПЛИС. 

 

почему не понимаю. открыл RTL и все видно :)

кстати я читал что комбинаторную логику следует избегать. чревато.

Изменено пользователем jenya7

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


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

1 hour ago, jenya7 said:

почему не понимаю. открыл RTL и все видно :)

кстати я читал что комбинаторную логику следует избегать. чревато.

Ещё открыл этот автомат в notepad++ в одной области логика переходов в другой описание регистровой логики

Вообще красота :)

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


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

2 часа назад, jenya7 сказал:

почему не понимаю. открыл RTL и все видно :)

кстати я читал что комбинаторную логику следует избегать. чревато.

 

Комбминационную логику не стоит избегать. Стоит избегать сложные логические выражения, которые на кристалле вырождаются в длинные слои логики, которые сильно урезают тактовую частоту. Однако не всегда есть задача вытягивать максимальные частоты для FPGA. Поэтому ничего плохого в комбинационной логике нет. Проект разведен. Времянка сошлась. Запасы по времянке есть. Значит все хорошо.

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


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

2 hours ago, jenya7 said:

кстати я читал что комбинаторную логику следует избегать. чревато.

Но это единственный способ реализации логических функций. Без неё не получится дешифровать адрес, не получится сделать математическую функцию.

Просто надо понимать, что и для чего вы делаете.

Изменено пользователем one_eight_seven

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


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

так у меня ничего не работает

process (CLK)
begin
    if (rising_edge(CLK)) then
        if (ENA = '1') then
            State <= NextState;
        else
            State <= ST_IDLE;
        end if;	  
	 end if;
end process;

process (all)
begin
    --if (rising_edge(CLK)) then
       case State is
           when ST_IDLE => 
               NextState <= ST_1;

           when ST_1 => 
             NextState <= ST_2;

          when ST_2 => 
            idx := idx + 1;
            NextState <= ST_1;

       end case;	  
    --end if;
end process;

 

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


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

4 часа назад, jenya7 сказал:

так у меня ничего не работает


process (CLK)
begin
    if (rising_edge(CLK)) then
        if (ENA = '1') then
            State <= NextState;
        else
            State <= ST_IDLE;
        end if;	  
	 end if;
end process;

process (all)
begin
    --if (rising_edge(CLK)) then
       case State is
           when ST_IDLE => 
               NextState <= ST_1;

           when ST_1 => 
             NextState <= ST_2;

          when ST_2 => 
            idx := idx + 1;
            NextState <= ST_1;

       end case;	  
    --end if;
end process;

 

А modelsim что говорит ?

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


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

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

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

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

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

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

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

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

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

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