我有一个使用C语言在Microblaze微处理器上设计状态机的课程。我遇到的问题是,我必须更改某些图片。假设我在FPGA上按了BTNL。我必须得到一张风景图片5秒钟,并且在3秒钟后我必须使该图片闪烁。同时,必须在7段显示器上显示5s-> 0s时间。在这种情况下,已经检测到按钮并且必须显示闪烁模式。
中断每0.004s发生一次
微处理器的时钟为100MHz。

for(j=0; j<=5secs; j++)
{
    if(j>3secs)
    {
        if(counter == sec){
            counter=0;
            if(temp==white){ //white background
                temp=background;
            }
            else temp=white;
        }else counter++;
        XGpio_DiscreteWrite(&REGION[4],1,temp);
    }
    else XGpio_DiscreteWrite(&REGION[4],1,temp);
    if(j==5secs)
        states = IDLE;
}


我的主要问题是在7段显示器上显示数字。当我将displayNumber()函数放在这种情况下时,一旦转到displayNumber()行,整个东西就会冻结。我知道嵌套的for循环会花费大量时间和精力,并且我认为这可能会导致问题,但是我找不到有效的解决方案。任何想法或建议都非常感谢。

另一件事是我尝试了一个标志,但是由于中断处理,它不起作用。

编辑:
我没有试图获得我的问题的复制/粘贴解决方案。整个过程相当庞大,我的意思是verilog项目以及在c中完成的其他功能的文件。我没想到您会运行代码并复制整个内容,因为学校为我提供了Verilog项目,因此您必须生成一个比特流,然后在板上上传并运行整个内容。我在这里只是想提出一个建议,关于您在使用FPGA遇到这种行为时有什么想法,您将如何改进它。

感谢您花时间阅读问题!

最佳答案

多亏了克雷格(Craig),我确实更加关注如何设置displayNumber()函数。结果发现它卡在了中断中,我只需要从其他地方驱动它即可。所以,谢谢您指出正确的方向,克雷格!

如果您认为这可能对其他人没有帮助,请告诉我,以便将其删除。

因此,问题在于ISR的定义及其与DisplayNumber()函数的结合。

基本上,我的ISR如下所示:

void hwTimerISR(void *CallbackRef)
{
interruptServiced = FALSE;
interruptCounter++;
if (interruptCounter == 1)
{
    interruptCounter = 0;
    displayDigit(); //needed to display the number on the display
    operation(state); // function that moves the FSM's states
    interruptServiced = TRUE;
}

return;
}


基本上,问题是在不得不中断5秒钟的情况下,displayNumber函数将调用displayDigit(),并且全部卡住。我所做的不是在操作功能中而是在主要状态中更改状态。

10-08 01:17