SO用户,
我正在编程我的ADC(ADC0804,它安装在连接到Spartan-3 FPGA板的面包板上)。现在,我正在使用这个ADC为我的湿度传感器提供数字输出。 ADC输出一个8位值,我正在FPGA板上的LED上显示。
现在,我正在以这样的方式编写状态机,即使我改变湿度水平,ADC也会一直继续保持输出值。但至于我目前的实现,尽管我循环回到第一个状态,但我没有得到连续的值流。我一次只得到一个8位值(I.E。;我必须按住重置按钮来更新LED上显示的值)。以下是我的代码。
FSM_NEXT_STATE_INIT : PROCESS (CLK, RST)
BEGIN
IF (RST = '1') THEN
CURR_STATE <= STARTUP;
ELSIF (CLK'EVENT AND CLK = '1') THEN
CURR_STATE <= NEXT_STATE;
END IF;
END PROCESS;
START_FSM : PROCESS (CURR_STATE, INTR)
BEGIN
CASE CURR_STATE IS
WHEN STARTUP =>
NEXT_STATE <= CONVERT;
WR <= '0';
READ_DATA <= '0';
WHEN CONVERT =>
IF (INTR = '0') THEN
NEXT_STATE <= READ1;
ELSE
NEXT_STATE <= CONVERT;
END IF;
WR <= '1';
READ_DATA <= '0';
WHEN READ1 =>
NEXT_STATE <= READ2;
WR <= '1';
READ_DATA <= '1';
WHEN READ2 =>
NEXT_STATE <= STARTUP;
WR <= '1';
READ_DATA <= '0';
WHEN OTHERS =>
NEXT_STATE <= STARTUP;
END CASE;
END PROCESS;
PROCESS (CLK, RST)
BEGIN
IF (RST = '1') THEN
Y <= (OTHERS => '0');
ELSIF (CLK'EVENT AND CLK = '1') THEN
IF (READ_DATA = '1') THEN
Y <= D7&D6&D5&D4&D3&D2&D1&D0; --Concatenate the 8-bit ADC output
END IF;
END IF;
END PROCESS;
你会注意到在状态'READ2'中,我循环回到开头(这样我可以在状态转换时继续读取值)但不知何故我不认为这是有效的。有谁可以请求如何解决这个问题?
答案 0 :(得分:2)
在查看ADC0804的数据表后,我发现以下可能是/可能的原因:
注:在断言中断后,读取选通必须发生8个时钟周期(8 / fCLK),以保证INTR复位。
在CONVERT和READ1之间插入WAIT状态可能会解决问题。