问题描述
我已经在 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 (将#修改为@)