Jump to content

    
Sign in to follow this  
jenya7

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

Recommended Posts

1 hour ago, des00 said:

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

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
1 hour ago, jenya7 said:

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

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

12 minutes ago, Strob said:

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

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

Share this post


Link to post
Share on other sites
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;   

 

Share this post


Link to post
Share on other sites
1 hour ago, Strob said:

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

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

1 hour ago, Flip-fl0p said:

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

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

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

 

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

 

Share this post


Link to post
Share on other sites
3 минуты назад, jenya7 сказал:

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

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

 

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

Share this post


Link to post
Share on other sites
1 hour ago, Flip-fl0p said:

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

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
2 минуты назад, jenya7 сказал:

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

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

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

 

Share this post


Link to post
Share on other sites
1 hour ago, Flip-fl0p said:

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

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

 

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
1 hour ago, jenya7 said:

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

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

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

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

Share this post


Link to post
Share on other sites
2 часа назад, jenya7 сказал:

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

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

 

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

Share this post


Link to post
Share on other sites
2 hours ago, jenya7 said:

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

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

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

Edited by one_eight_seven

Share this post


Link to post
Share on other sites

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

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;

 

Share this post


Link to post
Share on other sites
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 что говорит ?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this