0

SO用户,

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

现在,我正在以这样一种方式编写状态机,即使我改变湿度水平,ADC 也将始终继续保持输出值。但就我目前的实现而言,即使我循环回到第一个状态,我也没有得到连续的值流。我一次只能得到一个 8 位的值(IE;我必须不断按下重置按钮来更新 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”中,我循环回到开头(这样我可以在状态转换时不断读取值),但不知何故,我认为这不起作用。任何人都可以就如何解决这个问题提供一些帮助吗?

4

1 回答 1

2

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

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

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

于 2012-10-06T23:57:27.243 回答