2012-10-06 98 views
0

研究员SO用户,VHDL状态机不循环

我编程我的ADC(其被安装在连接到的Spartan-3 FPGA板面包板ADC0804)。现在,我正在使用此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”,我循环回到开始(这样我就可以继续保持读数值的状态转移),但不知何故,我不认为这是工作。任何人都可以提供一些关于如何解决这个问题的帮助?

+1

快速修辞问题:1)你是否陷入了CONVERT,因为INTR从未被断言过? 2)你的密歇根大学是否会因为你的重置没有被消除而掉进杂草? (你提到了一个复位*按钮*) – wjl

+0

嗨,INTR是一个信号,一旦转换完成,由ADC自己声明。 至于重置按钮,我只是用它来手动更新从ADC输出8位值的LED。因此,每次按下重置按钮并改变传感器上的湿度时,LED上的值都会改变。 – Triple777er

回答

2

因为我发现下面这可能是/一个可能的原因ADC0804的数据表上后一看:

注:读选的中断断言后必须出现8个时钟周期(8/FCLK)保证INTR的重置。

在CONVERT和READ1之间插入WAIT状态可能会解决问题。

+0

谢谢,我可以确认这是答案。我尝试过使用arudino板来引入延迟,并且这个工作正常!再次感谢。 – Triple777er