【发布时间】:2021-10-14 20:48:12
【问题描述】:
此代码作为 16 位加法器的代码给出。我想将其修改为 4 位和减法器。现在我有点坚持这些代码行的作用。我假设 15DOWNTO0 将 x 变成 x0、x1、x2 .. 直到 x15。不过我很困惑,因为在 Signal sum 中它变成了 16DOWNTO0,所以我想知道为什么它是 16 而不是 15。我也不明白溢出代表什么。最后,(’0’&X) 是什么意思/做什么?
我意识到我问了很多问题,所以提前谢谢!
LIBRARY ieee;
USE ieee.std logic 1164.all;
USE ieee.std logic unsigned.all;
ENTITY adder16 IS
PORT ( Cin : IN STD LOGIC;
X, Y : IN STD LOGIC VECTOR(15 DOWNTO 0);
S : OUT STD LOGIC VECTOR(15 DOWNTO 0);
Cout, Overflow : OUT STD LOGIC );
END adder16 ;
ARCHITECTURE Behavior OF adder16 IS
SIGNAL Sum : STD LOGIC VECTOR(16 DOWNTO 0);
BEGIN
Sum < = (’0’&X) + (’0’&Y) + Cin;
S < = Sum(15DOWNTO0);
Cout < = Sum(16);
Overflow < = Sum(16) XOR X(15) XOR Y(15) XOR Sum(15);
END Behavior;
【问题讨论】:
-
或许您能描述一下您遇到的困难?
-
@user16145658 现在我对其中一些代码行的作用有些困惑。我假设 15DOWNTO0 将 x 变成 x0、x1、x2 .. 直到 x15。不过我很困惑,因为在 Signal sum 中它变成了 16DOWNTO0,所以我想知道为什么它是 16 而不是 15。我也不明白溢出代表什么。最后,('0'&X) 是什么意思/做什么?我意识到我问了很多问题,所以提前谢谢
-
没有。
X, Y : IN STD LOGIC VECTOR(15 DOWNTO 0);声明数组类型 std_logic_vector 的端口 X 和 Y,索引范围从 15 到 0。要求数字文字和标识符分开(例如空格)。S <= SUM(15 downto 0);将元素 15 向下到 0 的 SUM 数组切片分配给输出端口 S。(VHDL 在扩展标识符和字符文字中仅区分字符大小写)。使 SUM 大于 S 可以表示进位。二元运算符“+”返回的长度是它的两个操作数中最长的一个。有符号算术中可能发生溢出。 -
@user16145658 非常感谢,这对您有很大帮助。如果没问题,再问一个问题,('0'&X) 是做什么的?
-
连接运算符将数组类型的值与相同数组类型或数组类型的元素类型的其他值连接起来。这里 X 是一个受约束的数组类型的值,它从左侧与值“0”连接,作为 std_logic_vector 的元素类型。 '0' 的类型(可以重载)由上下文(X 的类型,右操作数)决定。制作更小的加法器包括减少 X、Y、S 和 SUM 的左边界,并为 Cout、S 选择新的左边界并计算溢出。
<=是由两个连续字符组成的复合分隔符,没有空格。