首页 文章

如何获得VHDL无约束数组?

提问于
浏览
0

我正在尝试用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;

莱迪思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 的片段?

1 回答

  • 1

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

    @Paebbels:在切片中使用

    您的无约束数组默认为“to”范围,因为std_logic_vector的索引类型是整数,而整数依次定义为to to range :) . 因此,在切片中使用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:声明别名以定义方向

    您还可以在架构声明区域中添加别名 - 别名BASEADDR:std_logic_vector(BASE_ADDR'LENGTH - 1 downto 0)是BASE_ADDR;定义一个方向并使用 - 当地址(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH)= BASEADDR(ADDR_WIDTH-1 downto CELL_ADDR_WIDTH)时,cs <='1',否则为'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;
    

相关问题