仲間の SO ユーザー、
抵抗湿度センサーを 5 Hz (1 秒あたり 5 サンプル) の頻度でサンプリングしようとしています。出力を読み取るためにADCを使用しています。現在、ADC は任意の周波数で実行できると言われていますが、変換を開始して ADC から値を読み取るには 5Hz クロックを使用する必要があります。
私がこれを行っている方法は、5hz で実行し、クロックの立ち上がりエッジで「start_convert」を「1」にするフラグを持つことによって変換を開始するプロセスを持つことです。
PROCESS (CLK_5HZ)
BEGIN
IF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
START_CONVERT <= '1';
END IF;
END PROCESS;
そして、ADC 用のステート マシンがあります。
PROCESS (CURR_STATE, INTR)
BEGIN
CASE CURR_STATE IS
WHEN STARTUP =>
WR <= '0';
READ_DATA <= '0';
IF (START_CONVERT = '1') THEN
NEXT_STATE <= CONVERT;
ELSE
NEXT_STATE <= STARTUP;
END IF;
WHEN CONVERT =>
IF (INTR = '0' AND STREAM = '1') THEN
NEXT_STATE <= WAIT500;
ELSIF (INTR = '0' AND STREAM = '0') THEN
NEXT_STATE <= READ1;
ELSE
NEXT_STATE <= CONVERT;
END IF;
WR <= '1';
READ_DATA <= '0';
WHEN WAIT10 =>
IF (COUNTER_WAIT = 10) THEN
NEXT_STATE <= READ1;
ELSE
NEXT_STATE <= WAIT10;
END IF;
COUNTER_WAIT <= COUNTER_WAIT + 1;
WHEN READ1 =>
NEXT_STATE <= CONVERT;
WR <= '1';
READ_DATA <= '1';
WHEN OTHERS =>
NEXT_STATE <= STARTUP;
END CASE;
END PROCESS;
そして、5hz で別のプロセスを使用して、READ_DATA が 1 であることを検出し、ADC から値を読み取っています。
PROCESS (CLK_5HZ, RST)
BEGIN
IF (RST = '1') THEN
Y <= (OTHERS => '0');
ELSIF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
IF (READ_DATA = '1') THEN
Y <= DATA_IN (0) & DATA_IN (1) &
DATA_IN (2) & DATA_IN (3) &
DATA_IN (4) & DATA_IN (5) &
DATA_IN (6) & DATA_IN (7);
END IF;
END IF;
END PROCESS;
これが正しいアプローチであるかどうか、誰かにアドバイスしてもらえますか?
編集: Spartan-3 ボードを使用して ADC (ADC0804) に接続しています。