VHDL加法器和减法器的原理
- 格式:doc
- 大小:45.50 KB
- 文档页数:4
实验一BCD码加法器一、实验目的了解BCD 码的构成。
了解BCD 码加法器的原理和设计实现方法。
巩固Quartus II 的使用。
二、实验内容与要求通过键盘输入两组4BIT的二进制数据,按照二进制加法器原理进行加和,求出和合进位,并通过电路静态数码LED显示灯输出显示,完成编译、综合、适配、仿真、实验箱上的硬件测试。
三、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II四、实验原理BCD码是二进制编码的十进制码,也就是用4位二进制数来表示十进制中的0~9这十个数。
由于4位二进制数有0000~1111共16种组合,而十进制数只需对应4位二进制数的10种组合,故从4位二进制数的16种组合中取出10种组合来分别表示十进制中的0~9,则有许多不同的取舍方式,于是变形成了不同类型的BCD码。
当BCD码相加的值小于等于9时,结果仍旧是正确的BCD码;当两个码相加的结果大于9时,必须作加6的修正处理,对于大于19的值作加12的修正处理,对于大于29的值作加18的修正处理。
然后根据仿真进行实验及验证。
六、仿真截图七、硬件实现八、程序代码1LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY f_ADDER IsPort (x: In Std_Logic;y: In Std_Logic;cin: In Std_Logic;cout: Out Std_Logic;sum: Out Std_Logic);END f_ADDER;ARCHITECTURE fd1 Of f_ADDER Is Component HADDERPort( a,b: In Std_Logic;co,so: Out Std_Logic);END Component;Component oraPort(a,b: In Std_Logic;c: Out Std_Logic);END Component;Signal d,e,f: Std_Logic;BeginU1: HADDERPort Map(a=>X,b=>Y,Co=>d,so=>e);U2:HADDERPort Map(a=>e,b=>cin,Co=>f,so=>sum);U3:ora Port Map(a=>d,b=>f,c=>cout);END ARCHITECTURE fd1;2LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY HADDER IsPort (a,b: In Bit;Co, So: Out Bit);END HADDER;ARCHITECTURE fh1 Of HADDER Is BEGINSo <= (a Xor b);Co <= (a And b);END fh1;3LIBRARY Ieee;USE Ieee.Std_Logic_1164.all;ENTITY ora IsPort ( a: in Std_Logic;b: in Std_Logic;c: out Std_Logic);END ora;ARCHITECTURE org OF ora ISBEGINc <= a Or b;END org;4Library ieee;Use ieee.std_logic_1164.all;Entity Qadd isPort (a:in std_logic_VECTOR(7 DOWNTO 0);b:in std_logic_VECTOR(7 DOWNTO 0);--cin:in std_logic;s:out std_logic_VECTOR(7 DOWNTO 0));End Qadd;Architecture one of Qadd isSignal c0,c1,c2,c3,c4,c5,c6,c7 : std_logic;Component f_ADDERPort (x: In Std_Logic;y: In Std_Logic;cin: In Std_Logic;cout: Out Std_Logic;sum: Out Std_Logic);END Component;Beginu1 :F_ADDERPort map(sum=>s(0),cout=>c0,X=>a(0),Y=>b(0),cin=>'0'); u2 :F_ADDERPort map(sum=>s(1),cout=>c1,X=>a(1),Y=>b(1),cin=>c0 ); u3 : F_ADDERPort map(sum=>s(2),cout=>c2,X=>a(2),Y=>b(2),cin=>c1 ); u4 : F_ADDERPort map(sum=>s(3),cout=>c3,X=>a(3),Y=>b(3),cin=>c2 ); u5 : F_ADDERPort map(sum=>s(4),cout=>c4,X=>a(4),Y=>b(4),cin=>c3 ); u6 : F_ADDERPort map(sum=>s(5),cout=>c5,X=>a(5),Y=>b(5),cin=>c4 ); u7 :F_ADDERPort map(sum=>s(6),cout=>c6,X=>a(6),Y=>b(6),cin=>c5 ); u8 : F_ADDERPort map(sum=>s(7),cout=>c7,X=>a(7),Y=>b(7),cin=>c6 ); END;九、实验总结。
VHDL数学运算VHDL是一种硬件描述语言,可以用于实现数字电路和系统级集成电路设计。
在数字电路和系统级集成电路中,数学运算是一个非常重要的部分。
VHDL可以支持各种数学运算,包括加、减、乘和除等基本运算,以及三角函数、指数函数和对数函数等高级运算。
在VHDL中,基本的加、减、乘和除运算可以使用算术运算符实现。
例如,加法可以使用“+”运算符实现,如下所示:signal a, b, c : std_logic_vector(3 downto 0);c <= a + b;这个代码片段将a和b两个信号相加,并将结果存储在c信号中。
类似地,减法可以使用“-”运算符实现,乘法可以使用“*”运算符实现,除法可以使用“/”或“mod”运算符实现。
除此之外,VHDL还支持各种高级数学函数,例如三角函数、指数函数和对数函数等。
这些函数可以通过VHDL中提供的库函数来实现。
例如,可以使用“sin”函数来计算正弦值,如下所示:signal angle : real;signal sine : real;sine <= sin(angle);此外,VHDL还支持各种数学库函数,例如幂函数、平方根函数和绝对值函数等。
这些函数可以帮助设计人员轻松地实现各种复杂的数学运算和算法。
例如,可以使用“pow”函数来计算任意数的幂,如下所示:signal base : real;signal exponent : integer;signal result : real;result <= pow(base, exponent);总之,VHDL的数学运算功能非常强大,可以帮助设计人员轻松地实现各种数字电路和系统级集成电路的数学运算和算法。
设计人员应该熟练掌握VHDL的数学运算功能,以便能够高效地进行设计和开发工作。
实验报告课程名称电子设计自动化实验(基于FPGA)实验项目加法器、减法器的设计实验仪器计算机+ Quartus Ⅱ9.1系别信息与通信工程学院专业通信工程班级/学号学生姓名实验日期2012、5成绩_______________________ 指导教师_______________________加法器、减法器的设计完成一个8位二进制带符号数的加减电路设计。
设计要求如下:通过拨码开关输入两组8位二进制数,最高位为符号位,0表示正数,1表示负数,其余位表示二进制数值。
用一按键对加、减方式进行控制,0表示加,1表示减。
输出用四位LED数码管显示BCD码。
其中LED显示器最高位为符号位。
VHDL代码LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_unsigned.all;ENTITY add ISPORT(a:in std_logic_vector(7 downto 0);b:in std_logic_vector(7 downto 0);ctrl:in std_logic;bcd:out std_logic_vector(15 downto 0));END ENTITY;ARCHITECTURE func OF add ISSIGNAL x:std_logic_vector(9 downto 0);SIGNAL y:std_logic_vector(9 downto 0);SIGNAL z:std_logic_vector(9 downto 0);SIGNAL c:std_logic_vector(8 downto 0);SIGNAL dec:integer;BEGINyunsuan:BLOCK --运算模块BEGINPROCESS(a)BEGINIF (a(7) = '0') THEN --判断正负x <= '0'&'0'&a;ELSEx(9 downto 8) <= '1'&'1';x(7 downto 0) <= NOT('0'&a(6 downto 0)) + 1;END IF;END PROCESS;PROCESS(a,ctrl)BEGINIF(ctrl = '0') THEN --控制键为0,则做加法IF(b(7) = '0') THENy <= '0'&'0'&b;ELSEy <= '1'&'1'&(NOT('0'&b(6 downto 0))+1);END IF;ELSEIF(b(7) = '1') THENy <= '0'&'0'&'0'&b(6 downto 0);ELSEy <= '1'&'1'&(NOT('0'&b(6 downto 0))+1);END IF;END IF;END PROCESS;PROCESS(a,b)BEGINIF(a(6 downto 0) = 0) THENz <= y;ELSE IF(b(6 downto 0) = 0) THENz <= x;ELSEz <= x + y;END IF;END IF;END PROCESS;PROCESS(z)BEGINIF(z(9) = '1') THEN --判断结果的正负c(7 downto 0) <= NOT z(7 downto 0) + 1;c(8) <= '1';ELSEc(8 downto 0) <= '0'&z(7 downto 0);END IF;END PROCESS;END BLOCK;bcdout:BLOCKBEGINdec <= CONV_INTEGER(c); --二进制转十进制PROCESS(c)BEGINCASE c(8) IS --判断最高位正负WHEN '0' => bcd(15 downto 12) <= "0000";WHEN '1' => bcd(15 downto 12) <= "0001";WHEN OTHERS => bcd(15 downto 12) <= NULL;END CASE;CASE dec/100 IS --判断百位数字WHEN 0 => bcd(11 downto 8) <= "0000";WHEN 1 => bcd(11 downto 8) <= "0001";WHEN OTHERS => bcd(11 downto 8) <= NULL;END CASE;CASE (dec REM 100)/10 ISWHEN 0 => bcd(7 downto 4) <= "0000";WHEN 1 => bcd(7 downto 4) <= "0001";WHEN 2 => bcd(7 downto 4) <= "0010";WHEN 3 => bcd(7 downto 4) <= "0011";WHEN 4 => bcd(7 downto 4) <= "0100";WHEN 5 => bcd(7 downto 4) <= "0101";WHEN 6 => bcd(7 downto 4) <= "0110";WHEN 7 => bcd(7 downto 4) <= "0111";WHEN 8 => bcd(7 downto 4) <= "1000";WHEN 9 => bcd(7 downto 4) <= "1001";WHEN OTHERS => bcd(7 downto 4) <= NULL;END CASE;CASE dec REM 10 ISWHEN 0 => bcd(3 downto 0) <= "0000";WHEN 1 => bcd(3 downto 0) <= "0001";WHEN 2 => bcd(3 downto 0) <= "0010";WHEN 3 => bcd(3 downto 0) <= "0011";WHEN 4 => bcd(3 downto 0) <= "0100";WHEN 5 => bcd(3 downto 0) <= "0101";WHEN 6 => bcd(3 downto 0) <= "0110";WHEN 7 => bcd(3 downto 0) <= "0111";WHEN 8 => bcd(3 downto 0) <= "1000";WHEN 9 => bcd(3 downto 0) <= "1001";WHEN OTHERS => bcd(3 downto 0) <= NULL;END CASE;END PROCESS;END BLOCK;END ARCHITECTURE;未下载验证、调试,如发现错误,见谅!——Higashi Q83831295。
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 isPORT(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 isSIGNAL s1: signed(15 downto 0);BEGINs1<=(Din1(11)&Din1(11)&Din1(11)&Din1(11)&Din1);PROCESS(Din1,Din2,clk)BEGINif clk'event and clk='1' thenDout<=s1+Din2;end if;end process;end a;3.2.4 加法器的模块图3.2.5 加法器的波形仿真完全符合设计要求。
VHDL 加法器设计设计要求:采用QuartusII 集成开发环境利用VHDL 硬件描述语言设计传播进位加法器,直接进位加法器,线形进位加法器,平方根进位加法器,并比较这四种加法器的性能。
为了便于比较性能,将四种加法器都设定为28位。
一、全加器设计全加器是上述四种加法器的基础部件,首先应当设计一位全加器。
设计原理:i i i iS ABC ABC ABC ABC A B C=+++=⊕⊕0i i C AB BC AC =++VHDL 程序:仿真结果:--一位全加器设计library ieee;use ieee.std_logic_1164.all; entity fulladd isport ( A: in std_logic;B: in std_logic; cin:in std_logic; sumbit:out std_logic; cout:out std_logic );end fulladd;architecture behav of fulladd is beginsumbit<=(A xor B) xor cin;cout<=(a and b) or (cin and a) or (cin and b); end behav;二、传播进位加法器设计实际上加法器就是是全加器的级联,其中的每个FA网络为一个全加器(采用上文所述的全加器)VHDL代码:--传播进位加法器library ieee;use ieee.std_logic_1164.all;use work.all;entity carry_propogate_adder isport (A: in std_logic_vector(27 downto 0);B: in std_logic_vector(27 downto 0);cin:in std_logic;sum:out std_logic_vector(27 downto 0);cout:out std_logic);end carry_propogate_adder;architecture behav of carry_propogate_adder issignal ct:std_logic_vector(28 downto 0);component fulladd isport (A: in std_logic;B: in std_logic;cin:in std_logic;sumbit:out std_logic;cout:out std_logic);end component;beginct(0)<=cin;cout<=ct(28);G1: for i in 0 to 27 generatel1:fulladd port map (A(i),B(i),ct(i),sum(i),ct(i+1));end generate G1;end behav;功能仿真:延时测定:由图中的两个时间bar 的差值可看出,sum 值和cout 值几乎同时计算出,其Tdelay=28.332ns (cin 无关)三、直接进位加法器设计 设计原理:首先将AB 输入转换为PG 输入,若每级的P 输入都是‘1’则直接将Ci 传给Co ,否则像传播进位加法器一样计算其AB-PG 转换网络原理:Fa 全加器原理:P A B G AB=⊕=o i iC G PC S P C =+=⊕VHDL 代码:-- FA 子单元 library ieee;use ieee.std_logic_1164.all;entity Fa isport (Pi,Gi,Ci:in std_logic; Coi,Si:out std_logic); end Fa;architecture Fabehav of Fa is beginCoi<=Gi or (Pi and Ci);Si<=Pi xor Ci; end Fabehav; --ABtoPG 转换网络 library ieee;use ieee.std_logic_1164.all;entity PGNet isport(Ai,Bi:in std_logic; Pi,Gi:out std_logic); end PGNet;architecture PGbehav of PGNet is beginPi<=Ai xor Bi;Gi<=Ai and Bi; end PGbehav; --传播进位加法器 library ieee;use ieee.std_logic_1164.all; entity bypass_adder is port(A,B:in std_logic_vector(27 downto 0); Ci:in std_logic; Sum:out std_logic_vector(27 downto 0); Co:out std_logic );end bypass_adder;architecture adderbehav of bypass_adder is component Fa is port (Pi,Gi,Ci:in std_logic; Coi,Si:out std_logic ); end component; component PGNet is port(Ai,Bi:in std_logic; Pi,Gi:out std_logic ); end component;signal P,G:std_logic_vector(27 downto 0); signal C:std_logic_vector(28 downto 0); signal BP:std_logic; begin C(0)<=Ci; G1: for i in 0 to 27 generate l1: PGNet port map(A(i),B(i),P(i),G(i)); end generate G1; G2: for i in 0 to 27 generate l2:Fa port map (P(i),G(i),C(i),C(i+1),Sum(i)); end generate G2; BP<='1' when P="11111111111111111111111111111111" else '0'; Co<=Ci when BP='1' else C(8); end adderbehav;功能仿真:延时仿真:当通过直接进位网络(图中testp值全部为1时),进位信号有一定提前,但由于计算所有的P值本身也需要一定时间,所以改善并不明显。
实验四计数器的使用一、实验目的熟悉步长可变的加减计数器的工作原理、设计过程和实现方法。
二、实验内容与要求学习用VHDL设计步长可变的加减计数器电路,完成编译、综合、适配、仿真和实验箱上的硬件测试,通过LED数码管显示输入输出各部分数据。
三、实验原理通过输入一组4BIT二进制数据,控制计数方式,即步长,决定每个脉冲到来时计数器增加的数值,同时还有一个单BIT的控制位,选择加计数或者减计数,并通过电路显示各部分数据(输入及输出)。
拨码开关置为MODEL_SEL5-8,全部置为ON,通过USB下载;全部置为OFF,则通过LAB_JTAG_PS_AS接口下载。
DISP_SEL8,处于“ON”状态,这样可以使用静态共阳数码管DISP_SEL1,DISP_SEL2处于“OFF”状态,通过F1,F2的十六进制的输入,在静态共阳数码管DP1B,DP2B上显示输出。
F1,F2预置数据,通过计数器,总的计数值控制电平宽度,其中一组控制高电平,一组控制低电平。
在DP1B上显示的是0-F的步长可变的加减计数器。
四、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II软件五、六、仿真截图七、硬件实现八、程序代码1--10 位计数SCAN TOP_LEVEL程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY ACOUNT100 ISPORT(clk,clr,en,en6:IN STD_LOGIC ;count1 : out std_logic ;ledseg : out std_logic_vector(6 downto 0);ledcom :out std_logic_vector(5 downto 0)); END;ARCHITECTURE ONE OF ACOUNT100 IS COMPONENT clkgen ISPORT(clkin:IN STD_LOGIC ;clkout: OUT STD_LOGIC);END COMPONENT;COMPONENT COUNT10a ISPORT(clk,clr,en:IN STD_LOGIC ;q:OUT STD_LOGIC_vector(3 downto 0);count1:OUT STD_LOGIC);end COMPONENT;COMPONENT bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segmentend COMPONENT;COMPONENT mx isport(s:in std_logic;a,b:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend COMPONENT;COMPONENT com_encode isport(s :in std_logic;--input countledcom :out std_logic_vector(5 downto 0));--output encodeend COMPONENT ;signal clk1,c10: std_logic;signal q1,q2,bcd: std_logic_vector(3 downto 0);BEGINU1:clkgen PORT MAP(CLKIN=>CLK,CLKOUT=>CLK1);U2:COUNT10a PORT MAP(clk=>CLK1,clr=>clr,en=>en,q=>q1,count1=>c10);U3:COUNT10a PORT MAP(clk=>CLK1,clr=>clr,en=>c10,q=>q2,count1=>count1); U4:MX PORT MAP(S=>CLK1,A=>q1,b=>q2,q=>bcd);U5:bcd_7seg PORT MAP(bcd_led=>bcd,ledseg=>ledseg);U6:com_encode PORT MAP(s=>clk1,ledcom=>ledcom );end;2---clkgen.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY clkgen ISPORT(clkin:IN STD_LOGIC ;clkout: OUT STD_LOGIC);END;ARCHITECTURE even OF clkgen ISconstant N:Integer:=50000000;--constant N:Integer:=10;SIGNAL coun:integer range 0 to N;SIGNAL clk1:STD_LOGIC;BEGINPROCESS(clkin)BEGINIF(clkin'EVENT AND clkin='1')THENIF(coun=N)THENcoun<=0;clk1<=Not clk1;elsecoun<=coun+1;END IF;END IF;END PROCESS;clkout<=clk1;END even;3--10 位计数器程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNT10a ISPORT(clk,clr,en:IN STD_LOGIC;count1:OUT STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COUNT10a ;ARCHITECTURE rtl OF COUNT10a ISSIGNAL qs:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ca:STD_LOGIC;BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENIF(clr='1')THENqs<="0000";ELSIF(en='1')THENIF(qs="1001")THENqs<="0000";ca<='0';ELSIF(qs="1000")THEN --在计数到8时,即让进位赋值1,--由于信号会产生一个滞后,使得实际ca在9时出现qs<=qs+1;ca<='1';ELSEqs<=qs+1;ca<='0';END IF;END IF;END IF;END PROCESS;PROCESS(ca,en)BEGINq<=qs;count1<=ca AND en;END PROCESS;END rtl;4library ieee;use ieee.std_logic_1164.all;entity mx isport(s:in std_logic;a,b:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0));end mx;architecture rtl of mx isbeginq<= a WHEN s = '0' ELSE b ;end rtl;5--七段显示扫描电路--comcoun.vhd 7 segment com scan counterlibrary ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend comcoun;architecture behavior of comcoun issignal q : std_logic_vector(2 downto 0);--internal counted signal beginfscan:process(clk)beginif (clk'event and clk='1') thenif (enable='1') thenif q>=1 thenq<="000";--initial counterelseq<=q+1;--countingend if;end if;end if;end process fscan;comclk<=q; --output internal countend behavior;6library ieee ;use ieee.std_logic_1164.all;entity bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segment end bcd_7seg;architecture behavior of bcd_7seg isbeginwith bcd_led selectledseg<="0111111" when "0000",--0,3f"0000110" when "0001",--1,06"1011011" when "0010",--2,5b"1001111" when "0011",--3,4f"1100110" when "0100",--4,66"1101101" when "0101",--5,6d"1111101" when "0110",--6,7d"0100111" when "0111",--7,27"1111111" when "1000",--8,7f"1101111" when "1001",--9,6f"1110111" when "1010",--A"1111100"when "1011", --b"0111001"when "1100",--c"1011110" when "1101",--d"1111001"when "1110",--E"1110001" when "1111",--F"0000000" when others;end behavior;7--计数译码电路-- 6 共阴--com_encode.vhd 7 segment com encoderlibrary ieee ;use ieee.std_logic_1164.all;entity com_encode isport(s :in std_logic;--input countledcom :out std_logic_vector(5 downto 0));--output encode end com_encode;architecture behavior of com_encode isbeginledcom<="000001" when s='0' else"000010" ;end behavior;九、实验总结。
基于 VHDL 语言的8位加法器的设计作者:吴中友(陕理工物理电子信息科学与技术专业07级1班,陕西汉中 723000)指导教师:蒋嫒[摘要]利用VHDL言语,实现两个4位并行进位加法器,然后将其级联成为一个8位加法器,再实现一个二进制转换成十进制动态显模块,以显示相加结果,并在仿真软MAX+plus II中进行仿真。
[关键词]VHDL、加法器、MAX+plus IIDesignof 8-bit Adder based on VHDLWu Zhongyou(Department of Physics,ShaanxiUniversity of Technology,Hanzhong,Shaanxi 723000)Tutor:Jiang YuanAbstract:using VHDL, and the road to achieve two 4-bit adder, and then cascade into an 8-bit adder, and then converted to decimal binary to achieve a dynamic explicit module to display the sum of the results, and the simulation software MAX + plus II for simulation.Key words VHDL, adder, MAX + plus II0.引言加法器是用来实现加法的器件,即它是产生数的和的装置。
加数和被加数为输入,和数与进位为输出的装置为半加器。
若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。
加法器常用作计算机算术逻辑部件,执行逻辑操作、移位与指令调用,是计算机进行算术逻辑运算的基本部件。
研究加法器的实现对于电子硬件设计及其的理论发展的认识和理解具有重要意义。
1.设计原理加法器是数字系统中的基本逻辑器件。
VHDL不同位宽数据相加1. 背景介绍VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,广泛用于数字电路的设计和验证。
在数字电路中,经常需要对不同位宽的数据进行加法运算。
本文将介绍在VHDL中如何实现不同位宽数据的相加。
2. 数据位宽的概念数据位宽指的是一个数据的二进制表示中的位数。
例如,一个8位的数据可以表示0-255的整数。
在VHDL中,我们需要明确每个数据的位宽,以便正确地进行运算。
3. VHDL的基本语法在VHDL中,我们使用entity和architecture两个关键字来定义电路的外部接口和内部实现。
接下来,我们将使用一个例子来说明如何实现不同位宽数据的相加。
entity adder isgeneric(width1 : positive := 8; -- 第一个数据的位宽width2 : positive := 8 -- 第二个数据的位宽);port(a : in std_logic_vector(width1-1 downto 0); -- 第一个输入数据b : in std_logic_vector(width2-1 downto 0); -- 第二个输入数据sum : out std_logic_vector(max(width1, width2)-1 downto 0) -- 结果数据);end entity adder;architecture rtl of adder isbeginsum <= std_logic_vector(unsigned(a) + unsigned(b)); -- 进行相加运算end architecture rtl;在上面的例子中,我们定义了一个名为adder的电路,它包含了两个输入端口a和b,以及一个输出端口sum。
输入端口a和b的位宽可通过generic关键字进行配置,默认为8位。
vhdl全加器实验报告VHDL全加器实验报告引言:在数字电路设计领域,全加器是一种基本的逻辑电路。
它用于将两个二进制数相加,并产生相应的和与进位输出。
在本次实验中,我们将使用VHDL语言设计和模拟一个全加器电路,并通过实验验证其功能和正确性。
一、实验目的本实验的目的是通过设计和模拟一个VHDL全加器电路,加深对数字电路和VHDL语言的理解。
具体目标如下:1. 学习并掌握全加器的原理和电路结构;2. 掌握VHDL语言的基本语法和使用方法;3. 设计和模拟一个全加器电路,并验证其正确性;4. 分析和评估全加器电路的性能和优化方法。
二、全加器的原理和电路结构全加器是一种用于二进制加法的逻辑电路。
它接受两个输入位和一个进位输入位,并产生一个和输出位和一个进位输出位。
全加器的电路结构通常由两个半加器和一个或门组成。
半加器用于计算两个输入位的和,而或门用于计算进位输出位。
三、VHDL语言的基本语法和使用方法VHDL是一种硬件描述语言,用于描述和模拟数字电路。
它具有丰富的语法和功能,可以方便地进行电路设计和仿真。
VHDL语言的基本语法包括实体声明、端口声明、信号声明、过程声明等。
在本次实验中,我们将使用VHDL语言来描述和模拟全加器电路。
四、全加器电路的设计和模拟在本次实验中,我们将使用VHDL语言设计和模拟一个4位全加器电路。
首先,我们需要定义输入和输出信号,并声明全加器的实体和端口。
接下来,我们可以使用VHDL语言描述全加器的逻辑电路,包括半加器和或门的连接关系。
最后,我们可以使用仿真工具对全加器电路进行模拟,并观察输出结果。
五、全加器电路的验证和性能评估在模拟过程中,我们可以通过输入不同的二进制数来验证全加器电路的正确性。
我们可以逐个比较输入和输出的二进制数,并检查和进位输出是否与预期结果一致。
如果全加器电路能够正确地计算和输出结果,则说明设计和模拟过程是正确的。
此外,我们还可以评估全加器电路的性能和优化方法。
用VHDL语言实现浮点数运算随着CPLD和FPGA的出现以及EDA技术的成熟,采用CPLD/FPGA实现数字信号处理的方法已经显示出巨大的潜力。
由于CPLD/FPGA器件具备在线可编程能力,克服了专用处理器灵活性方面的不足,同时兼备了高速和低成本的优点,使CPLD /FPGA在数字信号处理领域得到广泛应用。
近年来,高密度可编程器件CPLD/FPGA的集成度、速度不断提高,设计手段更加完善。
1、浮点数加/减法器的设计整个浮点数加减法器简化为:对阶、尾数运算、规格化3部分。
(1)对阶使两个数据的阶码相等,这时才能进行尾数的加减运算.在对阶操作时,总是使小阶向大阶对齐.实现的方法是,将原来阶码小的数的尾数部分右移,并相应地增加其阶码.传统的做法是将原来阶码小的数的尾数部分右移1位,其加1,直至阶码相等.如图1所示在进行对阶操作时,首先比较 Ea、Eb的大小,产生换路指示位:若 Ea>Eb 则换路有效,否则换路无效;同时输出大阶E:若 Ea>Eb,则E≤Ea,否则E≤Eb;阶差:△E=|Ea-Eb|,用于控制可变步长移位器的移位步长.对于原码表示的尾数,移位时尾数高位补零.可变步长移位器是对阶器的核心部件,用VHDL描述如下:ENTTTY MOVE IS P0RT(INPUT: IN STD—LOGIC— VECTOR(3 DOWNTD 0);COUNT: IN INTEGER RANGE 0 TO 3;OUTP: OUT STD—LOGIC— VECTOR(3 DOWNTO 0));END MOVE;ARCHITECTURE MUX—ARC OF MOVE ISBEGINOUTPUT:PROCESS(INPUT,COUNT)BEGINCASE COUNT ISWHEN 0~OUTP(3 DOWNT 0)~INPUT(3 DOWNTO 0);WHEN l~ OUTP(3 DOWNTO 0) ~ “0”&INPUT(3 DOWNTO 1);WHEN 2~ OUTP(3 DOWNTO 0) ~ “00”&INPUT(3 DOWNTO 2);WHEN 3~OUTP(3 DO 0) ~ “000”&INPUT(3);END CASE;END PROCESS;END MUX—ARC;(2)尾数运算完成尾数即完成尾数的加减运算。
vhdl全加器实验报告VHDL全加器实验报告引言:在现代计算机科学中,加法运算是基本而重要的运算之一。
全加器是一种用于实现二进制加法的电路。
本次实验旨在使用VHDL语言设计和实现一个全加器电路,并通过仿真和测试验证其正确性和可行性。
一、全加器的原理和设计思路全加器是由两个半加器和一个额外的输入信号组成的电路。
它的输入包括两个二进制数位的输入信号A和B,以及一个来自上一位的进位信号Cin。
输出包括一个和位输出信号S和一个进位输出信号Cout。
全加器的真值表如下:A B Cin S Cout0 0 0 0 00 0 1 1 00 1 0 1 00 1 1 0 11 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1根据全加器的真值表,我们可以得到以下逻辑表达式:S = A ⊕ B ⊕ CinCout = (A ∧ B) ∨ (Cin ∧ (A ⊕ B))基于以上原理和逻辑表达式,我们可以使用VHDL语言来实现全加器电路。
二、VHDL全加器电路的设计和实现1. 实体声明:首先,我们需要在VHDL代码中声明全加器的输入和输出信号。
代码如下:entity FullAdder isport (A, B, Cin: in std_logic;S, Cout: out std_logic);end FullAdder;2. 架构实现:接下来,我们需要在VHDL代码中实现全加器的逻辑功能。
代码如下:architecture behavior of FullAdder isbeginS <= A xor B xor Cin;Cout <= (A and B) or (Cin and (A xor B));end behavior;三、VHDL全加器电路的仿真和测试1. 仿真环境的搭建:为了验证全加器电路的正确性,我们需要使用VHDL仿真工具进行电路的仿真。
这里我们使用ModelSim进行仿真。
数字电路中加法器和减法器逻辑图分析1.加法器,减法器都是从一位的二进制数开始进行例题讲解,逐渐扩展到多位二进制位数之间的运算。
在设计逻辑电路的过程中,根据所描述的功能构建好真值表。
出题者喜欢要求读者用与或门,与或非门构建函数表达式。
它的原因在于依据真值表写函数表达式,最标准的就是最小项表达式。
以下小图的逻辑图来看与或门,我们的头脑中不能老是思维定势,认为输入就是两个,在实际生活中,输入应该非常多,远非两个,在逻辑符号中,要清楚地认识与非门的多输入的画法,将与门分成了好几格,每一格代表一个与门电路。
下小图可以写成AB+CD+EF(不认真考虑前面的输入),由细小的门集成为更大的门,将某一部分单独来看,它们就是一个整体,如(AB+CD+EF),体现在逻辑图中就是一个角。
如果从全图的角度看,在最后一级门电路中,每一个小整体代表着输出。
最后一级的与门中,有两个输入,有三个输入,这都是可以的,最多输入的个数是依照初始的输入的个数来定,不可能超过这个数,只可能少于这个数,因为对于某一输出而言,并非所有的输入对它都是有效的。
从最左边的所有输入,经过逻辑电路图,在最右边得到了所有的输出。
还有一点,这是与或表达式的逻辑图,如果在写逻辑表达式,包括化简变化函数式时,采用了不同于与或形式的表达式,那么最终得到的逻辑图就和下面的与或形式的逻辑图完全不一样。
2.一位的全减器是指,两个一位的二进制数之间进行减法运算。
全减器的特例就是半减器。
多位二进制减法器,是由加法电路构成的;在加法电路的基础上,减法与加法采用同一套电路,实现加减法共用。
3.这里的多位二进制数的减法,是指无符号数,为什么?将减法运算转换为加法运算,采用的是补数的方法完成的。
这就解释了为什么两者能共用一套电路,是不是减法在转换时,我们需要在加法电路的基础上进行一些小的扩展,来进行减法的补码转换?N反是每一位都取反,没有符号位,下式当中,A-B是减法,通过形式转化,将-B化为B反+1-2n,B是正数,A和B均为无符号数,通过补码的转变,我们成功的将-B变为了固定的-2n,但是这还是有减号,该怎么解决?仔细观察下面这张图,A和B是两个四位二进制数相减。
加法器
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 乘法器的波形仿真
完全符合设计要求。