Счетчик со структурой конечного автомата в VHDL. QUARTUS - PullRequest
0 голосов
/ 07 ноября 2018

Я создал этот код VHDL, и тестирование его с помощью файла VWF кажется работоспособным. Но конечный автомат, который генерирует мой код (я вижу его с помощью инструмента QUARTUS «конечный автомат»), кажется, что это неправильно. При этом ФСМ кажется, что в каждом штате можно достичь любого другого состояния. В соответствии с целями моего проекта мне нужен счетчик, который считает от нуля до девяти и меняет свое значение в соответствии со значением двух входных сигналов w0 и w1. Если w0 и w1 оба равны нулю, счетчик присутствует в своем текущем состоянии, если w0 равен 0 и w1 равен 1, счетчик увеличивается на единицу, если w0 равен 1 и w1 равен 0, счетчик увеличивается на два, если w0 и w1 оба 1 счетчик уменьшается на единицу. Есть также сигнал синхронизации и сигнал сброса.

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY counter IS
    PORT(clk, reset :in std_logic;
                      w :in std_logic_vector(1 DOWNTO 0);
                  cont :out std_logic_vector(3 DOWNTO 0););
END;


ARCHITECTURE arch_counter OF counter IS

TYPE state IS (zero, one, two, three, four, five, six, seven, eight, nine);
SIGNAL numbCorr, numbFuture :state;

BEGIN



    PROCESS(w, numbCorr)
        BEGIN

            CASE numbCorr IS
                WHEN zero => IF w = "00" THEN numbFuture <= zero; 
                            ELSIF w = "01" THEN numbFuture <= one;  
                            ELSIF w = "10" THEN numbFuture <= two;  
                            ELSIF w = "11" THEN numbFuture <= zero; 
                             END IF;
                             cont <= "0000";
                WHEN one => IF  w = "00" THEN numbFuture <= one;
                             ELSIF w = "01" THEN numbFuture <= two;
                             ELSIF w = "10" THEN numbFuture <= three;
                             ELSIF w = "11" THEN numbFuture <= zero;
                             END IF;
                             cont <= "0001";
                WHEN two => IF   w = "00" THEN numbFuture <= two;
                             ELSIF w = "01" THEN numbFuture <= three;
                             ELSIF w = "10" THEN numbFuture <= four;
                             ELSIF w = "11" THEN numbFuture <= one;
                             END IF;
                             cont <= "0010";
                WHEN three => IF     w = "00" THEN numbFuture <= three;
                             ELSIF w = "01" THEN numbFuture <= four;
                             ELSIF w = "10" THEN numbFuture <= five;
                             ELSIF w = "11" THEN numbFuture <= two;
                             END IF;
                             cont <= "0011";
                WHEN four => IF      w = "00" THEN numbFuture <= four;
                             ELSIF w = "01" THEN numbFuture <= five;
                             ELSIF w = "10" THEN numbFuture <= six;
                             ELSIF w = "11" THEN numbFuture <= three;
                             END IF;
                             cont <= "0100";
                WHEN five => IF w = "00" THEN numbFuture <= five;
                             ELSIF w = "01" THEN numbFuture <= six;
                             ELSIF w = "10" THEN numbFuture <= seven;
                             ELSIF w = "11" THEN numbFuture <= four;
                             END IF;
                             cont <= "0101";
                WHEN six => IF   w = "00" THEN numbFuture <= six;
                             ELSIF w = "01" THEN numbFuture <= seven;
                             ELSIF w = "10" THEN numbFuture <= eight;
                             ELSIF w = "11" THEN numbFuture <= five;
                             END IF;
                             cont <= "0110";
                WHEN seven => IF     w = "00" THEN numbFuture <= seven;
                             ELSIF w = "01" THEN numbFuture <= eight;
                             ELSIF w = "10" THEN numbFuture <= nine;
                             ELSIF w = "11" THEN numbFuture <= six;
                             END IF;
                             cont <= "0111";
                WHEN eight => IF     w = "00" THEN numbFuture <= eight;
                             ELSIF w = "01" THEN numbFuture <= nine;
                             ELSIF w = "10" THEN numbFuture <= nine; 
                             ELSIF w = "11" THEN numbFuture <= eight;
                             END IF;
                             cont <= "1000";
                WHEN nine => IF      w = "00" THEN numbFuture <= nine;
                             ELSIF w = "01" THEN numbFuture <= nine; 
                             ELSIF w = "10" THEN numbFuture <= nine; 
                             ELSIF w = "11" THEN numbFuture <= eight;
                             END IF;
                             cont <= "1001";
                END CASE;


        END PROCESS;

        PROCESS(clk)
            BEGIN 
                IF (rising_edge(clk)) THEN 
                    IF reset = '0' THEN numbCorr <= numbFuture ;
                    ELSE numbCorr <= zero; 
                    END IF;
                END IF;

            END PROCESS;



END;

Я думаю, что с этим кодом невозможно, что если текущее состояние «ноль», будущее состояние будет, например, «семь» (из программы просмотра FSM кажется, что это возможно). Это правильно или я не прав?

это FSM, созданный Quartus (numberState на итальянском, потому что мой исходный код был на итальянском языке)

...