VHDL - установка частоты дискретизации для сенсора

Товарищи пользователи 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.


person Triple777er    schedule 15.10.2012    source источник
comment
Что ж, вы должны предоставить больше данных об устройстве, к которому вы пытаетесь подключиться. Код мне кажется нормальным, но, не зная, с каким устройством вы собираетесь взаимодействовать, невозможно дать вам хороший ответ.   -  person FarhadA    schedule 15.10.2012


Ответы (1)


Трудно дать конкретный совет, не зная специфики устройства, к которому вы пытаетесь подключиться.

Тем не менее, пара общих комментариев по поводу вашего кода:

  • Ваш асинхронный процесс (PROCESS (CURR_STATE, INTR)) будет генерировать довольно много защелок при его синтезе, поскольку вы не устанавливаете все свои сигналы во всех случаях. WR и READ_DATA, например, не установлены в вашем состоянии WAIT10. Это, скорее всего, приведет к серьезным проблемам с синхронизацией, поэтому вам обязательно нужно исправить это.

  • Состояние WAIT10 в том же процессе даст вам комбинаторный цикл, поскольку он запускается всякий раз, когда COUNTER_WAIT обновляется. Поскольку это состояние также обновляет COUNTER_WAIT, теоретически оно будет продолжать работать, но на практике большинство синтезаторов просто выдадут вам ошибку (я думаю). Вместо этого вам нужно будет перенести инкремент на синхронный / синхронизированный процесс, что также даст вам контроль над продолжительностью каждого цикла.

  • Кажется, что ваши процессы с частотой 5 Гц работают на отдельных часах (CLK_5HZ). Я предполагаю, что остальная часть вашей системы работает быстрее? По сути, это дает вам два (или более) тактовых домена, которым потребуется специальная логика интерфейса для их взаимодействия друг с другом. Намного, гораздо лучшее решение - запускать все на одних и тех же (быстрых) часах и управлять более медленными процессами с помощью включения часов. Таким образом, все по своей сути синхронизировано и не должно преподносить вам неприятных временных сюрпризов.

person sonicwave    schedule 15.10.2012
comment
Большое спасибо за совет sonicwave. Остальная часть системы действительно работает с гораздо более быстрой тактовой частотой, и поэтому теперь неудивительно, что всякий раз, когда я пытаюсь использовать тактовую частоту 5 Гц для чтения значения «Y», я ничего не получаю. Я попробую то, что вы предложили. - person Triple777er; 15.10.2012