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