Товарищи пользователи SO,
Я пытаюсь измерить свой резистивный датчик влажности с частотой 5 Гц (5 выборок в секунду). Я использую АЦП для чтения вывода. Мне сказали, что вы можете запускать АЦП на любой частоте, но вам нужно использовать тактовую частоту 5 Гц, чтобы инициировать преобразование и считывать значения с АЦП.
Я делаю это, имея процесс, который инициирует преобразование, работая на частоте 5 Гц и имея флаг, скажем, "start_convert" на "1" на переднем фронте тактового сигнала.
PROCESS (CLK_5HZ)
BEGIN
IF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
START_CONVERT <= '1';
END IF;
END PROCESS;
А еще у меня есть конечный автомат для АЦП;
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;
Затем я использую другой процесс с частотой 5 Гц, чтобы определять, когда READ_DATA равен 1, чтобы я считывал значения с АЦП.
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;
Может ли кто-нибудь посоветовать мне, правильный это подход или нет?
РЕДАКТИРОВАТЬ: Я подключаю АЦП (ADC0804) с помощью платы Spartan-3.