如果我有一个类似下面定义的数组...
type A_type is array (0 to 9) of integer;
signal my_array : A_type := (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
如果稍后我想转换为代表相同数字的有符号数字列表。有没有办法可以完成类型转换而无需进行for循环?
不,你需要一个for
循环或十个单独的声明。最好的方法是编写自己的转换函数,但我想你真的想知道转换是否可以“一气呵成”完成,可以这么说。
在VHDL中有两种转换类型的方法。第一种是类型转换:
my_new_type_signal <= my_new_type(my_old_type_signal);
(或变量,obvs)。这只有在my_new_type
和my_old_type
是密切相关的类型时才有效。例如,integer
和real
密切相关,std_logic_vector
和signed
,但你的两个不会。
第二种方法是编写转换函数。标准类型(来自standard
和numeric_std
包)已经编写了函数。你的不是标准类型,所以你必须自己编写。
如果稍后我想转换为代表相同数字的有符号数字列表。有没有办法可以完成类型转换而无需进行for循环?
是。
library ieee;
use ieee.numeric_std.all;
entity no_mce_provided is
end entity;
architecture foo of no_mce_provided is
type A_type is array (0 to 9) of integer;
signal my_array : A_type := (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
type S_type is array (my_array'range) of signed(31 downto 0);
signal a,b,c,d,e,f,g,h,i,j: signed(31 downto 0);
begin
(a,b,c,d,e,f,g,h,i,j) <= S_type'(to_signed(my_array(0), 32),
to_signed(my_array(1), 32),
to_signed(my_array(2), 32),
to_signed(my_array(3), 32),
to_signed(my_array(4), 32),
to_signed(my_array(5), 32),
to_signed(my_array(6), 32),
to_signed(my_array(7), 32),
to_signed(my_array(8), 32),
to_signed(my_array(9), 32)
);
end architecture;
使用聚合形式的复合类型的右侧表达式,这里是提供聚合类型的限定表达式的目标。请注意,赋值的目标也是复合,从上下文(右侧)确定的类型。
这个例子分析,阐述和模拟尽管马修泰勒的说法不然。 (我怀疑你可能想让你的问题比是/否问题更具体。)