当前位置:文档之家› VHDL加法器和减法器的原理

VHDL加法器和减法器的原理

加法器
3.2.1 加法器的原理
在将两个多位二进制数相加时,除了最低位以外,每一位都应该考虑来自低位的进位,即将两个对应位的加数和来自低位的进位3个数相加。

这种运算称为全加,所用的电路称为全加器。

多位加法器的构成有两种方式:并行进位和串行进位。

并行进位加法器设有进位产生逻辑,预算速度较快;串行进位方式是将全加器级联构成多位加法器。

并行进位加法器通常比串行级联加法器占用更多的资源。

随着为数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大,因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。

本次设计采用的是并行加法器方式。

3.2.2 加法器要求实现的功能
实现两个二进制数字的相加运算。

当到达时钟上升沿时,将两数输入,运算,输出结果。

3.2.3 加法器的VHDL语言实现
(以下以12位数加16位数生成16位数的加法器为例)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_arith.ALL;
ENTITY add121616 is
PORT(clk : in STD_LOGIC;
Din1 :in signed (11 downto 0);
Din2 :in signed (15 downto 0);
Dout:out signed (15 downto 0));
END add121616;
ARCHITECTURE a of add121616 is
SIGNAL s1: signed(15 downto 0);
BEGIN
s1<=(Din1(11)&Din1(11)&Din1(11)&Din1(11)&Din1);
PROCESS(Din1,Din2,clk)
BEGIN
if clk'event and clk='1' then
Dout<=s1+Din2;
end if;
end process;
end a;
3.2.4 加法器的模块图
3.2.5 加法器的波形仿真
完全符合设计要求。

3.3 减法器
3.3.1 减法器的原理
减法器的原理与加法器类似,尤其是并行式的减法器也加法器的区别仅仅在于最后的和数为两数相减。

如:
Dout<=Din2-s1;
3.3.2 减法器要求实现的功能
由上面简化电路的需要,当乘法器常系数为负数的,可以取该数的模来作为乘法器的输入,其输出作为一个减法器的输入即可。

故减法器要实现两个二进制数相减的运算。

当到达时钟上升沿时,将两数输入,运算,输出结果。

3.3.3 减法器的VHDL语言实现
(以下以16位数减去14位数输出16位数的减法器为例)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_arith.ALL;
ENTITY sub141616 is
PORT(clk : in STD_LOGIC;
Din1 :in signed (13 downto 0);
Din2 :in signed (15 downto 0);
Dout :out signed(15 downto 0));
END sub141616;
ARCHITECTURE a of sub141616 is
SIGNAL s1: signed(15 downto 0);
BEGIN
s1<=(Din1(13)&Din1(13)&Din1);
PROCESS(Din1,Din2,clk)
BEGIN
if clk'event and clk='1' then
Dout<=Din2-s1;
end if;
end process;
end a;
3.3.4 减法器的模块图
3.3.5 减法器的波形仿真
完全符合设计要求。

3.4 乘法器
3.4.1 乘法器的原理
从资源和速度考虑,常系数乘法运算可用移位相加来实现。

将常系数分解成几个2的幂的和形式。

下例为乘18电路设计,算法:18=16+2
3.4.2 乘法器要求实现的功能
实现输入带符号数据与固定数据两个二进制数的乘法运算。

当到达时钟上升沿时,将两数输入,运算,输出结果。

3.4.3 乘法器的VHDL语言实现
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY mult18 is
PORT
( clk : IN STD_LOGIC;
Din : IN SIGNED (8 DOWNTO 0);
Dout : OUT SIGNED (12 DOWNTO 0));
END mult18;
ARCHITECTURE a OF mult18 IS
SIGNAL s1 : SIGNED (12 DOWNTO 0);
SIGNAL s2 : SIGNED (9 DOWNTO 0);
SIGNAL s3 : SIGNED (12 DOWNTO 0);
BEGIN
P1:process(Din)
BEGIN
s1(12 DOWNTO 4)<=Din;
s1( 3 DOWNTO 0)<="0000";
s2(9 DOWNTO 1)<=Din;
s2(0)<='0';
if Din(8)='0' then s3<=('0'&s1(12 downto 1))+("0000"&s2(9 DOWNTO 1)); else s3<=('1'&s1(12 downto 1))+("1111"&s2(9 DOWNTO 1));
end if;
end process;
P2: PROCESS(clk)
BEGIN
if clk'event and clk='1' thenDout<=s3;
end if;
END PROCESS;
END a;
3.4.4 乘法器的模块图
3.4.5 乘法器的波形仿真
完全符合设计要求。

相关主题