与方向无关的切片

Direction independent slicing

提问人:sebi707 提问时间:6/21/2018 更新时间:6/28/2018 访问量:865

问:

我正在创建一个包含我经常使用的一些函数的包,并且某些函数需要对其参数进行切片。我通常对所有信号都使用方向,但有时信号会意外地改变方向,例如,附加零位 () 似乎会将方向更改为正。downtosig & '0'

有没有办法对数组 (, , ) 进行独立于其方向的切片?例如,您将如何实现一个采用最低两位的函数?我想出的唯一实现使用了一个具有预期方向的附加常量:std_logic_vectorunsignedsigned

function take_two(x : std_logic_vector) return std_logic_vector is
    constant cx : std_logic_vector(x'length-1 downto 0) := x;
begin
    return cx(1 downto 0);
end function;

我也尝试过类似的东西,但 Quartus 不喜欢这样。x(x'low+1 downto x'low)

VHDL 切片

评论

3赞 mkrieger1 6/21/2018
你可以用 an 代替 ,但我认为这已经是最好的解决方案了。aliasconstant
1赞 Renaud Pacalet 6/21/2018
常量或别名是我所知道的唯一“干净”的解决方案。还有另一个,它使用类型属性,测试方向,并计算切片的边界,但它太丑了......
1赞 6/22/2018
表达方向在 IEEE Std 1076-2008 9.2.3 中定义 添加运算符 para 2 b): ...这个隐式数组的索引子类型的方向是 S 的方向,其中 S 是结果的基类型的索引子类型,std_logic_vector 的索引子类型是自然的,是升序的。解决此问题的一种方法是赋值(5.3.2.2 索引约束和离散范围,第4段“......数组上的赋值和某些其他操作涉及隐式子类型转换“)。别名的开销较低,它们只是附加名称。(sig & '0')
0赞 mfro 1/21/2019
VHDL 数组“知道”它们的维度和方向,您也可以使用它们的 、、 和 属性来知道。如果您需要如前所述的“向后”别名,该属性也可以为您提供帮助。'left'right'low'high'ascending'reverse_range

答:

0赞 JHBonarius 6/28/2018 #1

问题实际上不在于输入,而在于所需的输出。你喜欢什么?

如果你看一下函数是如何实现的,例如std_logic_1164-body.vhdl,你的函数同样是这样的(在一个完整的例子中):

entity e is end entity;
library ieee;
architecture a of e is
    use ieee.std_logic_1164.all;
    signal test : std_logic_vector(7 downto 0) := "10010110";
    signal output : std_logic_vector(2 downto 0);

    function slice(s: STD_LOGIC_VECTOR; u, l : natural) return STD_LOGIC_VECTOR is
        alias sv : STD_LOGIC_VECTOR (s'length-1 downto 0) is s;
        variable result : STD_LOGIC_VECTOR (u downto l);
    begin
        for i in result'range loop
            result(i) := sv(i);
        end loop;
        return result;
    end function;
begin
    output <= slice(test & '0', 5, 3); -- test becomes 'to' range.
    -- output still becomes "101"
end architecture;