用VHDL改变状态机状态的正确方法

用VHDL改变状态机状态的正确方法,vhdl,fpga,state-machine,Vhdl,Fpga,State Machine,我正在做一个FPGA项目,需要从图像传感器读取数据。该传感器具有不同的图像模式(如测试模式、帧、装箱等),为了改变图像模式,我需要在写入寄存器之前查找特定信号 我继承了一些需要修复的代码,因为当我们改变图像模式时,图像传感器有时会卡住 关于图像模式的改变,使用了状态机 下面的代码显示了当前如何写入用于更改模式的寄存器。 本质上,当我们想要改变模式时,我们需要等待信号模式变高,然后再写入寄存器。然后,当这种情况发生时,我们检查要设置的模式。例如,为了设置测试模式,我们检查是否设置了位S2。然后我们

我正在做一个FPGA项目,需要从图像传感器读取数据。该传感器具有不同的图像模式(如测试模式、帧、装箱等),为了改变图像模式,我需要在写入寄存器之前查找特定信号

我继承了一些需要修复的代码,因为当我们改变图像模式时,图像传感器有时会卡住

关于图像模式的改变,使用了状态机

下面的代码显示了当前如何写入用于更改模式的寄存器。 本质上,当我们想要改变模式时,我们需要等待信号模式变高,然后再写入寄存器。然后,当这种情况发生时,我们检查要设置的模式。例如,为了设置测试模式,我们检查是否设置了位S2。然后我们执行所有操作以实际更改模式(第10行)

01。。。
2当模式信号高=>
3下一个
据我所知,当我们进入状态时,所有的指令
包含在该状态中的数据将并行执行

不完全是。VHDL中唯一并发(“并行执行”)的是:

  • 进程
  • 并发信号分配
  • 组件实例化
  • 并发过程调用
  • 并发断言(inc.PSL)
  • 产生
  • 进程或子程序(函数/过程)中的代码按顺序执行。这是使用顺序语句进行常规编程的地方(即,上面列表中没有任何内容)。这些是您的标准控制结构(
    if
    case
    loop
    等)、顺序信号分配等。如果您在一个连续的区域中执行信号(或变量)赋值,最后一个就赢了,就像传统的编程语言一样。有一些计划规则可以实现这一点,但您不需要知道这些规则(现在!)

    据我所知,当我们进入状态时,所有的指令 包含在该状态中的数据将并行执行

    不完全是。VHDL中唯一并发(“并行执行”)的是:

  • 进程
  • 并发信号分配
  • 组件实例化
  • 并发过程调用
  • 并发断言(inc.PSL)
  • 产生

  • 进程或子程序(函数/过程)中的代码按顺序执行。这是使用顺序语句进行常规编程的地方(即,上面列表中没有任何内容)。这些是您的标准控制结构(
    if
    case
    loop
    等)、顺序信号分配等。如果您在一个连续的区域中执行信号(或变量)赋值,最后一个就赢了,就像传统的编程语言一样。有一些调度规则可以实现这一点,但您不需要知道这些(但!)

    信号只接受分配给它的最后一个值,因为第二个赋值会覆盖第一个赋值。只有进程和单行分配“并行”运行。流程内的代码是连续的(在相同的增量周期内)。因此,如果s2='0',那么它将保持相同的状态。如果s2='1',则它将进入configure_test_模式状态。这是一种非常标准的编码技术。相同的模拟周期,而不是增量周期。IEEE Std 1076-2008 10.5.2.2执行简单赋值语句第7段“a)从预测输出波形中删除预计在最早的新事务发生时或之后发生的所有旧事务。“任何模拟时间只有一个预测输出波形队列位置,包括当前时间。第一次下一次赋值可被视为默认值,并防止推断锁存。10.5.2.2执行简单赋值语句第4段的部分“……如果波形元素的after子句不存在,则假定隐式“0 ns后”……赋值时间与当前模拟时间相关。信号值不会在同一模拟周期内更新,它会更新预测输出波形(14.7.5模型执行,14.7.5.3模拟周期第1段步骤c),d),f)2)。在恢复流程执行之前更新驱动程序。它允许在驱动程序更新之前覆盖投影输出波形。这里不出现这个问题。不是特定的编程问题,也不是程序员常用的软件算法或软件工具;这是一个实际的、可回答的问题,是软件开发所特有的。它可以修改为一个特定的编程问题,请参阅。信号只接受分配给它的最后一个值,因为第二个赋值会覆盖第一个赋值。只有进程和单行分配“并行”运行。流程内的代码是连续的(在相同的增量周期内)。因此,如果s2='0',那么它将保持相同的状态。如果s2='1',则它将进入configure_test_模式状态。这是一种非常标准的编码技术。相同的模拟周期,而不是增量周期。IEEE Std 1076-2008 10.5.2.2执行简单赋值语句第7段“a)从预测输出波形中删除预计在最早的新事务发生时或之后发生的所有旧事务。“任何模拟时间只有一个预测输出波形队列位置,包括当前时间。第一次下一次赋值可被视为默认值,并防止推断锁存。10.5.2.2执行简单赋值语句第4段的部分“……如果波形元素的after子句不存在,则假定隐式“0 ns后”……赋值时间与当前模拟时间相关。信号值不会在同一模拟周期内更新
    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.   ...