首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL -设置传感器的采样率

VHDL -设置传感器的采样率
EN

Stack Overflow用户
提问于 2012-10-15 15:37:07
回答 1查看 848关注 0票数 0

各位SO用户:

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

我这样做的方式是让一个进程以5 5hz的频率运行,并在时钟的上升沿设置一个标志,比如"start_convert“到”1“,从而启动转换。

代码语言:javascript
复制
PROCESS (CLK_5HZ)       
BEGIN
    IF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
        START_CONVERT <= '1';
    END IF;
END PROCESS;

然后我有一个用于ADC的状态机;

代码语言:javascript
复制
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 5hz的过程来检测READ_DATA是否为1,这样我就可以从模数转换器中读取值。

代码语言:javascript
复制
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板连接模数转换器(ADC0804)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 17:54:41

当不知道你试图连接的设备的细节时,很难给出具体的建议。

然而,关于您的代码,有几个一般性的注释:

  • 您的异步进程( PROCESS (CURR_STATE, INTR))在合成它时将生成相当多的闩锁,因为您并没有在所有情况下都设置所有的信号。例如,WRREAD_DATA未设置为您的WAIT10状态。这很可能会导致严重的时间问题,所以纠正这个问题是你绝对想做的事情。
  • 在同一进程中的WAIT10状态会给你一个组合循环,因为它会在COUNTER_WAIT更新的时候运行。由于该状态也会更新COUNTER_WAIT,理论上它将继续运行,但实际上大多数合成器只会给你一个错误(我认为)。您将需要将递增转移到同步/时钟进程,这也将使您能够控制每个周期所需的时间。
  • 您的5 Hz进程似乎运行在单独的时钟(CLK_5HZ)上。我假设你的系统的其余部分正在以更快的时钟运行?这实际上给了你两个(或更多)时钟域,它们需要特殊的接口逻辑来相互连接。一个好得多的解决方案是在相同的(快速)时钟上运行所有东西,并使用时钟启用来控制较慢的进程。因此,每件事都是天生同步的,不应该给你带来任何令人讨厌的时间惊喜。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12891150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档