我正在做一个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之后,可能需要一些时钟周期才能看到设置的模式位。
答案 0 :(得分:2)
据我了解,当我们进入状态时,所有说明 该状态中包含的内容将并行执行。
不完全是。 VHDL中唯一并发的(“并行执行”)是:
代码内部在流程或子程序(功能/程序)中依次执行 。在这里,您可以使用顺序语句(即上面列表中的 nothing )进行常规编程。这些是您的标准控制结构(if
,case
,loop
等),顺序信号分配,等等。如果在顺序区域中执行信号(或变量)分配,则最后一个将获胜,就像传统的编程语言一样。有一些调度规则可以使这种情况发生,但是您无需了解那些规则(还可以!)