Vhdl 如何通过标准逻辑向量信号将标准逻辑信号传递给实体?

Vhdl 如何通过标准逻辑向量信号将标准逻辑信号传递给实体?,vhdl,modelsim,quartus,Vhdl,Modelsim,Quartus,我正在从事一个学校项目,拥有以下触发器实体: -- define the width-bit flip flop entity entity flopr is generic (width: integer); port (clk, reset: in STD_LOGIC; d: in STD_LOGIC_VECTOR(width-1 downto 0); q: out STD_LOGIC_VECTO

我正在从事一个学校项目,拥有以下触发器实体:

-- define the width-bit flip flop entity
entity flopr is
    generic (width: integer);
    port (clk, reset: in  STD_LOGIC;
          d:          in  STD_LOGIC_VECTOR(width-1 downto 0);
          q:          out STD_LOGIC_VECTOR(width-1 downto 0));
end flopr;

-- define the width-bit flip flop architecture
architecture asynchronous of flopr is
begin
    process(clk, reset) 
    begin
        if reset ='1' then 
            q <= (others => '0');
        elsif rising_edge(clk) then
            q <= d;
        end if;
    end process;
end;
其中
zeroE
zeroM
属于
STD_逻辑类型

它可以编译,但这是正确的方法吗

编辑:我尝试在quartus中编译,正如我所说,它工作得很好,但当我尝试在modelsim中编译时,我收到了错误:

形式“d”的实际表达式(聚合)不是全局静态的


错误引用了我在上面发布的行。

VHDL-2002不允许
d=>(0=>zeroE)
,这就是出现以下错误的原因:

形式“d”的实际表达式(聚合)不是全局静态的

VHDL-2008允许这一点,因此如果工具支持VHDL-2008的这一功能,它将起作用

对于VHDL-2002编码样式,使用通用命名关联,请编写:

zeroMFlopr: entity work.flopr 
  generic map(
    width => 1)
  port map(
    clk => clk,
    reset => reset, 
    d(0) => zeroE, 
    q(0) => zeroM);

VHDL-2002不允许
d=>(0=>zeroE)
,这就是以下原因:

形式“d”的实际表达式(聚合)不是全局静态的

VHDL-2008允许这一点,因此如果工具支持VHDL-2008的这一功能,它将起作用

对于VHDL-2002编码样式,使用通用命名关联,请编写:

zeroMFlopr: entity work.flopr 
  generic map(
    width => 1)
  port map(
    clk => clk,
    reset => reset, 
    d(0) => zeroE, 
    q(0) => zeroM);

在-2008之前的VHDL标准版本中,除了Morten使用切片形式名称外,至少还有两种方法可以将
zeroE
zeroM
连接到数组类型的形式:

首先,代理信号:

library ieee;
use ieee.std_logic_1164.all;

entity flopr_tb is
end entity;

architecture foo of flopr_tb is
    constant width: integer := 1;
    signal clk:     std_logic := '0';
    signal reset:   std_logic := '0';
    signal zeroE:   std_logic;
    signal zeroM:   std_logic;
    signal d:       std_logic_vector (width -1 downto 0);
    signal q:       std_logic_vector (width -1 downto 0);    

begin

    d <= "" & zeroE;
    zeroM <= q(0);
DUT:
    entity work.flopr
        generic map (width)
        port map (
            clk => clk,
            reset => reset,
            d => d,
            q => q
        );
end architecture;

在-2008之前的VHDL标准版本中,除了Morten使用切片形式名称外,至少还有两种方法可以将
zeroE
zeroM
连接到数组类型的形式:

首先,代理信号:

library ieee;
use ieee.std_logic_1164.all;

entity flopr_tb is
end entity;

architecture foo of flopr_tb is
    constant width: integer := 1;
    signal clk:     std_logic := '0';
    signal reset:   std_logic := '0';
    signal zeroE:   std_logic;
    signal zeroM:   std_logic;
    signal d:       std_logic_vector (width -1 downto 0);
    signal q:       std_logic_vector (width -1 downto 0);    

begin

    d <= "" & zeroE;
    zeroM <= q(0);
DUT:
    entity work.flopr
        generic map (width)
        port map (
            clk => clk,
            reset => reset,
            d => d,
            q => q
        );
end architecture;

我觉得不错…@kevincadieuxmodelsim给出了一个错误,所以我不确定这是否有效。。我用错误更新了我的问题。另外,我不知道是谁否决了这一点,但如果能知道原因就好了。我是一个试图学习一种非常不直观和混乱的语言的学生,经过大量的研究和多次尝试,我在这里寻求帮助。这不是这个网站的目的吗?@Nate:
端口映射(clk=>clk,reset=>reset,d(0)=>zeroE,q(0)=>zeroM)
IEEE Std 1076-2008 9.3.3聚合,9.3.3.1“包含单个元素关联的聚合应始终使用命名关联来指定,以便与括号中的表达式区分。”
d
q
是用第二种形式(5.2.1)的全局静态范围定义的,它们不是空范围(5.2.1):“L到R的范围称为升序范围;如果L>R,则范围为空范围。L到R的范围称为降序范围;如果L端口映射(clk=>clk,reset=>reset,d(0)=>zeroE,q(0)=>zeroM)IEEE Std 1076-2008 9.3.3聚合,9.3.3.1“包含单个元素关联的聚合应始终使用命名关联来指定,以便与括号中的表达式区分。”
d
q
是用第二种形式(5.2.1)的全局静态范围定义的,它们不是空范围(5.2.1):“L到R的范围称为升序范围;如果L>R,则范围为空范围。L到R的范围称为降序范围;如果L