vhdl的串联运算符如何工作以及与verilog有何不同

1 verilog vhdl

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

\n
module top_module (\n  input [4:0] a, b, c, d, e, f,\n  output [7:0] w, x, y, z );//\n  assign {w,x,y,z} = { a, b, c, d, e, f,2\'b11};\nendmodule\n
Run Code Online (Sandbox Code Playgroud)\n

所以我尝试将其转换为vhdl。这是我写的代码。

\n
LIBRARY ieee;\n   USE ieee.std_logic_1164.all;\nENTITY top_module IS\n   PORT (\n      a  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);\n      b  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);\n      c  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);\n      d  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);\n      e  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);\n      f  : IN STD_LOGIC_VECTOR(4 DOWNTO 0);\n      w  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);\n      x  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);\n      y  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);\n      z  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)\n   );\nEND top_module;\nARCHITECTURE trans OF top_module IS\nBEGIN\n   (w, x, y, z) <= (a & b & c & d & e & f & "11");\nEND trans;\n
Run Code Online (Sandbox Code Playgroud)\n

但是Modelsim没有编译成功,怎么修改呢?\n如何正确使用vhdl的串联运算符\xef\xbc\x9f

\n

use*_*658 5

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

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

对于那些有考古倾向的人,您可以探索 -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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

...对于与聚合类型的表达式的位置关联,表达式指定由表达式值的长度给定的聚合值的多个匹配元素(参见9.2.3)。

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

聚合形式的信号分配声明的目标在 10.5.2 简单信号分配、10.5.2.1 总则第 3 段中进行了描述,与标准的早期修订版仅存在微小变化。

您还会发现该标准早期版本的 VHDL 代码与 -2008 标准兼容,从而使早期方法可用于完整描述代码文档的此类“突破”或“拆包”,而无需解释如何解释发生的情况。