【问题标题】:VHDL - setting sampling rate for a sensorVHDL - 设置传感器的采样率
【发布时间】:2012-10-05 03:54:33
【问题描述】:

SO 用户,

我正在尝试以 5Hz 的频率(每秒 5 个样本)对我的电阻式湿度传感器进行采样。我正在使用 ADC 读取输出。现在,有人告诉我,您可以以任何频率运行 ADC,但您需要使用 5hz 时钟来启动转换并从 ADC 读取值。

我这样做的方式是让一个进程通过以 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)。

【问题讨论】:

  • 好吧,您必须提供更多有关您尝试连接的设备的数据。代码对我来说似乎没问题,但不知道你要与什么设备交互,不可能给你一个好的答案。

标签: vhdl sensors sampling rate adc


【解决方案1】:

如果您不知道您要连接的设备的具体情况,很难给出具体的建议。

但是,关于您的代码的几个通用 cmets:

  • 您的异步进程(PROCESS (CURR_STATE, INTR))在合成时会生成很多锁存器,因为您并非在所有情况下都设置了所有信号。例如,WRREAD_DATA 未设置为 WAIT10 状态。这很可能会导致严重的时间问题,因此您绝对想要纠正这个问题。

  • 同一进程中的WAIT10 状态将为您提供一个组合循环,因为它会在COUNTER_WAIT 更新时运行。由于该状态也会更新COUNTER_WAIT,理论上它会继续运行,但实际上大多数合成器只会给你一个错误(我认为)。您需要将增量转移到同步/时钟过程,这也可以让您控制每个周期需要多长时间。

  • 您的 5 Hz 进程似乎在单独的时钟上运行 (CLK_5HZ)。我认为您系统的其余部分正在以更快的时钟运行?这实质上为您提供了两个(或更多)时钟域,它们需要特殊的接口逻辑来将它们相互连接。一个更好的解决方案是在相同(快速)时钟上运行所有内容,并使用时钟启用来控制较慢的进程。因此,一切都是天生同步的,不应该给你任何令人讨厌的时间惊喜。

【讨论】:

  • 非常感谢 sonicwave 的建议。系统的其余部分确实以更快的时钟运行,因此现在毫不奇怪,每当我尝试使用 5Hz 时钟来读取“Y”的值时,我什么也得不到。我会尝试你的建议。
猜你喜欢
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多