VHDL加法器,相同的字长?

时间:2014-09-10 21:56:27

标签: vhdl bits

在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;

2 个答案:

答案 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