【问题标题】:How to write a vhdl code for a 4 bit adder/subtractor如何为 4 位加法器/减法器编写 vhdl 代码
【发布时间】: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 &lt;= 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 选择新的左边界并计算溢出。 &lt;= 是由两个连续字符组成的复合分隔符,没有空格。

标签: vhdl quartus


【解决方案1】:

如果你想要一个 4 位加法器,你必须改变你的向量的值:

STD_LOGIC_VECTOR(3 downto 0);

您的代码中有(15 downto 0),因为将位 0 ​​计数到 15 即为 16 位。如果最后一个最高有效位有进位,溢出位将设置为“1”。

您的 4 位加法器应如下所示:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY adder4 IS
PORT ( Cin : IN STD_LOGIC;
X, Y : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
Cout, Overflow : OUT STD_LOGIC );
END adder4 ;
ARCHITECTURE Behavior OF adder4 IS
SIGNAL Sum : STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
Sum <= (’0’&X) + (’0’&Y) + Cin;
S <= Sum(3 DOWNTO 0);
Cout <= Sum(4);
Overflow <= Sum(4) XOR (X(3) XOR Y(3) XOR Sum(3));
END Behavior;

您可能正在使用 5 位信号总和来检测最重要位“1XXXX”中的溢出,因为您将 Carry Out 分配给 Sum(4)。此解决方案基于您的结构,但您可以更轻松地尝试其他解决方案。

如果您想更改加法器的位数,只需更改代码上的数字,您可以使用 generic

......
ENTITY adderN IS
GENERIC (N : INTEGER := 4); "Where can be 16, 4 or any number of bits"
PORT ( Cin : IN STD_LOGIC;
X, Y : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0);
Cout, Overflow : OUT STD_LOGIC);
END adderN ;
ARCHITECTURE Behavior OF adderN IS
SIGNAL Sum : STD_LOGIC_VECTOR(N-1 DOWNTO 0);
BEGIN
Sum < = (’0’&X) + (’0’&Y) + Cin;
S < = Sum(N-1 DOWNTO 0);
Cout < = Sum(N);
Overflow < = Sum(N) XOR X(N-1) XOR Y(N-1) XOR Sum(N-1);
END Behavior;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多