我有一个使用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(®ION[4],1,temp);
}
else XGpio_DiscreteWrite(®ION[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()
,并且全部卡住。我所做的不是在操作功能中而是在主要状态中更改状态。