请澄清VHDL中顺序和并发执行的概念

Posted

技术标签:

【中文标题】请澄清VHDL中顺序和并发执行的概念【英文标题】:Please, clarify the concept of sequential and concurrent execution in VHDL 【发布时间】:2016-07-07 00:13:21 【问题描述】:

我在学校熟悉了一点 Verilog,一年后,我买了一块 Basys 3 FPGA 板。我的目标是学习 VHDL。

我一直在阅读一本名为“Free Range VHDL”的免费书籍,它对理解 VHDL 语言有很大帮助。我还搜索了包含 VHDL 代码的 github repos 以供参考。

我最关心的是顺序执行和并发执行之间的区别。我理解这两个词的含义,但我仍然无法想象为什么我们可以将“过程”用于组合逻辑(即七段解码器)。我已经将我的七段解码器实现为并发语句的条件分配。 如果我使用进程和switch语句来实现解码器会有什么区别?我不理解组合逻辑中进程的顺序执行这个词。如果是顺序机——状态机,我会理解的。

有人能解释一下这个概念吗?

这是我的七段解码器代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity hex_display_decoder is
    Port ( D: in STD_LOGIC_VECTOR (3 downto 0);
       SEG_OUT : out STD_LOGIC_VECTOR (6 downto 0));
end hex_display_decoder;

architecture dataflow of hex_display_decoder is
begin
  with D select
      SEG_OUT <=  "1000000" when "0000",
                  "1111001" when "0001",
                  "0100100" when "0010",
                  "0110000" when "0011",
                  "0011001" when "0100",
                  "0010010" when "0101",
                  "0000010" when "0110",
                  "1111000" when "0111",
                  "0000000" when "1000",
                  "0010000" when "1001",
                  "0001000" when "1010",
                  "0000011" when "1011",
                  "1000110" when "1100",
                  "0100001" when "1101",
                  "0000110" when "1110",
                  "0001110" when "1111",
                  "1111111" when others;
end dataflow;

谢谢,

杰克·赫拉迪克

【问题讨论】:

参见 IEEE Std 1076-2008 11.6 并发信号赋值语句 “并发信号赋值语句代表一个等效的过程语句,它为信号赋值。”其他并发语句部分将描述如何为模拟/综合详细说明它们。所有精心设计的模型都通过执行顺序语句进行模拟。如何需要了解 VHDL 的仿真周期。 Free Range VHDL 可能不是足够的资源。如果您声称您显示的代码是函数,请考虑Code Review 站点。 谢谢!我不知道有代码审查页面。 这可能是代码审查的主题,假设 A) 代码有效 并且 B) 代码不是假设的或不完整的任何方式 【参考方案1】:

我最关心的是顺序和并发之间的区别 执行。我明白这两个词的意思,但我还是 无法想象为什么我们可以将“过程”用于组合逻辑(例如。 七段解码器)。

你混淆了两件事:

逻辑类型,可以是顺序的或组合的。 语句的执行顺序,可以是顺序的或并发的。

逻辑类型

在逻辑设计中:

组合电路是一种实现没有任何状态的纯逻辑功能的电路。组合电路中不需要时钟。 顺序电路是一种在每个时钟周期都会改变并在时钟周期之间记住其状态(使用触发器)的电路。

下面的VHDL过程是组合的:

process(x, y) begin
    z <= x or y;
end process;

我们知道它是组合的,因为:

它没有时钟。 它的所有输入都在其敏感度列表中(process 关键字后面的括号)。这意味着对这些输入中的任何一个的更改都会导致重新评估流程。

下面的VHDL过程是连续的:

process(clk) begin
    if rising_edge(clk) then
        if rst = '1' then
            z <= '0';
        else
            z <= z xor y;
        end if;
    end if;
end process;

我们知道它是连续的,因为:

它只对其时钟变化敏感 (clk)。 其输出仅在时钟上升沿改变值。 z 的输出值取决于它之前的值(z 在赋值的两边)。

执行模型

长话短说,VHDL 中的流程执行如下:

进程中的语句按顺序执行(即在 其他顺序)。 进程并发相对于彼此运行。

伪装过程

所谓并发语句,本质上是进程外的所有语句,实际上是变相的进程。比如这个并发的信号赋值(即一个进程外的信号赋值):

z <= x or y;

相当于这个过程:

process(x, y) begin
    z <= x or y;
end process;

也就是说,它相当于一个进程中的相同分配,其所有输入都在敏感度列表中。等效,我的意思是 VHDL 标准 (IEEE 1076) 实际上通过它们的等效过程定义了并发信号分配的行为。

这意味着,即使你不知道,你在hex_display_decoder 中的声明:

SEG_OUT <=  "1000000" when "0000",
            "1111001" when "0001",
            "0100100" when "0010",
            "0110000" when "0011",
            "0011001" when "0100",
            "0010010" when "0101",
            "0000010" when "0110",
            "1111000" when "0111",
            "0000000" when "1000",
            "0010000" when "1001",
            "0001000" when "1010",
            "0000011" when "1011",
            "1000110" when "1100",
            "0100001" when "1101",
            "0000110" when "1110",
            "0001110" when "1111",
            "1111111" when others;

已经是一个进程了。

这又意味着

如果我使用实现解码器会有什么不同 进程和switch语句?

没有。

【讨论】:

以上是关于请澄清VHDL中顺序和并发执行的概念的主要内容,如果未能解决你的问题,请参考以下文章

FPGA学习笔记06-VHDL语法基础-生成语句(generate)

进程管理顺序执行和并发执行

FPGA学习笔记03-VHDL语法基础-信号代入语句

jmeter的线程组概念

进程管理

Java Review - 并发编程_前置知识二