首页 文章

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

提问于
浏览
2

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

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

我最关心的是顺序执行和并发执行之间的区别 . 我理解这两个词的含义,但我仍然无法想象为什么我们可以将"process"用于组合逻辑(即七段解码器) . 我已经实现了我的七段解码器作为并发语句的条件分配 . What would be the difference if I implemented the decoder using process and a switch statement? 在组合逻辑方面,我不理解流程的顺序执行这个词 . 如果它是顺序机器 - 状态机,我会理解它 .

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

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

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;

谢谢,

杰克哈拉迪克

1 回答

  • 8

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

    你混淆了两件事:

    • 逻辑类型,可以是顺序的或组合的 .

    • 语句的执行顺序,可以是顺序的也可以是并发的 .

    逻辑类型

    在逻辑设计中:

    • combinational 电路是一种在没有任何状态的情况下实现纯逻辑功能的电路 . 组合电路中不需要时钟 .

    • sequential 电路是一个改变每个时钟周期并在时钟周期之间记住其状态(使用触发器)的电路 .

    以下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中执行如下:

    • 进程中的语句执行 sequentially (即按顺序依次执行) .

    • 进程相对于彼此运行 concurrently .

    伪装过程

    所谓的并发语句,实质上是进程外的所有语句,实际上都是伪装的进程 . 例如,这种并发信号分配(即对进程外信号的分配):

    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;
    

    已经是一个过程 .

    反过来,这意味着

    如果我使用process和switch语句实现解码器会有什么区别?

    一个都没有 .

相关问题