1

我正在做一个学校项目,并有以下触发器实体:

-- 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信号(位)传递给dq不是STD_LOGIC_VECTOR(向量)。

但是,如果我只是简单地传递它们而不进行任何类型的转换,则会出现编译错误,因为传递的类型 ( ) 与实体 ( )STD_LOGIC中的类型不同,即使 的大小为 1。floprSTD_LOGIC_VECTORSTD_LOGIC_VECTOR

通过一些谷歌搜索和实验,我想出了这个:

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

wherezeroEzeroMare 的类型STD_LOGIC

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

编辑:我尝试在 quartus 中编译,正如我所说的,它工作正常,但是当我尝试在 modelsim 中编译时,我收到错误:

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

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

4

2 回答 2

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;
于 2015-04-26T21:53:29.677 回答
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);
于 2015-04-26T20:51:29.647 回答