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

时间:2019-03-01 17:41:49

标签: vhdl fpga state-machine

我正在做一个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条件为true,我们最终将值CONFIGURE_TEST_PATTERN分配给NEXT_ST。这样最终会在03行行中为同一变量(并行)分配两个不同的值。我是对还是错失了一些基本行为?之所以在第3行有该指令,是因为输入MODE_SIG_HIGH之后,可能需要一些时钟周期才能看到设置的模式位。

1 个答案:

答案 0 :(得分:2)

  

据我了解,当我们进入状态时,所有说明   该状态中包含的内容将并行执行。

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

  1. 过程
  2. 并发信号分配
  3. 组件实例
  4. 并发过程调用
  5. 并发断言(包括PSL)
  6. 产生

代码内部在流程或子程序(功能/程序)中依次执行 。在这里,您可以使用顺序语句(即上面列表中的 nothing )进行常规编程。这些是您的标准控制结构(ifcaseloop等),顺序信号分配,等等。如果在顺序区域中执行信号(或变量)分配,则最后一个将获胜,就像传统的编程语言一样。有一些调度规则可以使这种情况发生,但是您无需了解那些规则(还可以!)