VHDL 状态机正在跳过状态

问题描述


我已经在 FPGA 上编写了 FSM,当我使用 iSim 运行模拟时,一切看起来都很好,当我在板上运行我的程序(我使用的是 Spartan SP605 Eval Kit)时,问题就开始了,在使用芯片示波器查找信号后,我发现当 ADV 信号应该为低电平时,它会跳过状态(参见下面的代码),并且它只是跟随该状态到下一个状态,因为它被卡住了。 我已经检查过了,我没有违反我的任何时间要求。

我的项目的一点点:
我正在使用 Cypres 板从 PC 接收和发送数据,那里的硬件正常工作。该板通过 FMC 互连板(也来自赛普拉斯)连接到 FPGA。该板包含两个缓冲区(FIFO;一个用于传输到 FPGA,一个用于从 FPGA 传输),FPGA 看到指示这些缓冲区状态的标志(标志 A - 已满,B - 部分已满,C - 空,D - 部分空) . FPGA 被配置为环回,它首先从板上读取所有数据,然后将这些数据传输给它。 标志为低电平有效。
我试图强制它在没有那些 if 的情况下运行(每个时钟周期都是新状态),并且它按预期工作(我从板上收到错误,说它试图从空缓冲区读取)

这是我的 State 机器代码的片段,它跳过的状态名为 ADDRRead。 如果您对完整代码感兴趣,我将其发布在 pastebin https://pastebin.pl/view/ae9b57ce
        process(currentFPGAMode,writeEnable,chipEnable,outputEnable,rdy,flagA,flagb,flagD,flagC,readEmptyDelayCnt,writeFullDelayCnt)
begin   
    case currentFPGAMode is
        when Idle =>
            if (flagc = '1') --check if buffer is avaible
            then
                nextFPGAMode <= waitFlagD;
            else
                nextFPGAMode <= Idle;
            end if;
        
        when waitFlagD =>
            --wait for data to appear in buffer (from PC)
            if (flagD = '1')
            then
                nextFPGAMode <= ADDRRead;
            else
                nextFPGAMode <= waitFlagD;
            end if;         
            
        when ADDRRead =>
            --setting up address bus to point on endpoint for read transfer
            nextFPGAMode <= OeDelay;
            
        when OeDelay =>
            --waiting for valid data
            if (rdy = '1')
            then
                nextFPGAMode <= FPGARead;
            else
                nextFPGAMode <= OeDelay;
            end if;
            
        when FPGARead =>
            --valid data data are avaible here  
            if (flagD = '1') --check if there are data to be read
            then
                nextFPGAMode <= FPGARead;
            else
                nextFPGAMode <= ReadEndDelay; 
            end if;
        
        when ReadEndDelay =>
            if (readEmptyDelayCnt = 0)
            then
                nextFPGAMode <= FPGAReadEnd;
            else
                nextFPGAMode <= ReadEndDelay;
            end if;
            
        when FPGAReadEnd =>
            --end read sequence
            nextFPGAMode <= waitFlagA;
            
        when waitFlagA =>
            --checking if DMA Buffer is empty
            if (flagA = '1')
            then
                nextFPGAMode <= ADDRWrite;
            else
                nextFPGAMode <= waitFlaga;
            end if;
            
        when ADDRWrite =>
            --seting address bus  to point at endpoint for writetransfer (address line = 3)
            nextFPGAMode <= WeDelay;    
                    
        when WeDelay =>
            --waiting for valid data to apear
            if (rdy = '1')
            then
                nextFPGAMode <= FPGAWrite;
            else
                nextFPGAMode <= WeDelay;
            end if;
            
        when FPGAWrite =>
            --data are avaible to apear
            if ( flagb = '0')
            then
                nextFPGAMode <= WriteEndDelay;
            else
                nextFPGAMode <= FPGAWrite;
            end if;
            
        when WriteEndDelay =>
            if (writeFullDelayCnt = 0)
            then
                nextFPGAMode <= RDYDelay;
            else
                nextFPGAMode <= WriteEndDelay;
            end if;
            
        when RDYDelay =>
            --Delay for rdy signal to deassert after finishing transfer 
            if (rdy = '0')
            then
                nextFPGAMode <= Idle;
            else
                nextFPGAMode <= RDYDelay;
            end if;
            
        when others =>
            nextFPGAMode <= Idle;           
    end case;
end process;
            

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)