如何编写4位加减法器VHDL代码及16位加法器代码疑问解答
VHDL加法器代码疑问解答与4位加减法器修改方案
现有代码疑问解答
首先补充一个你理解的小偏差:15 DOWNTO 0定义的16位向量X,最高位是X(15),最低位是X(0),并非按x0到x15的顺序排列。剩余三个问题的解答如下:
- Sum位宽为17位的原因:两个16位无符号数相加再加上进位输入
Cin,最大运算结果为(2^16-1)+(2^16-1)+1 = 2^17-1,需要17位才能完整存储全部运算结果,避免进位位丢失。Sum的低16位存储加法的和,最高位Sum(16)存储最终进位输出。 ('0'&X)语句的作用:&是VHDL中的位拼接运算符,在16位的X前拼接1个逻辑0后,X就被扩展为17位向量,和同样做了拼接处理的Y、1位的Cin做加法时位宽完全匹配,不会触发位宽不匹配的编译错误,也刚好预留了最高位存储进位。- Overflow(溢出)的含义:这是针对有符号数运算的校验标志,16位有符号数的表示范围是
-32768~32767,如果运算结果超出这个范围就会发生溢出,得到错误结果。代码中的异或逻辑是通过判断操作数符号位X(15)/Y(15)、和的符号位Sum(15)、最高进位Sum(16)的一致性判断溢出,结果为1时代表运算溢出。
4位加减法器修改方案
只需调整位宽、新增加减控制信号即可,加法时直接做X+Y,减法时计算X+Y的补码(Y按位取反+1),修改后代码如下:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY adder_sub4 IS PORT ( Add_sub : IN STD_LOGIC; -- 加减控制:0执行加法,1执行减法 X, Y : IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- 4位输入操作数 S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- 4位运算结果 Cout, Overflow : OUT STD_LOGIC ); END adder_sub4; ARCHITECTURE Behavior OF adder_sub4 IS SIGNAL Sum : STD_LOGIC_VECTOR(4 DOWNTO 0); -- 4位运算需5位存储结果和进位 SIGNAL Y_op : STD_LOGIC_VECTOR(3 DOWNTO 0); -- 加减复用的操作数 BEGIN -- 减法时Y取反,加法时直接取原始Y Y_op <= NOT Y WHEN Add_sub = '1' ELSE Y; -- 减法时Add_sub作为补码的+1信号,加法时该位为0无影响 Sum <= ('0' & X) + ('0' & Y_op) + Add_sub; S <= Sum(3 DOWNTO 0); Cout <= Sum(4); -- 4位有符号数溢出判断,符号位为X(3)/Y(3)/Sum(3) Overflow <= Sum(4) XOR X(3) XOR Y(3) XOR Sum(3); END Behavior;
内容的提问来源于stack exchange,提问作者user17153679
相关产品推荐
相关产品推荐

