如何在 VHDL 中连接两个数组

G3n*_*Man 4 arrays fpga vhdl

我有一些这样的类型:

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;
Run Code Online (Sandbox Code Playgroud)

和 4 个这种类型的信号:

Signal S1, S2 : CharArray_8;
Signal S3 : CharArray_16;
Signal S : CharArray_32;
Run Code Online (Sandbox Code Playgroud)

我想连接 S1、S2 和 S3 并将结果分配给 S,如下所示:

S <= S1 & S2 & S3;
Run Code Online (Sandbox Code Playgroud)

但是这段代码是错误的并且有错误,我应该如何连接它们?

Array 类型应该声明为 MyCharacters 的 SubType 吗?

小智 5

但是这段代码是错误的并且有错误,我应该如何连接它们?

没有为多个数组类型定义隐式声明的连接运算符 (&)。您需要声明一个重载运算符,允许连接具有相同元素类型的不同类型(这是繁重的,每个可能的组合至少需要三个函数),或者通过使用类型转换或如在前两个答案声明了一个未绑定的数组类型。数组类型可以进行类型转换,索引范围与类型 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); 
Run Code Online (Sandbox Code Playgroud)

&操作员是隐式声明以下类型声明(一维阵列型)。

请参阅 IEEE Std 1076-2008 6.4 对象、6.3 子类型声明、5.3.2 数组类型(mychararray 是无界数组类型)和 9.2.5 添加运算符(& 连接运算符)。

Mycharacters 类型是标量枚举字符类型(离散值),mychararray 是数组类型(元素,这里是标量类型Mycharacters)。

Renaud Pacalet询问字符串类型的使用,你的36个值MyCharacters类型合成后需要6位二进制值来表示,四分之三的方式到std.STANDARD字符类型(需要8位二进制值)。另一方面,您可以通过将 MyCharacters 的位置值添加到“110000”(16#30# 或 48,注意数组类型的“LEFT 索引位置为 0”)来转换为 ASCII 值,如果您包含:, ;<=>?@之前的字符A

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
Run Code Online (Sandbox Code Playgroud)

您可以在对象声明中使用具有适当索引约束的类型字符,而不是声明类型 MyCharacters:

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); 
Run Code Online (Sandbox Code Playgroud)

将其捆绑成一个最小、完整和可验证的示例

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;
Run Code Online (Sandbox Code Playgroud)
ghdl -r mychar_concat
mychar_concat.vhdl:37:9:@0ms:(report note): S = 0123456789:;<=>?@ABCDEFGHIJKLMNO
mychar_concat.vhdl:38:9:@0ms:(report note): valuehex(MyCharacters'LEFT) = 30H
mychar_concat.vhdl:40:9:@0ms:(report note): valuehex(MyCharacters'RIGHT) = 5AH
Run Code Online (Sandbox Code Playgroud)

其中 30H 是“0”,5AH 是“Z”。另请参阅 16.2.2 类型和对象的预定义属性。

我们看到,我们可以毫不费力地从 MyCharacters 值导出 7 位 ASCII 或 8 位 ISO/IEC 8859-1 字符值(请参阅 15.2 字符集)。

在任何一种情况下,连接运算符(数组和数组、元素和数组、数组和元素)都是在声明一维数组类型(此处为 mychararray)之后隐式声明的。