如何为4位加/减器编写vhdl代码

  • 本文关键字:vhdl 代码 4位加 vhdl quartus
  • 更新时间 :
  • 英文 :


此代码为16位加法器的代码。我想把它改成4位,同时也是减法。现在我对这几行代码的作用有点困惑。我假设15DOWNTO0是把x变成x0 x1 x2。直到连接。我很困惑,因为在信号和,然后它变成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;

如果你想要一个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;

当您将执行分配给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’&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;

最新更新