Конечный автомат VHDL не зацикливается

Товарищи пользователи SO,

Я программирую свой АЦП (ADC0804, который установлен на макетной плате, подключенной к плате Spartan-3 FPGA). Теперь я использую этот АЦП для обеспечения цифрового выхода для моего датчика влажности. АЦП выводит 8-битное значение, которое я показываю на светодиодах на плате FPGA.

Теперь я пишу конечный автомат таким образом, чтобы АЦП всегда продолжал выводить значения, даже когда я меняю уровень влажности. Но что касается текущей реализации, у меня есть, хотя я возвращаюсь к первому состоянию, я не получаю непрерывный поток значений. Я получаю только одно 8-битное значение за раз (т.е. мне нужно постоянно нажимать кнопку сброса, чтобы обновить значение, отображаемое на светодиодах). Ниже приведен мой код.

FSM_NEXT_STATE_INIT :   PROCESS (CLK, RST)
                        BEGIN
                        IF (RST = '1') THEN
                           CURR_STATE <= STARTUP;
                        ELSIF (CLK'EVENT AND CLK = '1') THEN
                            CURR_STATE <= NEXT_STATE;
                        END IF;
                       END PROCESS;

START_FSM   :   PROCESS (CURR_STATE, INTR)
                BEGIN

                CASE CURR_STATE IS

                        WHEN STARTUP =>
                            NEXT_STATE <= CONVERT;
                            WR <= '0';
                            READ_DATA <= '0';


                        WHEN CONVERT =>
                            IF (INTR = '0') THEN
                                NEXT_STATE <= READ1;
                            ELSE
                                NEXT_STATE <= CONVERT;
                            END IF;
                            WR <= '1';
                            READ_DATA <= '0';


                        WHEN READ1 =>
                            NEXT_STATE <= READ2;
                            WR <= '1';
                            READ_DATA <= '1';

                        WHEN READ2 =>
                            NEXT_STATE <= STARTUP;
                            WR <= '1';
                            READ_DATA <= '0';

                        WHEN OTHERS =>
                            NEXT_STATE <= STARTUP;
                END CASE;
                END PROCESS;

                PROCESS (CLK, RST)
                BEGIN
                    IF (RST = '1') THEN
                        Y <= (OTHERS => '0');
                    ELSIF (CLK'EVENT AND CLK = '1') THEN
                        IF (READ_DATA = '1') THEN
                            Y <= D7&D6&D5&D4&D3&D2&D1&D0; --Concatenate the 8-bit ADC output
                        END IF;
                    END IF;
                END PROCESS;

Вы заметите, что в состоянии «READ2» я возвращаюсь к началу (чтобы я мог непрерывно читать значения по мере перехода состояний), но почему-то я не думаю, что это работает. Может ли кто-нибудь помочь в решении этой проблемы?


person Triple777er    schedule 06.10.2012    source источник
comment
Быстрые риторические вопросы: 1) вы застреваете в CONVERT, потому что INTR никогда не утверждается? 2) ваш FSM уходит в сорняки, потому что ваш сброс не отменен? (вы упомянули кнопку сброса)   -  person wjl    schedule 06.10.2012
comment
Привет, INTR — это сигнал, который утверждается самим АЦП после завершения преобразования. Что касается кнопки сброса, я просто использую ее для ручного обновления светодиодов, которые выводят 8-битное значение из АЦП. Итак, каждый раз, когда я нажимаю кнопку сброса и меняю влажность на датчике, значение на светодиодах будет меняться.   -  person Triple777er    schedule 06.10.2012


Ответы (1)


Изучив лист данных для ADC0804, я обнаружил следующее, что может быть / возможной причиной:

Примечание. Строб чтения должен появиться через 8 тактов (8/fCLK) после подтверждения прерывания, чтобы гарантировать сброс INTR.

Вставка состояния WAIT между CONVERT и READ1 может решить проблему.

person andrsmllr    schedule 06.10.2012
comment
Спасибо, я могу подтвердить, что это ответ. Я пробовал использовать плату арудино, вводя задержки, и это работает! Еще раз спасибо. - person Triple777er; 07.10.2012