亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

如何在 VHDL 中使用端口映射实例化

模块是 VHDL 代码的独立单元。模块通过 entity 与外界通信 . 港口地图 是模块实例化的一部分,您可以在其中声明模块的输入和输出应连接到哪些本地信号。

在本系列之前的教程中,我们一直在主 VHDL 文件中编写所有代码,但通常我们不会这样做。我们创建逻辑的目的是在 FPGA 或 ASIC 设计中使用它,而不是用于模拟器。

为在模拟器中运行而创建的 VHDL 模块通常没有输入或输出信号。它是完全独立的。这就是为什么我们设计的实体是空的。 entity之间一直没有任何东西 标签和 end entity; 标记。

这篇博文是基本 VHDL 教程系列的一部分。

没有任何输入或输出信号的模块不能用于实际设计。它的唯一目的是允许我们在模拟器中运行 VHDL 代码。因此它被称为测试台 .要模拟具有输入和输出信号的模块,我们必须实例化 它在测试台中。

模块和测试平台通常成对出现,它们存储在不同的文件中。一种常见的命名方案是将测试平台称为模块名称,并附加“Tb”,并将架构命名为“sim”。如果模块被称为“MyModule”,则测试平台将被称为“MyModuleTb”。因此,文件名变为“MyModuleTb.vhd”和“MyModule.vhd”。

在测试台代码的帮助下,我们可以验证模块在模拟环境中是否正常工作。被测试的模块通常被称为被测设备 (被测物)。

模块也可以在其他模块中实例化。将代码划分为模块允许它被多次实例化。您可以在同一个设计中创建一个模块的多个实例,并且可以在多个设计中重复使用它。

VHDL 中带有端口的实体的语法是:
entity <entity_name> is
port(
    <entity_signal_name> : in|out|inout <signal_type>;
    ...
);
end entity;

在另一个 VHDL 文件中实例化此类模块的语法为:
<label> : entity <library_name>.<entity_name>(<architecture_name>) port map(
    <entity_signal_name> => <local_signal_name>,
    ...
);

<label> 可以是任何名称,它将显示在 ModelSim 的层次结构窗口中。 <library_name> 对于一个模块是在模拟器中设置的,而不是在 VHDL 代码中。默认情况下,每个模块都编译成 work 图书馆。 <entity_name><architecture_name> 必须与我们创建实例的模块相匹配。最后,每个实体信号必须映射到一个本地信号名称。

还有其他方法可以在 VHDL 中实例化模块,但这是显式实例化的基本语法。

运动

在本视频教程中,我们将学习如何在 VHDL 中创建和实例化模块:

MUX testbench 的最终代码 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T15_PortMapTb is
end entity;

architecture sim of T15_PortMapTb is

    signal Sig1 : unsigned(7 downto 0) := x"AA";
    signal Sig2 : unsigned(7 downto 0) := x"BB";
    signal Sig3 : unsigned(7 downto 0) := x"CC";
    signal Sig4 : unsigned(7 downto 0) := x"DD";

    signal Sel : unsigned(1 downto 0) := (others => '0');

    signal Output : unsigned(7 downto 0);

begin

    -- An instance of T15_Mux with architecture rtl
    i_Mux1 : entity work.T15_Mux(rtl) port map(
        Sel    => Sel,
        Sig1   => Sig1,
        Sig2   => Sig2,
        Sig3   => Sig3,
        Sig4   => Sig4,
        Output => Output);

    -- Testbench process
    process is
    begin
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= "UU";
        wait;
    end process;

end architecture;

MUX 模块的最终代码 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T15_Mux is
port(
    -- Inputs
    Sig1 : in unsigned(7 downto 0);
    Sig2 : in unsigned(7 downto 0);
    Sig3 : in unsigned(7 downto 0);
    Sig4 : in unsigned(7 downto 0);

    Sel  : in unsigned(1 downto 0);

    -- Outputs
    Output : out unsigned(7 downto 0));
end entity;

architecture rtl of T15_Mux is
begin

    process(Sel, Sig1, Sig2, Sig3, Sig4) is
    begin

        case Sel is
            when "00" =>
                Output <= Sig1;
            when "01" =>
                Output <= Sig2;
            when "10" =>
                Output <= Sig3;
            when "11" =>
                Output <= Sig4;
            when others => -- 'U', 'X', '-', etc.
                Output <= (others => 'X');
        end case;

    end process;

end architecture;

我们按下运行后 ModelSim 中的波形窗口,并在时间轴上放大:

分析

从波形中我们可以看出,多路复用器 (MUX) 模块按预期工作。波形与上一教程中我们不使用模块创建的波形相同。

现在设计模块和测试平台之间有了明显的分离。包含 MUX 的模块是我们打算在设计中使用的,而测试台的唯一目的是允许我们在模拟器中运行它。测试台中有一个进程使用wait 用于在模拟中创建人为时间延迟的语句。设计模块没有时间概念,只对外部刺激做出反应。

我们将测试平台的架构命名为 sim , 用于模拟。设计模块的架构命名为rtl ,代表寄存器传输级别。这些只是命名约定。当您看到具有这样名称的文件时,您会立即知道它是测试台还是设计模块。不同的公司可能有不同的命名约定。

外卖

转到下一个教程 »


VHDL

  1. 我们如何使用钼?
  2. 如何在 VHDL 中创建字符串列表
  3. 如何为 VHDL 代码锁定模块创建 Tcl 驱动的测试平台
  4. 如何在 VHDL 测试平台中停止仿真
  5. 如何在 VHDL 中创建 PWM 控制器
  6. 如何在 VHDL 中生成随机数
  7. 如何在 VHDL 中的进程中使用过程
  8. 如何在 VHDL 中使用不纯函数
  9. 如何在 VHDL 中使用函数
  10. 如何在 VHDL 中创建有限状态机
  11. 如何在 VHDL 中使用过程
  12. 如何使用刀具磨床