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

Proper way to change state on a state machine in VHDL

我正在做一个 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 之后,可能需要一些时钟周期才能看到设置的模式位。

As far as I understood, when we enter a sate, all the instructions contained in that state are performed in parallel.

不完全是。 VHDL 中唯一并发的 ('performed in parallel') 是:

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

进程或子程序 (function/prodedure) 中的代码顺序执行。这是您使用顺序语句(即上面列表中的 nothing)进行常规编程的地方。这些是您的标准控制结构(ifcaseloop 等)、顺序信号分配等。如果您在顺序区域中执行信号(或变量)分配,最后一个将获胜,就像传统的编程语言一样。有一些安排规则可以实现这一点,但您不需要了解这些(现在!)