VHDL-设置传感器的采样率
各位SO用户: 我试图以5Hz的频率(每秒5个样本)对电阻式湿度传感器进行采样。我正在使用ADC读取输出。现在,我被告知,您可以在任何频率下运行ADC,但您需要使用5hz时钟来启动转换并从ADC读取值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
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
,理论上它会一直运行,但实际上大多数合成器只会给您一个错误(我认为)。您需要将递增改为同步/时钟进程,这也将让您控制每个周期所需的时间CLK_5HZ
)。我想你系统的其他部分运行的时钟快了吧?这本质上为您提供了两个(或更多)时钟域,它们需要特殊的接口逻辑来相互连接。一个非常非常好的解决方案是在相同(快速)时钟上运行所有程序,并使用时钟启用控制较慢的进程。因此,一切都是天生同步的,不应该给你任何令人讨厌的时间惊喜如果不知道要与之接口的设备的具体情况,就很难给出具体的建议 但是,对于您的代码,有几点一般性意见:
- 您的异步进程(
)在合成它时将生成相当多的锁存,因为您并不是在所有情况下都设置所有信号<例如,未在进程(CURR_STATE,INTR)
状态下设置code>WR和WAIT10
。这很可能会导致严重的时间问题,所以纠正这一点是你绝对想做的READ_DATA
- 同一进程中的
状态将为您提供一个组合循环,因为每当更新WAIT10
时,它都会运行。由于该状态也会更新COUNTER_WAIT
,理论上它会一直运行,但实际上大多数合成器只会给您一个错误(我认为)。您需要将递增改为同步/时钟进程,这也将让您控制每个周期所需的时间计数器_WAIT
- 您的5赫兹进程似乎在一个单独的时钟上运行(
)。我想你系统的其他部分运行的时钟快了吧?这本质上为您提供了两个(或更多)时钟域,它们需要特殊的接口逻辑来相互连接。一个非常非常好的解决方案是在相同(快速)时钟上运行所有程序,并使用时钟启用控制较慢的进程。因此,一切都是天生同步的,不应该给你任何令人讨厌的时间惊喜CLK_5HZ
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;