VHDL状态机没有循环

时间:2012-10-06 02:37:37

标签: vhdl fsm

SO用户,

我正在编程我的ADC(ADC0804,它安装在连接到Spartan-3 FPGA板的面包板上)。现在,我正在使用这个ADC为我的湿度传感器提供数字输出。 ADC输出一个8位值,我正在FPGA板上的LED上显示。

现在,我正在以这样的方式编写状态机,即使我改变湿度水平,ADC也会一直继续保持输出值。但至于我目前的实现,尽管我循环回到第一个状态,但我没有得到连续的值流。我一次只得到一个8位值(I.E。;我必须按住重置按钮来更新LED上显示的值)。以下是我的代码。

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'中,我循环回到开头(这样我可以在状态转换时继续读取值)但不知何故我不认为这是有效的。有谁可以请求如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在查看ADC0804的数据表后,我发现以下可能是/可能的原因:

注:在断言中断后,读取选通必须发生8个时钟周期(8 / fCLK),以保证INTR复位。

在CONVERT和READ1之间插入WAIT状态可能会解决问题。