模拟器和合成器之间初始化状态机的差异

2024-01-11

我的问题是关于合成状态机中使用的第一个状态。

我正在使用莱迪思 iCE40 FPGA、用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer。

在下面的示例中,我生成一系列信号(该示例仅显示引用状态机的行)。这在模拟中效果很好;即访问的第一个案例是sm_init_lattice并产生所需的信号)。然而,合成版本直接进入sm_end并留在那里。结果,输出信号保持低电平。

-- state machine
type t_SM_peaks is (sm_init_lattice,
                    sm_high_start_up, sm_low_start_up, sm_peaks, sm_end);

signal r_SM_peaks : t_SM_peaks;

p_ARRAY_INTS_STDLOG_2D : process (i_Clk) is
begin
  if rising_edge(i_Clk) then
    case r_SM_peaks is
      when sm_init_lattice =>
        ...
        r_SM_peaks <= sm_high_start_up;
      when sm_high_start_up =>
        ...
        r_SM_peaks <= sm_low_start_up;  
      when sm_low_start_up =>
        ...
        r_SM_peaks <= sm_peaks;
      when sm_peaks =>
        ...
        r_SM_peaks <= sm_end;                        -- peaks completed
      when sm_end =>
        ...
        r_SM_peaks <= sm_end;
      when others =>
        r_SM_peaks <= sm_high_start_up;
    end case;
  end if;

end process p_ARRAY_INTS_STDLOG_2D;

但是,如果我进行如下更改(用“更改”表示),那么我会得到所需的一组信号。

type t_SM_peaks is (sm_init_lattice,
                    sm_high_start_up, sm_low_start_up, sm_end, sm_peaks);

signal r_SM_peaks : t_SM_peaks;

p_ARRAY_INTS_STDLOG_2D : process (i_Clk) is
begin
  if rising_edge(i_Clk) then 
    case r_SM_peaks is
      when sm_init_lattice =>
        ...
        r_SM_peaks <= sm_high_start_up;
      when sm_high_start_up =>
        ...
        r_SM_peaks <= sm_low_start_up;
      when sm_low_start_up =>
        ...
        r_SM_peaks <= sm_peaks;
      when sm_peaks =>
        ...
        r_SM_peaks <= sm_end;                        -- peaks completed
      when sm_end =>
        ...
        -- CHANGE - swapped 'sm_end' for 'sm_init_lattice'
        --r_SM_peaks <= sm_end;
        r_SM_peaks <= sm_init_lattice;             
      when others =>
        r_SM_peaks <= sm_high_start_up;             
    end case;
  end if;

end process p_ARRAY_INTS_STDLOG_2D;

谁能解释一下发生了什么事吗?难道我做错了什么?我将不胜感激任何建议。


在仿真中,VHDL 中的所有内容都默认为其左侧值。在你的代码中,那就是sm_init_lattice,这解释了为什么你的模拟会通过。

但是,我没有看到重置信号。因此,在您的硬件中,存储 FSM 状态的触发器将被重置为某些状态,但这可能不是代表状态的组合。sm_init_lattice state.

如果没有您的硬件更改,FSM 可能会初始化到接近的某个状态sm_end当它进入那种状态时,它就会留在那里。通过进行更改,您将允许 FSM 在赛道上绕更多圈,因此无论它最初发现自己处于什么状态,它都会在所有状态中前进。

解决方案是实施适当的重置(异步或同步 - FPGA 人们似乎更喜欢同步)。

使用枚举类型对状态机进行编码很好,因为代码易于阅读和维护,您不必进行任何状态编码,并且可以在波形显示上看到您所处的状态。但是,使用枚举类型对状态机进行编码并不能让您对统一状态进行建模,这可能是导致问题的原因。 System-Verilog 在这方面优于 VHDL,因为可以声明也可以是未知的枚举类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟器和合成器之间初始化状态机的差异 的相关文章

  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • 模拟抛硬币一周?

    这不是家庭作业 我有兴趣在 R 中设置抛硬币的模拟 我想运行该模拟一周 R 中是否有一个函数可以让我在一段时间内 例如一周 启动和停止模拟 如果一切顺利的话 我可能想增加模拟周期的长度 例如 x lt rbinom 10 1 1 2 所以要
  • 您可以使用类 C 语言对 FPGA 进行编程吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在大学里 我用类似 C 的语言编写了 FPGA 不过 我也知道人们通常使用 Verilog 或 VHD
  • 将库添加到 Vivado 2014.4

    我对 Vivado 和 VHDL 还很陌生 我想要一些关于基本问题的指导 我猜我可以创建自己的库并在我的项目中使用它们 就像使用默认库和基本库一样 eg library IEEE use IEEE std logic 1164 ALL us
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • VHDL - 分配默认值

    我有以下架构 architecture datapath of DE2 TOP is begin U1 entity work lab1 port map error on this line clock gt clock 50 key g
  • 种子设置:为什么输入不变后输出不同

    设置种子可确保再现性 并且在仿真建模中非常重要 考虑一个简单的模型f 有两个变量y1 and y2出于兴趣 这些变量的输出由随机过程决定 rbinom 和参数x1 and x2 两个感兴趣变量的输出彼此独立 现在假设我们想要将相应参数发生变
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • R 中的 set.seed() 和 .Random.Seed()

    我正在参加模拟课程 但我无法理解 R 中的 Random seed 我知道我们使用 set seed 以便模拟是可重现的 它本质上是我们的 PRNG 的初始值 有人可以向我解释 Random seed 的作用以及它为什么重要吗 例如我什么时
  • 在VHDL中将8位二进制数转换为BCD

    该算法众所周知 您进行 8 次左移 并在每次移位后检查个位 数十位或数百位 每个 4 位 如果它们超过 4 个 则将 3 个添加到该组中 依此类推 这是一个基于流程的解决方案 但不起作用 它会编译 但输出不是我想要的 有什么想法可能是什么问
  • 将 *.vhdl 编译到库中时出现编译器错误 - Altera Quartus II

    我已经从以下位置下载了浮点包http www vhdl org fphdl http www vhdl org fphdl 并做了以下事情 我在项目中包含了 math utility pkg vhd fixed pkg c vhd 和 fl
  • 使用 SUMO 场景的子集进行 OMNeT++ 网络模拟(使用 VEINS)

    我正在尝试使用 OMNeT Veins 和 SUMO 评估在车载网络上运行的应用程序 因为该应用程序依赖于现实的流量行为 所以我决定使用LuST场景 https github com lcodeca LuSTScenario 这似乎是此类数
  • vhdl中process语句的顺序执行

    对于vhdl中的process语句 据说process语句内部的执行顺序是连续的 我的问题是 请先看下面的代码 a b和c信号在进程语句中的if语句中是同时还是顺序分配给它们的新值 process clk is begin if risin
  • 学习 VHDL 的最佳方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • vhdl代码(for循环)

    描述 我想编写 vhdl 代码来查找数组 A 中的最大整数 该数组是一个由 20 个整数组成的数组 问题 我的算法应该是什么样子 以输入顺序语句的位置 我的VHDL代码 highnum for i in 0 to 19 loop i 0 i
  • numpy正半定警告

    在我正在编写的Python脚本中 我正在使用表达式模拟多元正态随机向量 np random multivariate normal np zeros dim obs y cov 我的脚本运行 但生成以下警告 RuntimeWarning c
  • VHDL 中的 #define 等价物是什么

    VHDL 中的 define ifdef 和 ifndef 相当于什么 我想使用泛型作为 define 并根据它们更改设计 举一个简单的例子 定义一个字符串泛型并用它来确定时钟是单时钟还是差分时钟 generic something boo
  • 在 R 中生成具有不同样本大小的多项式随机变量

    我需要生成具有不同样本大小的多项随机变量 假设我已经生成了样本大小 如下所示 samplesize c 50 45 40 48 然后我需要根据这个不同的样本大小生成多项随机变量 我尝试使用 for 循环并使用 apply 函数 sapply
  • 用几个 1 位 ALU 制作一个 4 位 ALU

    我正在尝试将几个 1 位 ALU 组合成一个 4 位 ALU 我对如何在 VHDL 中实际执行此操作感到困惑 这是我正在使用的 1 位 ALU 的代码 component alu1 define the 1 bit alu componen
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐