VHDL-设置传感器的采样率

VHDL-设置传感器的采样率,vhdl,sensors,sampling,rate,adc,Vhdl,Sensors,Sampling,Rate,Adc,各位SO用户: 我试图以5Hz的频率(每秒5个样本)对电阻式湿度传感器进行采样。我正在使用ADC读取输出。现在,我被告知,您可以在任何频率下运行ADC,但您需要使用5hz时钟来启动转换并从ADC读取值 PROCESS (CLK_5HZ, RST) BEGIN IF (RST = '1') THEN Y <= (OTHERS => '0'); ELSIF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN IF

各位SO用户:

我试图以5Hz的频率(每秒5个样本)对电阻式湿度传感器进行采样。我正在使用ADC读取输出。现在,我被告知,您可以在任何频率下运行ADC,但您需要使用5hz时钟来启动转换并从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;
我这样做的方式是通过一个进程启动转换,该进程以5hz的频率运行,并在时钟上升沿上有一个标志,比如“start_convert”到“1”

PROCESS (CLK_5HZ)       
BEGIN
    IF (CLK_5HZ'EVENT AND CLK_5HZ = '1') THEN
        START_CONVERT <= '1';
    END IF;
END PROCESS;
过程(时钟5HZ)
开始
如果(CLK_5HZ'事件和CLK_5HZ='1'),则
开始转换

WR如果不知道要与之接口的设备的具体情况,就很难给出具体的建议

但是,对于您的代码,有几点一般性意见:

  • 您的异步进程(
    进程(CURR_STATE,INTR)
    )在合成它时将生成相当多的锁存,因为您并不是在所有情况下都设置所有信号<例如,未在
    WAIT10
    状态下设置code>WR
READ_DATA
。这很可能会导致严重的时间问题,所以纠正这一点是你绝对想做的

  • 同一进程中的
    WAIT10
    状态将为您提供一个组合循环,因为每当更新
    COUNTER_WAIT
    时,它都会运行。由于该状态也会更新
    计数器_WAIT
    ,理论上它会一直运行,但实际上大多数合成器只会给您一个错误(我认为)。您需要将递增改为同步/时钟进程,这也将让您控制每个周期所需的时间

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


  • 如果不知道要与之接口的设备的具体情况,就很难给出具体的建议

    但是,对于您的代码,有几点一般性意见:

    • 您的异步进程(
      进程(CURR_STATE,INTR)
      )在合成它时将生成相当多的锁存,因为您并不是在所有情况下都设置所有信号<例如,未在
      WAIT10
      状态下设置code>WR和
      READ_DATA
      。这很可能会导致严重的时间问题,所以纠正这一点是你绝对想做的

    • 同一进程中的
      WAIT10
      状态将为您提供一个组合循环,因为每当更新
      COUNTER_WAIT
      时,它都会运行。由于该状态也会更新
      计数器_WAIT
      ,理论上它会一直运行,但实际上大多数合成器只会给您一个错误(我认为)。您需要将递增改为同步/时钟进程,这也将让您控制每个周期所需的时间

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


    好的,您必须提供更多关于您尝试连接的设备的数据。代码对我来说似乎没问题,但是如果不知道要与什么设备进行接口,就不可能给你一个好的答案。好吧,你必须提供更多关于你尝试接口的设备的数据。代码对我来说似乎没问题,但是如果不知道要与什么设备进行接口,就不可能给你一个好的答案。非常感谢sonicwave的建议。系统的其余部分确实以更快的时钟运行,因此现在,每当我尝试使用5Hz时钟读取“Y”的值时,我都一无所获,这一点也不奇怪。我会试试你的建议。非常感谢你的建议。系统的其余部分确实以更快的时钟运行,因此现在,每当我尝试使用5Hz时钟读取“Y”的值时,我都一无所获,这一点也不奇怪。我会试试你的建议。
    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;