0

仲間のSOユーザー、

ADC(Spartan-3 FPGAボードに接続されたブレッドボードにマウントされているADC0804)をプログラミングしています。現在、このADCを使用して、湿度センサーにデジタル出力を提供しています。ADCは、FPGAボードのLEDに表示している8ビット値を出力します。

現在、湿度レベルを変更してもADCが常に値を出力し続けるようにステートマシンを作成しています。しかし、現在の実装に関しては、最初の状態にループバックしていますが、値の連続ストリームを取得していません。一度に取得できる8ビット値は1つだけです(つまり、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 のデータシートを調べたところ、考えられる理由として次のことがわかりました。

Note: 読み出しストローブは、INTR のリセットを保証するために、割り込みのアサート後 8 クロック周期 (8/fCLK) で発生する必要があります。

CONVERT と READ1 の間に WAIT 状態を挿入すると、問題が解決する場合があります。

于 2012-10-06T23:57:27.243 に答える