我正在从事一个学校项目并拥有以下触发器实体:
-- 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;
我需要将STD_LOGIC
个信号(位)传递给d
和q
而不是STD_LOGIC_VECTOR
(向量)。
但是,如果我只是在没有任何转换的情况下传递它们,那么就会出现编译错误,因为传递的类型(STD_LOGIC
)与flopr
实体中的类型不同({ {1}}),即使STD_LOGIC_VECTOR
的大小为1。
通过一些小小的谷歌搜索和实验,我想出了这个:
STD_LOGIC_VECTOR
其中zeroMFlopr: entity work.flopr generic map(1) port map(clk => clk, reset => reset, d => (0=>zeroE), q(0) => zeroM);
和zeroE
的类型为zeroM
。
它编译,但这是正确的方法吗?
编辑:我尝试在quartus中进行编译,因为我说它工作正常,但是当我尝试在modelsim中编译时,我收到错误:正式&#34; d&#34;的实际表达(汇总)并非全球静态。
错误是引用我在上面发布的行。
答案 0 :(得分:2)
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);
答案 1 :(得分:2)
除了Morten使用切片正式名称之外,在-2008之前的VHDL标准版本中,至少还有两种方法可以将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;
然后定义数组类型信号并使用别名:
architecture fum of flopr_tb is
constant width: integer := 1;
signal clk: std_logic := '0';
signal reset: std_logic := '0';
signal d: std_logic_vector (width -1 downto 0);
signal q: std_logic_vector (width -1 downto 0);
alias zeroE is d(0);
alias zeroM is q(0);
begin
DUT:
entity work.flopr
generic map (width)
port map (
clk => clk,
reset => reset,
d => d,
q => q
);
end architecture;