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