我有类似这样的类型:
Type MyCharacters is ('0', '1' ... '9', 'A', 'B', ... 'Z');
Type CharArray_8 is array(1 to 8) of MyCharacters;
Type CharArray_16 is array(1 to 16) of MyCharacters;
Type CharArray_32 is array(1 to 32) of MyCharacters;
和4种类型的信号:
Signal S1, S2 : CharArray_8;
Signal S3 : CharArray_16;
Signal S : CharArray_32;
我想结合S1,S2和S3并将结果分配给S,如下所示:
S <= S1 & S2 & S3;
但是这段代码错了并且有错误,我应该如何连接它们?
是否应将Array类型声明为MyCharacters的SubType?
答案 0 :(得分:4)
但是这段代码错了并且有错误,我应该如何连接它们?
没有为多个数组类型定义的隐式声明的连接运算符(&amp;)。您需要声明一个重载运算符,允许连接具有相同元素类型的不同类型(这是繁琐的,每个可能的组合至少需要三个函数)或者通过使用类型转换或者在类型转换中使数组值相同前两个答案声明了一个未绑定的数组类型。数组类型符合类型转换的条件,索引范围与类型S3兼容,并且元素类型相同。
是否应将Array类型声明为MyCharacters的SubType?
除了命名的子类型,Renaud Pacalet子类型显示的对象声明可以通过对象声明中的子类型指示(类型标记和约束)来定义:
type mychararray is array(natural range <>) of MyCharacters;
signal S1, S2: mychararray(1 to 8);
signal S3: mychararray(1 to 16);
signal S: mychararray(1 to 32);
&
运算符是在类型声明(一维数组类型)之后隐式声明的。
参见IEEE Std 1076-2008 6.4对象,6.3子类型声明,5.3.2数组类型(mychararray是无界数组类型)和9.2.5添加运算符(&amp; concatenation operator)。
Mycharacters类型是标量枚举字符类型(离散值),mychararray是数组类型(元素,这里是标量类型Mycharacters)。
Renaud Pacalet询问字符串类型的使用,您的36值MyCharacters类型需要6位二进制值来表示合成后,是std.STANDARD字符类型的四分之三(需要8位二进制值)。另一方面,如果包含{,则可以通过将MyCharacters的位置值添加到“110000”(16#30#或48,注意'数组类型的左侧索引位置为'0')来转换为ASCII值。在:
之前{1}},;
,<
,=
,>
,?
和@
字符:< / p>
A
您可以在对象声明中使用具有适当索引约束的类型字符,而不是声明类型MyCharacters:
30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7
38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ?
40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G
48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O
50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W
58 X 59 Y 5a Z
将其捆绑为Minimal, Complete and Verifiable example:
subtype MyCharacters is character('0' to 'Z');
type mychararray is array(natural range <>) of MyCharacters;
signal S1, S2: mychararray(1 to 8);
signal S3: mychararray(1 to 16);
signal S: mychararray(1 to 32);
entity mychar_concat is end entity; architecture foo of mychar_concat is subtype MyCharacters is character range '0' to 'Z'; -- 16#30# to 16#5A# type mychararray is array (natural range <>) of character range '0' to 'Z'; signal S1: mychararray (1 to 8) := "01234567"; signal S2: mychararray (1 to 8) := "89:;<=>?"; signal S3: mychararray (1 to 16) := "@ABCDEFGHIJKLMNO"; signal S: mychararray (1 to 32); function valuehex (inp: MyCharacters) return string is variable retval: string (1 to 2); variable hexval: integer; variable remainder: integer; begin hexval := character'pos(inp) / 16; retval(1) := character'val(hexval + 48); -- where '0' 'pos is 48. -- expects inp is less than 'Z', (9 * 16 > 'Z') remainder := character'pos(inp) rem 16; if remainder < 10 then retval(2) := character'val(remainder + 48); -- offset to '0' else retval(2) := character'val(remainder + 48 + 7); -- offset to 'A' end if; return retval; end function; begin S <= S1 & S2 & S3; -- & implicity declared for mychararray MONITOR: process begin wait on S; wait for 0 ns; -- skip "00000000000000000000000000000000" default S report "S = " & string(S); report "valuehex(MyCharacters'LEFT) = " & valuehex(MyCharacters'LEFT) & "H"; report "valuehex(MyCharacters'RIGHT) = " & valuehex(MyCharacters'RIGHT) & "H"; end process; end architecture;
其中30H是'0'而5AH是'Z'。另请参见16.2.2类型和对象的预定义属性。
我们看到我们从MyCharacters值中轻松获得7位ASCII或8位ISO / IEC 8859-1字符值(参见15.2字符集)。
在任何一种情况下,连接运算符(数组和数组,元素和数组,数组和元素)都是在声明单维数组类型后隐式声明的(mychararray here)。
答案 1 :(得分:1)
不,您的数组类型不能声明为MyCharacters
的子类型,它是枚举类型,而不是数组类型。
您的3种数组类型是不同的独立类型。连接运算符(&
)未在您使用它们的组合上定义。您可以为此特定情况重载它,但最简单的可能是使用公共基类型,即父无约束数组类型,并使用固定范围声明它的子类型:
type mychararray is array(natural range <>) of MyCharacters;
subtype CharArray_8 is mychararray(1 to 8);
subtype CharArray_16 is mychararray(1 to 16);
subtype CharArray_32 is mychararray(1 to 32);
这样,它们都具有相同的基类型,并且使用mychararray
类型自动声明的隐式连接运算符将适用于它们的任意组合(假设结果的大小与当然,它所分配的变量的大小。
注意:我猜你已经知道了字符串类型(字符数组)?