vhdl - 如何为 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’&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;
推荐阅读
- php - FPDF 分节符
- hive - 为什么 hive 在 Join 操作期间不选择 SerDe JAR?
- javascript - 如何在节点中的多个文件之间同步缓存对象?
- java - (LibGDX) Android 应用程序在创建 FrameBuffers 时崩溃
- python-2.7 - 如何在视频中找到鼠标悬停位置(最好是时间戳)?
- responsive-design - 如何使静态 html 页面缩小或拉伸以适应移动屏幕?
- sql-server - 对 SQL Server 中的表行应用过滤器
- python-3.x - Python -GTTS-Twilio - 短信mp3
- android - 在 Android Webview 窗口中打开工作只需一次
- javascript - 试图从网页中抓取 html,但没有为 Document.getClass 获取正确的类名/层次结构