VHDL使用顶级实体中实例化实体的输出

时间:2018-10-10 16:28:13

标签: vhdl

我有一个VHDL代码,其中包含一个顶级实体和其他几个实体。现在,在其中一个子实体中有一个输出,必须将其值带到顶级实体才能在我的模拟程序中显示它。 我该怎么办?

TOP实体:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity multiplier is
    port( Clk   : in        std_logic; -- Clock
          A,B   : in        std_logic_vector(7 downto 0); -- A and B
          Start : in        std_logic; -- Start
          Y     : buffer    std_logic_vector(15 downto 0); -- Result of A * B
          Ready : out       std_logic); -- Ready
end multiplier;

architecture structural of multiplier is

-- declaration of signals between different sub-circuits inside the multiplier
signal smInit, smCheck, smAdd, smShift, smZero, smReady, Stop : std_logic;
signal SR_A, SR_B, ADDout, MUXout : std_logic_vector(15 downto 0);

begin
io01: Ready <= smReady;

-- Instantiation of the FSM controller
sm01: entity work.FSM port map( Start, Stop, SR_A(0), Clk,
smReady, smInit, smCheck, smAdd, smShift, smZero);

-- Instantiation of the other sub-circuits and their connections
    SR1: entity work.Shifter port map(smInit, smShift, '0', Clk, A, SR_A);
    SR2: entity work.Shifter port map(smInit, smShift, '1', Clk, B, SR_B);
    A1: entity work.Add16 port map(SR_B, Y, ADDout);
    M1: entity work.Mux16 port map(smAdd, ADDout, Y, MUXout);
    G1: entity work.Reg16 port map(smInit, Clk, MUXout, Y);
    Z1: entity work.AllZero port map(SR_A(7 downto 0), Stop);
end structural; -- end of the multiplier architecture`

现在在以下子实体中有输出S,我需要能够在顶级实体中调用它:

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity Add16 is
port( A, B : in std_logic_vector(15 downto 0);
S : buffer std_logic_vector(15 downto 0));
end Add16;
architecture behavior of Add16 is
signal Addout : out std_logic_vector (15 downto 0);
begin
S <= A + B;
end behavior;

我该怎么做?

1 个答案:

答案 0 :(得分:0)

VHDL-2008具有“外部名称”概念,因此可以使用层次结构引用,因此,如果测试台需要访问该值,则无需通过层次结构手动路由内部信号。

如果顶级测试平台名称为tb,并且multiplier实例名称为multiplier_e,则SAdd16端口的别名可以在测试台中使用以下命令创建:

alias S_tb is <<signal .tb.multiplier_e.A1.S : std_logic_vector(15 downto 0)>>;