【发布时间】:2019-07-23 18:56:44
【问题描述】:
我正在处理一个需要从图像传感器读取数据的 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 之后,可能需要一些时钟周期才能看到设置的模式位。
【问题讨论】:
-
信号只取最后一个赋值给它,因为第二个赋值会覆盖第一个。只有“并行”运行的进程和单行分配。进程中的代码是顺序的(在同一个增量周期内)。因此,如果 s2 = '0',那么它将保持相同的状态。如果 s2 = '1',那么它将进入 configure_test_pattern 状态。这是一种非常标准的编码技术。
-
相同的模拟周期,而不是增量周期。 IEEE Std 1076-2008 10.5.2.2 执行简单的赋值语句第 7 段“a) 从预计的输出波形中删除预计在最早的新事务预计发生的时间或之后发生的所有旧事务。”任何仿真时间(包括当前时间)都只有一个投影输出波形队列位置。第一个 NEXT_ST 分配可以被视为默认值并防止推断锁存器。
-
10.5.2.2 在“...”部分执行简单的赋值语句第 4 段,如果波形元素的 after 子句不存在,则隐含的“after 0 ns”是假定的。...”分配时间是相对于当前的仿真时间。信号值不会在更新投影输出波形的同一 模拟 周期中更新(14.7.5 模型执行,14.7.5.3 模拟周期第 1 步 c)、d)、f) 2)) .在流程执行恢复之前更新驱动程序。它允许在驱动程序更新之前覆盖投影的输出波形。
-
这里没有出现on-topic这个问题。不是特定的编程问题,也不是软件算法,也不是程序员常用的软件工具;并且是软件开发所特有的一个实用的、可回答的问题。可以修改为具体的编程问题,见How to Ask。
标签: vhdl fpga state-machine