如何使用STD_LOGIC_VECTOR信号将STD_LOGIC信号传递给实体?

时间:2015-04-26 19:18:31

标签: 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_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)与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;的实际表达(汇总)并非全球静态。

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

2 个答案:

答案 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标准版本中,至少还有两种方法可以将zeroEzeroM连接到数组类型的形式:

首先,代理信号:

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;