繁体   English   中英

如何获取VHDL无约束数组的切片?

[英]How to get a slice of a VHDL unconstrained array?

我正在尝试使用VHDL中的RAM芯片建模,使用通用参数表示地址和数据总线的宽度,以及将RAM放置在地址空间中的基址。 我的问题是我无法弄清楚如何获取通用无约束数组参数的一部分以将其与std_logic_vector信号进行比较。

这是用于计算“片选”信号的简化代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity e is
    generic (
        BASE_ADDR :std_logic_vector := x"C000";
        CELL_ADDR_WIDTH :integer := 4
    );
    port (
        address :in std_logic_vector (BASE_ADDR'length-1 downto 0)
    );
end;

architecture behavioral of e is

    constant ADDR_WIDTH :integer := BASE_ADDR'length;

    signal cs :std_logic;

begin

    cs <= '1' when address(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) = BASE_ADDR(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) else '0';

end behavioral;

Lattice ispLEVER VHDL编译器报告以下错误:

23:64:23:110|Slice range direction does not match argument range

该消息是由表达式BASE_ADDR(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH)

如何在VHDL中正确访问通用无约束数组BASE_ADDR

@Paebbels和@ user1155120建议的两种解决方案都可以解决VHDL编译错误。 我在这里引用了建议,并相应地更新了代码。

@Paebbels:使用to在片

您的无约束数组默认为“ to”范围,因为std_logic_vector的索引类型为整数,而整数又由to范围定义:)。 因此,在切片中使用to关键字。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity e is
    generic (
        BASE_ADDR :std_logic_vector := x"C000";
        CELL_ADDR_WIDTH :integer := 4
    );
    port (
        address :in std_logic_vector (BASE_ADDR'length-1 downto 0)
    );
end;

architecture behavioral of e is

    constant ADDR_WIDTH :integer := BASE_ADDR'length;

    signal cs :std_logic;

begin

    cs <= '1' when address(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) = BASE_ADDR(ADDR_WIDTH-1 to CELL_ADDR_WIDTH) else '0';

end behavioral;

@ user1155120:声明别名以定义方向

您还可以向架构声明性区域添加别名- alias BASEADDR: std_logic_vector(BASE_ADDR'LENGTH - 1 downto 0) is BASE_ADDR; 定义方向并使用- cs <= '1' when address(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) = BASEADDR(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) else '0';

我为别名使用了一个更突出的名称:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity e is
    generic (
        BASE_ADDR :std_logic_vector := x"C000";
        CELL_ADDR_WIDTH :integer := 4
    );
    port (
        address :in std_logic_vector (BASE_ADDR'length-1 downto 0)
    );
end;

architecture behavioral of e is

    constant ADDR_WIDTH :integer := BASE_ADDR'length;

    signal cs :std_logic;

    alias BASE_ADDR_ALIAS: std_logic_vector(BASE_ADDR'LENGTH - 1 downto 0) is BASE_ADDR;

begin

    cs <= '1' when address(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) = BASE_ADDR_ALIAS(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH) else '0';

end behavioral;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM