在VHDL中,我想添加5位数和8位数。(无符号)输出有多少位?
我希望我的代码能够回答我刚刚提出的问题。我的代码目前看起来像这样......
我的代码是:
library ieee;
use ieee-std_logic_1164.all;
entity adder is
port( a : in unsigned (7 downto 0);
b : in unsigned (4 downto 0); - - Need to convert this to 8 bit right? But how?
z : out unsigned(7 downto 0)); - - This one must be 8 bits right? Cuz a & b & z must have the same WL. Or am i wrong?
end adder;
archictecture add of adder is
begin
z <= a + b;
end archictecture;
答案 0 :(得分:0)
除了这个更正:
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
你的代码很好。
此外,添加8位数和5位数会产生9位数,因为您可以溢出。例如,"11111111" + "11111"
溢出8位输出,但不会溢出9位输出。
答案 1 :(得分:0)
在{_(1}}的numeric_std包中,最长参数的长度定义了返回值的长度:
function "+" (L, R: UNSIGNED) return UNSIGNED
左右参数长度的最大值为 function "+" (L, R: UNSIGNED) return UNSIGNED is
constant SIZE: NATURAL := MAX(L'LENGTH, R'LENGTH);
variable L01 : UNSIGNED(SIZE-1 downto 0);
variable R01 : UNSIGNED(SIZE-1 downto 0);
begin
if ((L'LENGTH < 1) or (R'LENGTH < 1)) then return NAU;
end if;
L01 := TO_01(RESIZE(L, SIZE), 'X');
if (L01(L01'LEFT)='X') then return L01;
end if;
R01 := TO_01(RESIZE(R, SIZE), 'X');
if (R01(R01'LEFT)='X') then return R01;
end if;
return ADD_UNSIGNED(L01, R01, '0');
end "+";
,两个参数的范围大小调整为SIZE
作为SIZE -1 downto 0
的参数。
ADD_UNSIGNED
function ADD_UNSIGNED (L, R: UNSIGNED; C: STD_LOGIC) return UNSIGNED is
constant L_LEFT: INTEGER := L'LENGTH-1;
alias XL: UNSIGNED(L_LEFT downto 0) is L;
alias XR: UNSIGNED(L_LEFT downto 0) is R;
variable RESULT: UNSIGNED(L_LEFT downto 0);
variable CBIT: STD_LOGIC := C;
begin
for I in 0 to L_LEFT loop
RESULT(I) := CBIT xor XL(I) xor XR(I);
CBIT := (CBIT and XL(I)) or (CBIT and XR(I)) or (XL(I) and XR(I));
end loop;
return RESULT;
end ADD_UNSIGNED;
的长度是L参数的长度,它与RESULT
的两个参数相同。结果中没有任何暗示。
在您的情况下,分配给UNSIGNED_ADD
的结果可以是8位。
修复注释分隔符在端口声明中,添加一个use子句来访问包numeric_std,修复一个' - '应该是'。',拼写为z
并添加一个测试平台,为{添加{ {1}}和architecture
设置为全1',你可以毫无错误地分析,精心设计和运行你的设计,告诉你没有执行数组长度错误。
要将第九个“位”作为加法器的输出,您可以a
一个b
到9位的参数,或者将一个参数与前导零连接成9位值:
RESIZE
它将证明第9位是准确结果所需的:
+
david_koontz @ Macbook:ghdl -a adder.vhdl
david_koontz @ Macbook:ghdl -e tb_adder
david_koontz @ Macbook:ghdl -r tb_adder
adder.vhdl:54:9:@ 1ns :(报告说明):z = 100011110