0

我有一个用 C 语言在 Microblaze 微处理器上设计状态机的课程。我遇到的问题是我必须改变某个画面。假设我在 FPGA 上按 BTNL;我必须在 5 秒内看到一张风景照片,在 3 秒后我必须让那张照片闪烁。同时,时间 5s -> 0s 必须显示在 7 段显示器上。这是检测到按钮并且必须显示闪烁模式的情况。中断每 0.004 秒发生一次,微处理器的时钟为 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 的这种行为,有什么想法。

感谢您花时间阅读问题!

4

1 回答 1

0

感谢 Craig,我确实更加关注 displayNumber() 函数是如何设置的。所以它出现在中断中,我只需要从其他地方驱动它。所以谢谢你指出正确的方向,克雷格!

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

因此,问题在于 ISR 的定义及其与DisplayNumber()func 的组合。

基本上,我的 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()并且它会全部卡住。我所做的不是在操作函数中而是在主函数中更改状态。

于 2015-11-23T15:53:06.810 回答