签署给 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"
.
我只是猜测这里的一些声明,所以我不能保证这在你的代码中有效。上面的例子确实分析、详细说明了 运行 表示子类型范围是兼容的。
我需要取结果的绝对值,我只对最高有效位感兴趣。这就是我所做的:
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"
.
我只是猜测这里的一些声明,所以我不能保证这在你的代码中有效。上面的例子确实分析、详细说明了 运行 表示子类型范围是兼容的。