首页 > 解决方案 > 如何为 4 位加法器/减法器编写 vhdl 代码

问题描述

此代码作为 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’&amp;X) + (’0’&amp;Y) + Cin;
S < = Sum(15DOWNTO0);
Cout < = Sum(16);
Overflow < = Sum(16) XOR X(15) XOR Y(15) XOR Sum(15);
END Behavior;

标签: vhdlquartus

解决方案


如果你想要一个 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’&amp;X) + (’0’&amp;Y) + Cin;
S <= Sum(3 DOWNTO 0);
Cout <= Sum(4);
Overflow <= Sum(4) XOR (X(3) XOR Y(3) XOR Sum(3));
END Behavior;

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

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’&amp;X) + (’0’&amp;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;

推荐阅读