vhdl中process语句的顺序执行

2024-03-22

对于vhdl中的process语句,据说process语句内部的执行顺序是连续的。我的问题是,请先看下面的代码,a、b和c信号在进程语句中的if语句中是同时还是顺序分配给它们的新值?

   process(clk) is
   begin
   if rising_edge(clk) then
   a <= b ;
   b <= c ;
   c <= a;
   end if;
   end process;

因此,如果这是顺序的,我必须说,在进程结束后,a等于b,b等于c,c等于b,因为我们在将a分配给c之前将b分配给a。然而,这对于硬件来说似乎是不可能的。


构建一个包含您的流程的最小、完整且可验证的示例:

library ieee;
use ieee.std_logic_1164.all;

entity sequent_exec is
end entity;

architecture foo of sequent_exec is
    signal a:       std_ulogic := '1';
    signal b, c:    std_ulogic := '0';
    signal clk:     std_ulogic := '0';
begin
    CLOCK:
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if now > 200 ns then
            wait;
        end if;
    end process;
DUT:
    process(clk) is
    begin
    if rising_edge(clk) then
    a <= b ;
    b <= c ;
    c <= a;
    end if;
    end process;
end architecture;

我们将 a、b 和 c 的值从一个移位到另一个移位寄存器视为循环移位寄存器:

出现这种情况的原因与 VHDL 仿真周期的运行方式有关。

参见 IEEE 标准 1076-2008

10.5 简单信号分配(10.5.1 概述):

信号分配语句修改一个或多个信号的驱动器中包含的预计输出波形(见 14.7.2),安排一个或多个信号的强制,或安排一个或多个信号的释放(见 14.7.3)。

信号分配将新值排队以进行信号更新。 10.5.2.2 执行简单赋值语句描述了如何操作投影输出波形队列:

波形元素的评估产生单个事务。事务的时间分量由当前时间添加到波形元素中的时间表达式的值来确定。对于波形元素的第一种形式,交易的价值成分由波形元素中的价值表达来确定。

没有时间表达式的赋值是当前模拟时间。 (将发生增量周期 - 不提前仿真时间的仿真周期)。中描述的交易顺序 10.5.2.2 告诉我们同一模拟时间的旧交易被删除。

这意味着任何模拟时间都只有一个队列条目,并解释了为什么对特定信号的最后一次分配会导致事务(并为进程敏感的信号生成事件)。

14.7 模型的执行包含有关模拟周期如何运行的信息(14.7.5 模型执行)。

14.7.5.1 概述:

模型的执行由初始化阶段组成,随后重复执行该模型描述中的流程语句。每次这样的重复被称为一个模拟周期。在每个周期中,计算描述中的所有信号的值。如果计算结果是在给定信号上发生事件,则对该信号敏感的过程语句将恢复并作为模拟周期的一部分执行。

14.7.5.3 模拟周期描述了模拟周期,这里使用 IEEE Std 1076-1993 是为了简单起见,不与 VHPI 操作混淆:

12.6.4 模拟周期

模型的执行由初始化阶段组成,随后重复执行该模型描述中的流程语句。每次这样的重复被称为一个模拟周期。在每个周期中,计算描述中的所有信号的值。如果计算结果是在给定信号上发生事件,则对该信号敏感的过程语句将恢复并作为模拟周期的一部分执行。

在初始化开始时,当前时间 Tc 假设为 0 ns。

初始化阶段包括以下步骤:

-- 计算每个显式声明的信号的驱动值和有效值,并将信号的当前值设置为有效值。假定该值是仿真开始之前无限长时间内的信号值。

-- S'Stable(T) 或 S'Quiet(T) 形式的每个隐式信号的值设置为 True。 S'Delayed(T) 形式的每个隐式信号的值被设置为其前缀 S 的初始值。

-- 每个隐式 GUARD 信号的值设置为计算相应的 Guard 表达式的结果。

-- 模型中的每个非推迟进程都会执行,直到其挂起为止。

-- 模型中每个推迟的进程都会被执行,直到它挂起为止。

-- 下一个仿真周期(在本例中为第一个仿真周期)的时间 Tn 根据下面仿真周期步骤 f 的规则计算。

一个仿真周期由以下步骤组成:

A。当前时间 Tc 设置为等于 Tn。当 Tn= TIME'HIGH 并且 Tn 处没有活动驱动程序或进程恢复时,仿真完成。
b.模型中的每个活动显式信号都会更新。 (结果可能会在信号上发生事件。)
C。模型中的每个隐式信号都会更新。 (结果可能会在信号上发生事件。)
d.对于每个进程P,如果P当前对信号S敏感并且如果在该模拟周期中S上发生了事件,则P恢复。
e.在当前模拟周期中恢复的每个非推迟进程都会被执行,直到它挂起为止。
F。下一个仿真周期的时间 ​​Tn 通过将其设置为最早的时间来确定

  1. 时间高,
  2. 下次驱动程序变得活跃时,或者
  3. 进程下次恢复的时间。
  4. 如果 Tn = Tc,则下一个模拟周期(如果有)将是 delta 周期。

G。如果下一个模拟周期是增量周期,则跳过此步骤的剩余部分。否则,每个已恢复但自上次恢复以来尚未执行的推迟进程将被执行,直到其挂起。然后根据步骤f的规则重新计算Tn。如果任何推迟进程的执行导致在当前模拟周期之后立即发生增量周期,则这是一个错误。

信号值在进程执行期间不会改变。它们的更新被排队并在模拟周期执行的不同步骤中应用。

回到-2008年:

  1. 顺序语句,10.1 概述

本节描述了顺序语句的各种形式。顺序语句用于定义子程序或进程执行的算法;它们按照出现的顺序执行。

我们看到顺序信号分配执行的顺序与信号更新的顺序无关。

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

vhdl中process语句的顺序执行 的相关文章

  • Xilinx ISE 14.7 设置编辑器字体大小

    左上角 edit preference
  • 来自不同进程的VHDL驱动信号

    我对以下 VHDL 代码有一个小问题 process zbroji begin if rising edge zbroji then oduzima lt 0 ucitanPrvi lt 1 broj1 lt ulaz broj end i
  • 是否有理由在 VHDL 和 Verilog 中初始化(而不是重置)信号?

    我从未初始化过信号 这样 任何缺少重置或分配的信号都将是未知的或已初始化 在一些参考代码中它们有初始化 这违背了我的愿望 此外 由于初始化不可综合 因此可能会出现模拟 综合不匹配的情况 在这种情况下有什么理由初始化信号吗 编辑 2011 年
  • 如何使用依赖于实体的其他通用参数的通用参数?

    我正在尝试转换一些 Verilog 代码 这些代码为 UART 模块从较快的时钟生成较慢的时钟 原始的 verilog 代码基于 fpga4fun com 上的模块 这是我尝试将其转换为基于 VHDL 的设计 entity baud gen
  • 使用通用参数作为端口数组长度

    我想做的事 entity FIRfilter is generic NTAPS integer port h in array 0 to NTAPS 1 of std logic vector 15 downto 0 end FIRfitl
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • VHDL 中的行为模型程序和数据流模型程序之间的混淆

    我正在使用 Douglas L Perry 所著的教科书 VHDL 示例编程 第四版 他在第 4 页给出了 Dataflow 编程模型的示例 Code I ENTITY mux IS PORT a b c d IN BIT s0 s1 IN
  • Doxygen:使用 C++ 和 VHDL 进行项目的无缝文档

    我正在建立一个关于某种库的文档 该库由 C C 部分和 VHDL 部分以及一些仅包含 doxygen 的指导性页面组成 他们必须被放入一个独立的组中 到目前为止一切正常 漂亮又蓬松 但是如果我想通过使用优化 vhdl 子目录中的输出怎么办O
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • 如何将数组类型作为泛型类型参数传递给 VHDL 包?

    我正在 VHDL 2008 中开发通用包 列表 该包具有元素类型的泛型类型 如果我在包中声明此元素类型的数组类型 那么它就是一个新类型 所以对于例如整数 我的新整数数组将与 ieee 库中的整数向量不兼容 所以我还需要传入数组类型 例如in
  • 将库添加到 Vivado 2014.4

    我对 Vivado 和 VHDL 还很陌生 我想要一些关于基本问题的指导 我猜我可以创建自己的库并在我的项目中使用它们 就像使用默认库和基本库一样 eg library IEEE use IEEE std logic 1164 ALL us
  • 全8位加法器,非逻辑输出

    我创建了一个带全加器的 8 位加法器 正如您所看到的 我开始从右到左添加相应的位 对于 cin 信号 t1 和 t2 并按顺序 cout t2 和 t1 第一个 cin 设置为加法器输入 cin 我在实现中没有看到任何问题 但是当我运行它时
  • 赋值语句中的“others=>'0'”是什么意思?

    cmd register process rst n clk begin if rst n 0 then cmd r lt others gt 0 elsif clk event and clk 1 then cmd r lt end if
  • VHDL 中的进程是可重入的吗?

    一个进程是否可以连续运行两次或多次VHDL 如果在进程的顺序执行未完成的情况下发生另一个事件 在敏感信号列表上 会发生什么 有可能还是我的VHDL流程中的模型完全错误 进程运行时不会发生任何事件 当进程被事件唤醒时 它会运行到完成 结束进程
  • VHDL - 为什么直接在函数上使用长度属性会产生警告?

    我有一个 VHDL 函数 它返回记录的 std logic vector 表示形式 并且我想要该 std logic vector 的长度 我可以直接在函数上使用长度属性 为什么这会在 ModelSim 中产生警告 我是否会引发一些微妙的问
  • 学习 VHDL 的最佳方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • FPGA 系统中的同步与异步复位

    我刚开始使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线 尽管我认为这个问题适用于任何 FPGA 系统 并且所有模块都使用同步复位 这些模块使用时钟分频器模块进行计时 该模块获取系统时钟并向系统的其余部分输出较低的频率 我遇到的问
  • 设计用于初始化的VHDL状态机

    如何最明智地设计用于初始化芯片的 VHDL 状态机 我当前的设计是 伪代码 案例状态 当 s0 gt VHDL CODE FOR WRITING VALUE TO REGISTER状态 s1 当 s1 gt VHDL CODE FOR WR
  • VHDL:如何声明可变宽度通用[重复]

    这个问题在这里已经有答案了 我想创建一个 VHDL 实体 其中一个泛型可以更改另一个泛型的宽度 entity lfsr n is generic WIDTH integer 32 counter width POLYNOMIAL std l

随机推荐