vhdl的连接运算符如何工作以及它与verilog有何不同

How does vhdl's concatenation operator work and how is it different from verilog

我在这个网站上使用 Verilog 解决了这个问题https://hdlbits.01xz.net/wiki/Vector3

module top_module (
  input [4:0] a, b, c, d, e, f,
  output [7:0] w, x, y, z );//
  assign {w,x,y,z} = { a, b, c, d, e, f,2'b11};
endmodule

所以我试着把它转换成vhdl。这是我写的代码。

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
ENTITY top_module IS
   PORT (
      a  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
      b  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
      c  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
      d  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
      e  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
      f  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
      w  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
      x  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
      y  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
      z  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
   );
END top_module;
ARCHITECTURE trans OF top_module IS
BEGIN
   (w, x, y, z) <= (a & b & c & d & e & f & "11");
END trans;

但是Modelsim编译不成功,请问如何修改? 如何正确使用vhdl的连接运算符?

OP 的 VHDL 代码使用支持 IEEE Std 1076-2008(或更高版本)的工具是有效的。波形元素表达式不需要括号,端口声明可以压缩一点:

library ieee;
use ieee.std_logic_1164.all;

entity top_module is
   port (
      a, b, c, d, e, f: in  std_logic_vector(4 downto 0);
      w, x, y, z:       out std_logic_vector(7 downto 0)
   );
end entity top_module;

architecture trans of top_module is
begin
   (w, x, y, z) <= a & b & c & d & e & f & "11"; -- NO parentheses required
end architecture trans;

对于那些有考古兴趣的人,您可以探索 -2008 年和更早版本之间分配目标的聚合差异。

通过创建其元素与 w、x、y 和 z 的子类型兼容的数组类型的值,可以在早期版本中使用聚合赋值:

library ieee;
use ieee.std_logic_1164.all;

entity top_module is
   port (
      a, b, c, d, e, f: in  std_logic_vector(4 downto 0);
      w, x, y, z:       out std_logic_vector(7 downto 0)
   );
end entity top_module;

architecture earlier_than_2008 of top_module is
    type some_arry is array (0 to 3) of std_logic_vector (7 downto 0);
begin
    (w, x, y, z) <=
        some_arry'( a & b (4 downto 2), b (1 downto 0) & c & d(4),
                    d (3 downto 0) & e(4 downto 1), e (0) & f & "11" );
end architecture;

在这种情况下some_arry类型的未命名对象的实际值和形式值之间的关联是位置的,并且在关联列表中发生隐式子类型转换。限定表达式用于指定未命名对象的类型,赋值左侧的对象类型取自上下文(赋值语句的右侧)。

如果w、x、y、z的子类型不兼容(不同长度或不同类型),未命名对象的类型可以是记录类型。

对于 IEEE std 1076-2008,请参阅 9.3.3.3 数组聚合,第 4 段:

... For a positional association with an expression of the type of the aggregate, the expression specifies a number of matching elements (see 9.2.3) of the aggregate value given by the length of the value of the expression.

这允许选择聚合类型,而不仅仅是它的元素。聚合的类型取自上下文,这里是信号分配波形元素,它是一个std_logic_vector,由级联运算符的操作数决定(参见9.2.5 添加运算符,级联结果类型与操作数的数组类型)。此权限消除了使用标准早期修订版中所需的限定表达式和类型声明的需要。

10.5.2 简单信号分配中描述了聚合形式的信号分配语句的目标, 10.5.2.1 总则第 3 段,与标准的早期修订版只有微小的变化。

您还会发现该标准的早期修订版的 VHDL 代码与 -2008 标准兼容,使早期的方法可用于完整描述此类 'break out' 或 'unpacking' 代码没有解释如何解释发生的事情的文档。