我正在进行一个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. ...我正在和我的一位朋友辩论什么是在新事件发生时改变状态的最好方法。在我看来,上面的解决方案似乎不对。据我所知,当我们进入一个sate时,包含在该状态中的所有指令都是并行执行的。因此,关于上面的代码,当我们输入状态MODE_SIG_HIGH时,第03行的指令将与IF条件并行执行。我的观点是,如果位S2设置为1,则if条件为true,我们最终将值CONFIGURE_TEST_PATTERN赋值给NEXT_ST。最后,将两个不同的值分配给同一个变量(并行),第03行和第07行中的。我是对的还是错过了一些基本的行为?在第3行有指令的原因是,在我们输入MODE_SIG_HIGH之后,可能需要一些时钟周期才能看到模式位集。
发布于 2019-03-02 10:51:47
据我所知,当我们进入一个sate时,包含在该状态中的所有指令都是并行执行的。
不完全是。VHDL中唯一并发的(“并行执行”)是:
进程或子程序(function/prodedure)中的代码按顺序执行。这是您使用顺序语句进行常规编程的地方。(上述清单中没有任何内容)。这些是您的标准控制结构(if、case、loop等)、顺序信号分配等等。如果您在一个顺序区域执行信号(或变量)分配,则最后一个任务将获胜,就像传统的编程语言一样。有一些调度规则可以使这种情况发生,但您不需要知道这些(还不需要!)
https://stackoverflow.com/questions/54949764
复制相似问题