签署给 std_logic_vector,切片结果

signed to std_logic_vector, slice results

我需要取结果的绝对值,我只对最高有效位感兴趣。这就是我所做的:

data_ram_h <= std_logic_vector(abs(signed(resize(r4(calc_cnt - 2), data_ram_h'length) + r4(calc_cnt - 1) +
                    r4(calc_cnt) + r4(calc_cnt + 1) + r4(calc_cnt + 2) -
                    r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) -
                    r2(calc_cnt + 1) - r2(calc_cnt + 2))))(11 downto 4);

我尝试检查语法并收到此错误:

type conversion std_logic_vector is not allowed as a prefix for an slice name.

data_ram_h是右维度的std_logic_vector,abs函数returns 一个带符号的,到 std_logic_vector 的转换应该没有问题。我正在使用的库是 use ieee.numeric_std.all.

我哪里错了?提前致谢 c:

终于解决了我的疑惑。即使 std_logic_vector 是一个函数,所以我需要 3 个变量来切片结果而不会出错。这是我所做的:

    h_tmp <= abs(signed(resize(r4(calc_cnt - 2), data_ram_h'length) + r4(calc_cnt - 1) +
                    r4(calc_cnt) + r4(calc_cnt + 1) + r4(calc_cnt + 2) -
                    r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) -
                    r2(calc_cnt + 1) - r2(calc_cnt + 2)));
    h_tmp_vec <= std_logic_vector(h_tmp);
    data_ram_h <= h_tmp_vec(11 downto 4);

定义如下:

signal h_tmp: signed (11 downto 0);
signal h_tmp_vec: std_logic_vector (11 downto 0);
signal data_ram_h: std_logic_vector(7 downto 0);

感谢 Paebbels 的评论:)

如果有人有更好的解决方法,请post吧!

类型转换是一种基本操作,恰好需要在其操作数表达式周围加上括号。还有一个问题,它的用途不是函数调用,所以它不能用作切片名称的前缀。

切片名称的前缀可以是 function_call 或名称。 (IEEE 标准 1076-2008,5 类型,5.1 通用,显式类型转换,8 名称,8.1 通用,8.5 切片名称)。

如果是函数调用,您可以对结果进行切片。

另一方面,您可以对 `"abs" 进行切片,然后对其进行切片,然后进行类型转换:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity slice is
end entity;

architecture foo of slice is
    signal h_tmp: signed (11 downto 0);
    signal h_tmp_vec: std_logic_vector (11 downto 0);
    signal data_ram_h: std_logic_vector(7 downto 0);
    signal calc_cnt:     integer := 3;
    type r_array is array (0 to 15) of unsigned(15 downto 0);
    signal r2, r4: r_array := (others => (others => '0'));
begin


    data_ram_h<= std_logic_vector (
                     "abs"(signed(resize(r4(calc_cnt - 2), data_ram_h'length) + r4(calc_cnt - 1) +
                      r4(calc_cnt) + r4(calc_cnt + 1) + r4(calc_cnt + 2) -
                      r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) -
                      r2(calc_cnt + 1) - r2(calc_cnt + 2)))(11 downto 4)
                      );

end architecture;

使用 abs 作为函数调用需要您使用它的声明名称,即 "abs".

我只是猜测这里的一些声明,所以我不能保证这在你的代码中有效。上面的例子确实分析、详细说明了 运行 表示子类型范围是兼容的。