在VHDL中更改状态机状态的正确方法

问题描述 投票:0回答:1

我正在开发一个FPGA项目,我需要从图像传感器读取数据。该传感器具有不同的图像模式(如测试图案,帧,分级等),为了改变图像模式,我需要在写入寄存器之前查找特定信号。

我继承了一些我需要修复的代码,因为当我们改变图像模式时,图像传感器有时会卡住。

关于图像模式的改变,使用状态机。

下面的代码显示了当前如何写入更改模式的寄存器。基本上,当我们想要改变模式时,我们需要等待信号MODE_SIG_HIGH变为高电平才能写入寄存器。然后,当这种情况发生时,我们检查我们想要设置的模式。例如,要设置设置测试模式,我们检查是否设置了位S2。然后我们执行所有操作以实际改变模式(第10行)。

01. ...
02. WHEN MODE_SIG_HIGH =>
03.   NEXT_ST <= MODE_SIG_HIGH;
04.   ...
05.   IF S2 = '1' THEN 
06.     -- configure the sensor to            
07.     NEXT_ST <= CONFIGURE_TEST_PATTERN;
08.   END IF; 
09.   ...
10.   WHEN CONFIGURE_TEST_PATTERN =>
11.   ...

我和我的一个朋友正在讨论在新事件发生时改变状态的最佳方法。上述解决方案对我来说似乎不对。据我所知,当我们输入状态时,该状态中包含的所有指令都是并行执行的。因此,关于上述代码,当我们进入状态MODE_SIG_HIGH时,行03的指令与IF条件并行执行。我的观点是,如果位S2设置为1,则IF条件为真,我们最终将值CONFIGURE_TEST_PATTERN分配给NEXT_ST。这最终会在同一个变量(并行),第03行和第07行中分配两个不同的值。我是对还是我错过了一些基本行为?在第3行进行指令的原因是因为在我们输入MODE_SIG_HIGH之后,在我们看到模式位设置之前可能需要一些时钟周期。

vhdl fpga state-machine
1个回答
2
投票

据我所知,当我们输入状态时,该状态中包含的所有指令都是并行执行的。

不完全的。 VHDL中唯一并发(“并行执行”)的东西是:

  1. 流程
  2. 并发信号分配
  3. 组件实例化
  4. 并发过程调用
  5. 并发断言(inc.PSL)
  6. 生成

进程或子程序(function / prodedure)中的代码按顺序执行。这是使用顺序语句进行常规编程的地方(即上面列表中没有任何内容)。这些是您的标准控制结构(ifcaseloop等),顺序信号分配等。如果在顺序区域中执行信号(或变量)分配,则最后一个分配胜利,就像传统的编程语言一样。有调度规则可以实现这一点,但你不需要知道那些(还是!)

© www.soinside.com 2019 - 2024. All rights reserved.