EDA--八位二进制乘法器
EDA技术》实验报告8位二进制加法器设计
《EDA技术》实验报告实验名称: 8位二进制全加器设计
姓名:
班级:
学号:
实验日期:2010-3-29
指导教师:
一、实验设计要求
以一位二进制全加器为基本元件,用例化语句写出8位并行二进制全加器的顶层文件,并讨论此加法器的电路特性。
二、设计原理
电路结构图或原理图
电路功能描述
定义了8位二进制全加器顶层设计元件端口信号,输入端口:AIN, BIN,是八个二进制数,数据类型被定义为STD_LOGIC_VECTOR。
CIN是输入的进位,数据类型IN STD_LOGIC;输出端口:SUM为和,数据类型IN STD_LOGIC COUT 为输出的进位。
三、实验程序
程序1:一位二进制全加器设计顶层描述
程序2:8位并行二进制全加器顶层文件
四、编译及仿真结果
选用器件型号cyclone
编译后使用器件资源情况、引脚配置情况(硬件实验)
仿真结果显示:
该设计是成功的。
输入的进位也要加上去。
0---255 全加器的COUNT 没有进位,而当加到256,COUNT=1,SUM输出0.
五、总结
.1 编译不通过,检查后发现在建立工程时,同一工程的所有文件都必须放在同一文件夹中,而这一步没做。
2 程序中没有将文件名与实体名保持一致出错。
输入半加器的VHDL程序保存文件,将输入的VHDL语言程序保存为h _adder.vhd.
3不知道如何将输入/输出引脚号都添加到矢量波形编辑窗口中。
解决办法:view—utility window—noder finder 将需要引脚拖拽。
中山学院EDA综合实验报告-8位硬件乘法器设计
在实验老师的指导下,我圆满完成了实验任务,有了不少收获,其中了解到了移位相加原理构成乘法器与用组合逻辑电路直接设计的同样功能的电路优势,并且在加深了如何通过VerilogHDL生成原理图器件并进行相应仿真,最后学习了应用移位相加原理设计8位乘法器。
3、ADDER8BT的仿真图及分析
如图所示,红色剪头表示8+11=19,绿色剪头表示8+9=17,紫色剪头表示8+9+1=18,这说明S=A+B+CIN。
4、完整乘法器的仿真图及分析
如图所示,红色剪头表示外部按键START按下(给SREG8BT的LOAD高电平)时给ARIEND一个高电平输出,绿色剪头处的Q为31104,而31104<<1结果为0xF300,此处最高位为0xF3,即相乘的结果为0xF3,这里表示B的数值0xF3乘以A的数值0xC8第4位再加上前3位的结果,因为前3位相乘后的结果为0,因此这里相乘的结果为0xF3,紫色剪头也是同理。
如图所示,在第一个2,此时输出Q=1536,其二进制表示为0000 0110 0000 0000,由VerilogHDL代码可知R16S[6:0]<=R16S[7:1]即R16S[6:0] = 0,R16S[15:7] = 12,此结果与Q输出结果一致绿色剪头与紫色剪头也是同理。
学生实验报告
系别
电子信息学院
课程名称
《EDA综合实验》
班级
实验名称
8位硬件乘法器设计
姓名
实验时间
学号
指导教师
成绩
批改时间
报告内容
一、实验目的和任务
1、学习应用移位相加原理设计8位乘法器。
2、了解移位相加原理构成乘法器与用组合逻辑电路直接设计的同样功能的
EDA大作业 课程设计 简易计算器
在掌握常用数字电路功能和原理的基础上,根据EDA技术课程所学知识,利用硬件描述语言Verilog HDL、EDA软件Quartus II和硬件平台Cyclone/Cyclone II FPGA进行电路系统的设计。
本次实验我完成的内容是简单计算器的设计,下面我简单的进行一下原理的阐述。
设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
为了完成要求的效果显示,我先设计了一个简单的四则运算器,为了使其结果能清楚的看到,所以计算器模块和一个7段数码管模块连接。
实验要求,输入分别用两位数码管显示,输出用四位数码管显示,所以用一个3—8译码器和数码管连接,通过开关控制,形成动态显示。
从左向右,依次是第一位数码管显示a的高四位,第二位数码管显示a的低四位;第三位数码管显示b的高四位,第四位数码管显示b的低四位;第五位数码管到第八位数码管显示输出的结果。
通过改变时钟,使其看起来像同时显示在数码管上。
设计流程如下图,分别用两个数码管表示八位二进制数,用一个case 语句表示输入数值采用哪种运算方式,分别用00,01,10,11表示加,减,乘,除。
用3—8译码器选择从哪个数码管输出。
硬件流程图输出结果 A. B 的显示软件流程图LED 灯接线部分显示:中心控制 复位编码 数码管输出输入A 输入B 运算选择C 输出out L E D 8 L E D 7 L E D 6 L E D 5 L E D 4 L E D 3 L E D 2 L E D 1第三章程序简单计算器的程序如下:module jsq9(a,b,c,Dout,count,clk,rst);input[7:0]a,b;input clk,rst;input[1:0]c;output[6:0]Dout;output [2:0]count;reg[6:0]Dout;reg[2:0]count;reg[15:0]out;reg[6:0] LED7S1,LED7S2,LED7S3,LED7S4, LED7S5,LED7S6,LED7S7,LED7S8; DECL7S u1(.A(a[7:4]) , .LED7S(LED7S1));DECL7S u2(.A(a[3:0]) , .LED7S(LED7S2));DECL7S u3(.A(b[7:4]) , .LED7S(LED7S3));DECL7S u4(.A(b[3:0]) , .LED7S(LED7S4));DECL7S u5(.A(out[15:12]) , .LED7S(LED7S5));DECL7S u6(.A(out[11:8]) , .LED7S(LED7S6));DECL7S u7(.A(out[7:4]) , .LED7S(LED7S7));DECL7S u8(.A(out[3:0]) , .LED7S(LED7S8));reg[7:0]out1,out2;always@(a,b,c,Dout,count,clk,rst)case(c)2'b00:out=a+b;2'b01:out=a-b;2'b10:out=a*b;2'b11:beginout1=a/b;out2=a%b;out={out1,out2};enddefault:;endcasealways@(posedge clk or negedge rst)beginif(!rst)count<=3'b000;else if(count==3'b111)count<=3'b000;elsecount<=count+3'b001;endalways@(posedge clk)begincase(count)3'b000: Dout<=LED7S1;3'b001:Dout<=LED7S2;3'b010:Dout<=LED7S3;3'b011:Dout<=LED7S4;3'b100: Dout<=LED7S5;3'b101:Dout<=LED7S6;3'b110:Dout<=LED7S7;3'b111:Dout<=LED7S8;endcaseendendmodulemodule DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111; 4'b0001: LED7S <= 7'b0000110 ; 4'b0010: LED7S <= 7'b1011011; 4'b0011: LED7S <= 7'b1001111; 4'b0100: LED7S <= 7'b1100110 ; 4'b0101: LED7S <= 7'b1101101; 4'b0110: LED7S <= 7'b1111101 ; 4'b0111: LED7S <= 7'b0000111 ; 4'b1000: LED7S <= 7'b1111111 ; 4'b1001: LED7S <= 7'b1101111 ; 4'b1010: LED7S <= 7'b1110111 ; 4'b1011: LED7S <= 7'b1111100 ; 4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ; 4'b1110: LED7S <= 7'b1111001 ; 4'b1111: LED7S <= 7'b1110001 ; endcaseendendmodule第四章模块连接在本程序中,共由三个模块组成,第一个模块是一个四选一多路器其仿真图为:第二个模块是7段数码管显示程序如下module DECL7S (A, LED7S);input [3:0] A;output [6:0] LED7S;reg [6:0] LED7S;always @(A)begincase(A)4'b0000 : LED7S<=7'b0111111;4'b0001: LED7S <= 7'b0000110 ;4'b0010: LED7S <= 7'b1011011;4'b0011: LED7S <= 7'b1001111;4'b0100: LED7S <= 7'b1100110 ;4'b0101: LED7S <= 7'b1101101;4'b0110: LED7S <= 7'b1111101 ;4'b0111: LED7S <= 7'b0000111 ;4'b1000: LED7S <= 7'b1111111 ;4'b1001: LED7S <= 7'b1101111 ;4'b1010: LED7S <= 7'b1110111 ;4'b1011: LED7S <= 7'b1111100 ;4'b1100: LED7S <= 7'b0111001 ;4'b1101: LED7S <= 7'b1011110 ;4'b1110: LED7S <= 7'b1111001 ;4'b1111: LED7S <= 7'b1110001 ;endcaseendendmodule仿真图如下:把这个两个模块用一个3—8译码器进行连接,使其达到实验的要求。
8位硬件乘法器设计
end
endmodule
4.基于时序电路的移位相加乘法器-8位加法器
module adder8(cin,A,B,S,cout);
input cin;
input[7:0] A,B;
output[7:0] S;
output cout;
assign {cout,S}=cin+A+B;
2016年10月31日
学号
指导教师
王红航
成绩
批改时间
2016年月日
报告内容
一、实验目的和任务
1.学习应用移位相加原理设计8位乘法器。
2.了解移位相加原理构成乘法器与用组合逻辑电路直接设计的同样功能的电路优势。
二、实验原理介绍
图1 8位乘法器逻辑原理图
图2 8位移位相加乘法器运算逻辑波形图
三、设计代码(或原理图)、仿真波形及分析
input [7:0] A;
output qb;
reg[7:0] reg8;
always@(posedge clk or posedge load)
begin
if(load) reg8<=A;
else reg8[6:0]<=reg8[7:1];//移位相加_8位二进制加法器
end
assign qb=reg8[0];
1.基于时序电路的移位相加乘法器-16位移位寄存器
module sreg(clk,clr,d,q);
input clk,clr;
input [8:0] d;
output[15:0] q;
reg[15:0] reg16;
always@(posedge clk or posedge clr)
EDA8位计数显示译码电路的设计
EDA8位计数显示译码电路的设计八位计数显示译码电路是一种常见的数字电路设计,用于将二进制计数器的输出转换为对应的字符或数字显示。
本次EDA报告将介绍八位计数显示译码电路的设计原理、功能和设计过程。
1.设计原理:八位计数显示译码电路的主要原理是通过接收二进制计数器的输出信号,通过对应的译码器将其转换为七段数码管的控制信号,从而实现显示。
2.设计功能:八位计数显示译码电路的功能主要包括:-显示功能:将二进制计数器的输出显示在七段数码管上,实现数字的可视化显示。
-增量计数:根据输入的时钟信号进行增量计数,实现从0到255的循环计数。
-译码功能:将二进制计数器的输出信号转换为七段数码管的控制信号,控制数码管上对应的数码显示。
3.设计过程:八位计数显示译码电路的设计过程主要包括以下几个步骤:3.1确定输入与输出首先,我们需要确定设计的输入和输出。
输入主要包括时钟信号和复位信号,用于控制计数和复位操作;输出为控制七段数码管显示的控制信号。
3.2确定译码方式根据设计需求,我们可以选择使用常见的译码方式,如BCD译码器、十六进制译码器等。
根据实际情况选择适合的译码方式,使得设计简单有效。
3.3确定译码逻辑在确定了译码方式后,需要根据输入信号和输出信号的关系,确定译码逻辑。
根据二进制计数器的输出信号,将其映射到对应的数字或字符,为七段数码管提供正确的控制信号。
3.4组合逻辑设计根据译码逻辑,设计出控制信号的生成电路。
可以使用门电路、与非门电路或多路选择器等组合逻辑电路实现。
3.5简化逻辑电路对于逻辑电路的设计,可以使用布尔代数、卡诺图等方法进行简化和优化,使电路结构更为简洁。
3.6电路仿真与验证完成电路设计后,可以使用电路仿真工具对电路进行验证和测试,确保电路功能正确。
4.设计注意事项:在设计八位计数显示译码电路时,需要注意以下几点:4.1七段数码管的驱动电流和电压根据所选用的七段数码管的规格,需要确保驱动电流和电压符合规格要求。
eda8位二进制
实验报告课程名称电子设计自动化实验项目 8为二进制带符号数的加减电路设计实验仪器计算机系别:通信学院专业:电子信息工程班级/学号:电信1105班 /2011010612学生姓名:张正实验日期:2013年5月29日成绩: _______________________指导教师: _______李春云_____________电子自动化设计实验一、实验目的:1学习多字节压缩BCD码加减运算的程序设计2学习单字节有符号数加减运算的程序设计二、实验内容:1用VHDL代码实现8为二进制带符号数的加减电路设计2实现二进制码和BCD码之间的转换3实现用七段BCD码显示译码器显示源代码三、实验原理:加减法实验电路原理:二进制带符号数的加减电路,是将输入的带符号数转化成补码,利用补码进行运算,并且对运算结果的符号进行判断,还原成真值。
四、源代码:library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity adder isport ( a:in STD_LOGIC_VECTOR(7 downto 0);b:in STD_LOGIC_VECTOR(7 downto 0);ctrol:in std_logic;bcd_symbol:out std_logic;binaryout:out STD_LOGIC_VECTOR(7 downto 0);dataout: out STD_LOGIC_vector( 20 downto 0));end adder;architecture adder_arch of adder 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 c1:std_logic_vector(7 downto 0);signal ga_hundred:std_logic_vector(3 downto 0);signal cc:std_logic_vector(7 downto 0);signal ga:std_logic_vector(7 downto 0);signal ga0,ga1,ga2:std_logic_vector(6 downto 0);beginaddsub:blockbeginprocess(a)beginif a(7)='0'then x<='0'&'0'&a;else x(9 downto 8)<='1'&'1';x(7 downto 0)<=not('0'&a(6 downto 0))+1;end if;end process;process(ctrol,b)beginif ctrol='0'thenif b(7)='0'then y<='0'&'0'&b;else y<='1'&'1'&(not('0'& b(6 downto 0))+1);end if;else if b(7)='1' then y<='0'&'0'&(not('0'& b(6 downto 0))+1);else y<='1'&'1'&(not('0'&b(6 downto 0))+1);end if;end if;end process;process(a,b)beginif a(6 downto 0)=0 then z<=y;elseif b(6 downto 0)=0 then z<=x;elsez<=x+y;end if;end if;end process;process(z)beginif z(9)='1' thenc(7 downto 0)<=not z(7 downto 0)+1; c(8)<='1';else c(8 downto 0)<='0'& z(7 downto 0);end if;end process;end block addsub;bcd_symbol<=c(8);binaryout<=c(7 downto 0);bcd:blockbegincc<=c(7 downto 0); process(cc)beginif cc>199 then c1<=cc-200;ga_hundred<="0010";elsif cc>99 then c1<=cc-100;ga_hundred<="0001";else ga_hundred<="0000";c1<=cc;end if;if c1>=90 and c1<100 then ga<=c1+54;elsif c1>80 and c1<90 then ga<=c1+48;elsif c1>70 and c1<80 then ga<=c1+42;elsif c1>60 and c1<70 then ga<=c1+36;elsif c1>50 and c1<60 then ga<=c1+30;elsif c1>40 and c1<50 then ga<=c1+24;elsif c1>30 and c1<40 then ga<=c1+18;elsif c1>20 and c1<30 then ga<=c1+12;elsif c1>10 and c1<20 then ga<=c1+6;else ga<=c1;end if;end process;end block bcd;xianshi0:blockbeginga0<="0111111" when ga_hundred<=0 else"0000110" when ga_hundred<=1 else"1011011" when ga_hundred<=2 else"1001111" when ga_hundred<=3 else"1100110" when ga_hundred<=4 else"1101101" when ga_hundred<=5 else"1111101" when ga_hundred<=6 else"0000111" when ga_hundred<=7 else"1111111" when ga_hundred<=8 else"1101111" when ga_hundred<=9 else"0000000" when ga_hundred<=10 else"0000000" when ga_hundred<=11 else"0000000" when ga_hundred<=12 else"0000000" when ga_hundred<=13 else"0000000" when ga_hundred<=14 else"0000000" ;dataout( 20 downto 14) <= ga0;end block xianshi0;xianshi1:blockbeginga1<="0111111" when ga(7 downto 4)<=0 else"0000110" when ga(7 downto 4)<=1 else"1011011" when ga(7 downto 4)<=2 else"1001111" when ga(7 downto 4)<=3 else"1100110" when ga(7 downto 4)<=4 else"1101101" when ga(7 downto 4)<=5 else"1111101" when ga(7 downto 4)<=6 else"0000111" when ga(7 downto 4)<=7 else"1111111" when ga(7 downto 4)<=8 else"1101111" when ga(7 downto 4)<=9 else"0000000" when ga(7 downto 4)<=10 else"0000000" when ga(7 downto 4)<=11 else"0000000" when ga(7 downto 4)<=12 else"0000000" when ga(7 downto 4)<=13 else"0000000" when ga(7 downto 4)<=14 else"0000000" ;dataout( 13 downto 7) <= ga1;end block xianshi1;xianshi2:blockbeginga2<="0111111" when ga(3 downto 0)<=0 else"0000110" when ga(3 downto 0)<=1 else"1011011" when ga(3 downto 0)<=2 else"1001111" when ga(3 downto 0)<=3 else"1100110" when ga(3 downto 0)<=4 else "1101101" when ga(3 downto 0)<=5 else "1111101" when ga(3 downto 0)<=6 else "0000111" when ga(3 downto 0)<=7 else "1111111" when ga(3 downto 0)<=8 else "1101111" when ga(3 downto 0)<=9 else "0000000" when ga(3 downto 0)<=10 else "0000000" when ga(3 downto 0)<=11 else "0000000" when ga(3 downto 0)<=12 else"0000000" when ga(3 downto 0)<=13 else"0000000" when ga(3 downto 0)<=14 else"0000000" ;dataout( 6 downto 0) <= ga2;end block xianshi2;end adder_arch;五、项目实施六、实验总结:通过本次试验,加深了我对例化语句和分模块显示的理解。
EDA课程设计八位乘法器
EDA课程设计报告实验名称:八位乘法器实验地点:@@@@班级:@@@@@学号:@@@@@姓名:@@@@目录一.引言1.1 EDA技术的概念••1.2 EDA技术的特点••1.3 EDA设计流程••1.4 VHDL介绍••二.八位乘法器的设计要求与设计思路••2.1 设计目的••2.2 设计要求••三.八位乘法器的综合设计••3.1 八位乘法器功能••3.2 八位乘法器设计方案••3.3 八位乘法器实体设计••3.4 八位乘法器VHDL设计••3. 5八位乘法器仿真图形••心得体会••参考文献••一、引言1.1 EDA技术的概念EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
1.2 EDA技术的特点利用EDA技术进行电子系统的设计,具有以下几个特点:①用软件的方式设计硬件;②用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;③设计过程中可用有关软件进行各种仿真;④系统可现场编程,在线升级;⑤整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。
因此,EDA技术是现代电子设计的发展趋势。
1.3 EDA设计流程典型的EDA设计流程如下:1、文本/原理图编辑与修改。
首先利用EDA工具的文本或图形编辑器将设计者的设计意图用文本或图形方式表达出来。
2、编译。
完成设计描述后即可通过编译器进行排错编译,变成特定的文本格式,为下一步的综合做准备。
3、综合。
将软件设计与硬件的可实现性挂钩,是将软件转化为硬件电路的关键步骤。
EDA--八位二进制乘法器
EDA课设:选题名称:八位二进制乘法电路(一)设计要求:分拍输入两个八位二进制数字,并四个数码管显示当前输入数字的十进制形式,通过使能端的控制,分拍输出这两位二进制数字的乘积并通过四个数码管显示成十进制。
(二)基本算法:8位二进制乘法采用移位相加的方法。
即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。
直到所有的部分积都被加过一次。
按照这种算法,可以得到下图所示之框图和简单流程图。
图中Y寄存器存放被乘数M,B寄存器存放乘数N,A累加器存放部分积。
A和Y中的数据在加法器中相加后送入A中,而A和B相级联又构成了一个16bit的移位寄存器,当它工作于移位模式时,可以实现数据的右移。
由于乘数的每一位不是0就是1 ,对应的部分积不是0就是被乘数本身,所以实际作部分积相加这一步时,只要根据乘数的对应位判断:如该位为 1 ,则将累加器中的数据加上被乘数再移位;如该位为0时,就不加被乘数而直接移位。
运算时首先将累加器A 清零,并将被乘数M和乘数N分别存入寄存器Y和B,然后依据寄存器B中最右一位B0(数据N0)确定第一个部分积。
将此部分积送入A累加器以后,将A连同寄存器B右移一位,部分积的最低位被移进寄存器B的最左位,乘数的最低位N0被移出寄存器B,而乘数的次低位N1被移至寄存器B的B0位。
第二次仍然依据B0位的数据(N1)来确定第二个部分积,将部分积与累加器中的数据相加后右移一位,N1又被移出寄存器,数据N2被移到B0位置……这样,经过8次部分积相加位的操作,完成1次乘法运算,乘数N恰好被移出寄存器B,寄存器B中保存的就是运算积的低8位数据。
移位相加的次数应用一个计数器来控制,每移位一次,计数器计一个数。
当计数器计得8个数时,发出一个信号,使电路停止操作,并输出运算结果(流程图是按减法计数器设计的,也可使用加法计数器)。
EDA_8位乘法器_实验报告
南华大学船山学院实验报告(2009 ~2010 学年度第二学期)课程名称EDA实验名称8位乘法器姓名学号专业计算机科学与班级01技术地点8-212 教师一、实验目的:学习和了解八位乘法的原理和过程二、设计思路:纯组合逻辑构成的乘法器虽然工作速度比较快,但过于占用硬件资源,难以实现宽位乘法器,基于PLD 器件外接ROM 九九表的乘法器则无法构成单片系统,也不实用。
这里介绍由八位加法器构成的以时序逻辑方式设计的八位乘法器,具有一定的实用价值,而且由FPGA 构成实验系统后,可以很容易的用ASIC 大型集成芯片来完成,性价比高,可操作性强。
其乘法原理是:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
三、实验逻辑图:四、实验代码:1) 选通与门模块的源程序ANDARITH.VHD LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY ANDARITH IS PORT (ABIN:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR (7 DOWNTO 0) DOUT:OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END ANDARITH;ARCHITECTURE ART OF ANDARITH IS BEGINPROCESS (ABIN ,DIN) BEGINFOR I IN 0 TO 7 LOOPDOUT (I)<=DIN (I)AND ABIN; END LOOP;ARICTLCLKEND PROCESS;END ART;2) 16位锁存器的源程序REG16B.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG16B IS PORT (CLK:IN STD_LOGIC;CLR:IN STD_LOGIC;D:IN STD_LOGIC_VECTOR (8 DOWNTO 0)Q:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));END REG16B;ARCHITECTURE ART OF REG16B ISSIGNAL R16S:STD_LOGIC_VECTOR(15 DOWNTO 0);BEGIN PROCESS (CLK,CLR)BEGINIF CLR = '1' THEN R16S<= "0000000000000000";ELSIF CLK'EVENT AND CLK = '1'THENR16S(6 DOWNTO 0)<=R16S(7 DOWNTO 1);R16S(15 DOWNTO 7)<=D;END IF;END PROCESS;Q<=R16S;END ART;3) 8位右移寄存器的源程序SREG8B.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SREG8B ISPORT (CLK:IN STD_LOGIC; LOAD :IN STD _LOGIC; BIN:IN STD_LOGIC_VECTOR(7DOWNTO 0);QB:OUT STD_LOGIC );END SREG8B;ARCHITECTURE ART OF SREG8B ISSIGNAL REG8B:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINPROCESS (CLK,LOAD)BEGINIF CLK'EVENT AND CLK= '1' THENIF LOAD = '1' THEN REG8<=DIN;ELSE REG8(6 DOWNTO0)<=REG8(7 DOWNTO 1); END IF;END IF;END PROCESS;QB<= REG8 (0);END ART;4) 乘法运算控制器的源程序ARICTL.VHD LIBRARYUSE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ARICTL ISPORT ( CLK:IN STD_LOGIC; START:INSTD_LOGIC;CLKOUT:OUT STD_LOGIC; RSTALL:OUTSTD_LOGIC;ARIEND:OUT STD_LOGIC );END ARICTL;ARCHITECTURE ART OF ARICTL IS SIGNAL CNT4B:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINRSTALL<=START;PROCESS (CLK,START)BEGINIF START = '1' THEN CNT4B<= "0000";ELSIF CLK'EVENT AND CLK = '1' THENIF CNT4B<8 THENCNT4B=CNT4B+1;END IF;END IF;END PROCESS;PROCESS (CLK,CNT4B,START)BEGINIF START = '0' THENIF CNT4B<8 THENCLKOUT <=CLK; ARIEND<= '0';ELSE CLKOUT <= '0'; ARIEND<= '1';END IF;ELSE CLKOUT <=CLK; ARIEND<= '0';END IF;END PROCESS;END ART;5) 8位乘法器的源程序MULTI8X8.VHDLIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MULTI8X8 ISPORT(CLK:IN STD_LOGIC;START:IN STD_LOGIC;A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);ARIEND:OUT STD_LOGIC;DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END MULTI8X8;ARCHITECTURE ART OF MULTI8X8 ISCOMPONENT ARICTLPORT(CLK:IN STD_LOGIC;START:IN STD_LOGIC; CLKOUT:OUT STD_LOGIC;RSTALL:OUT STD_LOGIC; ARIEND:OUT STD_LOGIC);END COMPONENT;COMPONENT ANDARITHPORT(ABIN:IN STD_LOGIC;DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0); DOUT:OUT_STD_LOGIC_VECTOR( 7 DOWNTO 0) ); END COMPONENT;COMPONENT ADDER8B...COMPONENT SREG8B...COMPONENT REG16B...SIGNAL GNDINT:STD_LOGIC;SIGNALINTCLK:STD_LOGIC;SIGNAL RSTALL:STD_LOGIC;SIGNAL QB:STD_LOGIC;SIGNAL ANDSD:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL DTBIN:STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL DTBOUT:STD_LOGIC_VECTOR(15 DOWNTO 0); BEGINDOUT<=DTBOUT;GNDINT<= '0';U1:ARICTL PORT MAP(CLK=>CLK,START=>START,CLKOUT=>INTCLK,RSTALL=>RSTALL,ARIEND=>ARIEND); U2:SREG8B PORT MAP(CLK=>INTCLK,LOAD=>RSTALL.DIN=>B,QB=>QB);U3:ANDARITH PORT MAP(ABIN=>QB,DIN=>A,DOUT=>ANDSD);U4:ADDER8B PORTMAP(CIN=>GNDINT,A=>DTBOUT(15 DOWNTO 8),B=>ANDSD,S=>DTBIN(7 DOWNTO 0),COUT=>DTBIN(8));U5:REG16B PORT MAP(CLK =>INTCLK,CLR=>RSTALL,D=>DTBIN,Q=>DTBOUT);END ART;五、实验结果:六、实验心得:通过本实验基本上了解了八位乘法的工作原理:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
EDA技术》实验报告8位二进制加法器设计
《EDA技术》实验报告实验名称: 8位二进制全加器设计
姓名:
班级:
学号:
实验日期:2010-3-29
指导教师:
一、实验设计要求
以一位二进制全加器为基本元件,用例化语句写出8位并行二进制全加器的顶层文件,并讨论此加法器的电路特性。
二、设计原理
电路结构图或原理图
电路功能描述
定义了8位二进制全加器顶层设计元件端口信号,输入端口:AIN, BIN,是八个二进制数,数据类型被定义为STD_LOGIC_VECTOR。
CIN是输入的进位,数据类型IN STD_LOGIC;输出端口:SUM为和,数据类型IN STD_LOGIC COUT 为输出的进位。
三、实验程序
程序1:一位二进制全加器设计顶层描述
程序2:8位并行二进制全加器顶层文件
四、编译及仿真结果
选用器件型号cyclone
编译后使用器件资源情况、引脚配置情况(硬件实验)
仿真结果显示:
该设计是成功的。
输入的进位也要加上去。
0---255 全加器的COUNT 没有进位,而当加到256,COUNT=1,SUM输出0.
五、总结
.1 编译不通过,检查后发现在建立工程时,同一工程的所有文件都必须放在同一文件夹中,而这一步没做。
2 程序中没有将文件名与实体名保持一致出错。
输入半加器的VHDL程序保存文件,将输入的VHDL语言程序保存为h _adder.vhd.
3不知道如何将输入/输出引脚号都添加到矢量波形编辑窗口中。
解决办法:view—utility window—noder finder 将需要引脚拖拽。
8bit booth乘法器
8bit booth乘法器8位乘法器是一种能够完成两个8位二进制数的乘法运算的电子器件。
在数字电路和计算机学中,乘法器是实现算术运算的重要组件之一。
由于乘法涉及到多位数的运算,所以乘法器的设计将会比加法器复杂一些,但因为其实现是数字逻辑的原理之一,所以乘法器仍然是非常常见且广泛应用的电路。
8位乘法器由多个基本的逻辑门组成,这些逻辑门能够根据一个简单的算法将两个输入的数相乘得出一个结果。
下面将会详细介绍8位乘法器的工作原理、设计方法和优缺点。
1. 工作原理8位乘法器的工作原理是通过模拟手算乘法的过程来实现:将其中一个乘数按照二进制数的位数将其分为多个数字,然后逐位与另一个乘数相乘;然后将相乘所得的结果相加,得到最终的积。
8位乘法器通常采用Booth乘法算法。
Booth乘法算法是一种数值优化的乘法算法,其基本思想是在乘法过程中尽量减少加法器的使用次数。
Booth乘法使用了“移位-加/减”操作,通过每次将操作数向右移一位,从而将相乘的过程分解成一系列的加/减运算。
具体来讲,假设我们要将A和B两个8位二进制数相乘,现在以A=00101011和B=00011101为例说明Booth乘法的具体流程:1) 将A和B扩展为9位宽,即A=000101011和B=000011101;2) 将B的最低位和次低位相连,得到"01",将其作为操作码,表示下一步的移位和加/减操作的类型;3) 将A向左移一位,再加上操作码;4) 根据操作码,选择加法或减法,得到一个结果,存储在寄存器中;5) 将寄存器向右移一位,得到下一步的操作码;6) 重复3)到5)的步骤,共进行8次,即完成了整个乘法的计算。
Booth乘法的关键就在于它的“加减优化”机制。
当操作码为“01”时,表示需要对寄存器进行减法操作,而这个减法实际上是通过加上B 的补码来实现的;同样,当操作码为“10”时,表示需要对寄存器进行加法操作,但实际上是通过减去B的补码来实现的。
eda乘法器课程设计
eda乘法器课程设计一、课程目标知识目标:1. 学生能理解EDA乘法器的基本原理和设计流程;2. 学生能掌握数字逻辑设计的基本方法,并运用Verilog HDL语言实现EDA 乘法器;3. 学生了解不同类型乘法器的优缺点,并能够进行比较和分析。
技能目标:1. 学生能够运用所学知识,独立完成EDA乘法器的原理图设计和代码编写;2. 学生能够利用相关软件工具进行仿真测试,验证乘法器的功能正确性和性能指标;3. 学生能够通过小组合作,共同解决乘法器设计过程中遇到的问题,提高团队协作能力。
情感态度价值观目标:1. 学生培养对数字电路设计的兴趣,增强学习电子信息的积极性;2. 学生在课程学习过程中,培养严谨的科学态度和良好的工程素养;3. 学生通过小组合作,培养团队精神,学会尊重和倾听他人意见,提高沟通表达能力;4. 学生能够认识到电子信息技术在国家发展和社会进步中的重要作用,增强社会责任感和使命感。
二、教学内容1. 数字逻辑设计基础:介绍逻辑门、组合逻辑电路和时序逻辑电路的基本原理,为乘法器设计奠定基础。
2. Verilog HDL语言:讲解Verilog的基本语法、数据类型和常用语句,使学生掌握用Verilog进行数字电路设计的方法。
3. EDA乘法器原理:分析并讲解不同类型的乘法器(如Booth乘法器、Wallace树等)的原理和结构,对比优缺点。
- 教材章节:第三章《数字系统的设计方法》4. 乘法器设计流程:- 设计原理图:指导学生根据乘法器原理绘制原理图;- 编写Verilog代码:指导学生使用Verilog语言实现乘法器功能;- 仿真测试:教授学生使用相关软件工具(如ModelSim)进行仿真测试,验证设计的正确性。
- 教材章节:第四章《数字系统的实现与验证》5. 小组讨论与实践:组织学生进行小组讨论,共同解决设计过程中遇到的问题,提高实际操作能力。
6. 性能分析与优化:指导学生分析乘法器的性能指标(如速度、面积等),探讨优化方案。
EDA技术》实验报告8位二进制加法器设计
EDA 技术》实验报告实验名称:8 位二进制全加器设计姓名:班级:学号:实验日期:2010-3-29指导教师:、实验设计要求以一位二进制全加器为基本元件,用例化语句写出8位并行二进制全加器的顶层文件,并讨论此加法器的电路特性。
、设计原理电路功能描述定义了8位二进制全加器顶层设计元件端口信号,输入端口:AIN, BIN, 是八个二进制数,数据类型被定义为STD_LOGIC_VECTOR。
CIN是输入的进位,数据类型IN STD_LOGIC ;输出端口:SUM为和,数据类型IN STD_LOGIC COUT 为输出的进位。
三、实验程序程序:一位二进制全加器设计顶层描述功能:程序功能简介程序: 位并行二进制全加器顶层文件功能:程序功能简介四、编译及仿真结果 选用器件型号cyclone编译后使用器件资源情况、引脚配置情况(硬件实验) Flev Si^t-uE^@x sful — M on 12 29 21:22:33 2010 II Version5.1 Build ne 10/26/2005 SJ Full Version Revi si on. Ifame h aiderT 四一Ent i ty IhmtF .ADDERSF wnilyCycl on! Devi eeEP1C6G240C6 Tinni ns ModelsFiMl timing requiremerLisZ Tiotal logic elefTkents16 / 5,900 ( < 1怕) T^tal pins26/185 C 14 $ \ Total virtual pinsaTotil wy bitia f 92,100 ( 0 % ) Total PLLs 0 / 2〔 D % ) 仿真结果显示:该 设计是成功的。
输入的进位也要加上去。
0---255 全加器的COUNT 没有进位,而当加至U 256,COUNT=1SUM 输出0. 五、总结.1编译不通过,检查后发现在建立工程时,同一工程的所有文件都必须放在同 一文件夹中,而这一步没做。
EDA移位相加8位硬件乘法器电路设计
CHANGZHOU UNIVERSITY课程名称:______________ F PGA设计_______________________________________ 题目:________________ 移位相加8位硬件乘法器电路设计 ____________________ 学生姓名:_______________________________________________________学院(系):信息科学与工程学院专业班级:_产品设计需求说明本产品实现的功能:比较方便地实现两个8位二进制数的乘法运算。
设计参数使用的芯片/硬件平台GW48实验系统软件平台W ind owsXP+Muxplu sll 10.1二、方案设计及实现1、系统实现原理和总体框图该乘法器是由8位加法器构成的以时序方式设计的8位乘法器。
其乘法原理是:乘法通过逐项移位相加原理來实现,从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
从下图可以清楚地看出此乘法器的工作原理。
在下图中,START信号的上跳沿及其高电平有两个功能,即16位寄存器清零和被乘数A[7..O]向移位寄存器SREG8B加载;它的低电平则作为乘法使能信号。
CLK为乘法时钟信号。
当被乘数被加载于8位右移寄存器SREG8B 后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,与门ANDARITH打开,8位乘数B[7..O]在同一节拍进入8位加法器,与上一次锁存在16位锁存器REG16B 中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此往复,直至8个时钟脉冲后,乘法运算过程中止。
此时REG16B的输出值即为最后的乘积。
此乘法器的优点是节省芯片资源,它的核心元件只是一个8位加法器,其运算速度取决于输入的时钟频率。
本设计采用层次描述方式,且用原理图输入和文本输入混合方式建立描述文件。
8位二进制乘法电路
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
作业名称:
1
该乘法电路要实现的功能为8位二进制的乘法电路,具体的乘法过程是采用移位相加的方法。即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。直到所有的部分积都被加过一次。
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: chengfa
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Engineer:Sulliqi
//
// Create Date: 16:22:28 11/27/2011
// Design Name: chengfa
// Module Name: F:/Project/ISE/chengfa/chengt.v
// Project Name: chengfa
八位串 并行乘法器设计
八位串并行乘法器设计作品功能如下:1、输入方式:通过八位拨码开关输入相乘的八位二进制数,按键1和按键2控制乘法器锁存输入的八位二进制数,通过按键3来启动乘法运算。
2、LCD直接显示之前运算的结果。
3、系统时钟采用实验板上提供的50MHz时钟信号源提供时钟的测频基准时间信号。
4、设计成同步电路模式。
一、设计目的:1)熟悉EDA环境下的复杂逻辑模块的设计方法、设计过程及其注意事项;2)学习EDA软件Quartus-II的使用;3)学习硬件描述语言VHDL/Verilog HDL并进行编程;4)学习串并-行乘法器的基本原理和LCD显示的基本原理、控制流程。
二、设计要求:1、采用硬件描述语言VHDL/Verilog HDL设计八位串并行乘法器模块及LCD显示控制模块,并在Quartus-II环境下编译;2、在Quartus-II环境下编辑仿真激励波形,并模拟;3、在MAX-II实验板下载调试;4、撰写设计报告。
三、设计方案:VerilogHDL设计流程:注:1.总体方案是芯片级的2.软件仿真用来检测程序上的逻辑错误3.硬件仿真要根据需要搭成硬件电路,检查逻辑和时序上的错误设计八位串-并行乘法器分为以下三个模块:锁存(按键控制),乘法器(移位相加),LCD显示模块。
拨码开关控制输入数据,key1和key2键进行输入锁存,key1键锁存数据data1,key2键锁存数据data2,等待执行乘法运算,key3键实现乘法的开始运算,结果锁存到数据overcome。
最后,将data1,data2,overcome结果显示到LCD屏幕上。
四、设计过程:1、锁存器模块设计:(参见文件中的reg_bbit.v)module reg_bbit(clk,rst,dain,en,data_reg);input clk,rst,en;input[8:1]dain;output[8:1]data_reg;reg[8:1]data_reg=0;always@(posedge clk or negedge rst)if(!rst)data_reg=8'b 00000000;else if(!en)data_reg=dain;else data_reg=data_reg;endmodule逻辑关系表:仿真图如下:(参见文件中的reg_bbit.vwf)电路图实现:2、乘法运算模块:(参见文件中的mult_8gate.v)module mult_8gate(clk,rst,en,a,b,overcome);parameter size=8;input clk,rst,en;input[8:1]a,b;output[16:1]overcome;reg[16:1]overcome=0;reg[16:1]overcome1=0;integer i=1;always@(posedge clk or negedge rst)begin if(~rst)begin i=1;overcome1=16'b 0000000000000000;end else begin if(i==1)overcome1=16'b 0000000000000000;if(b[i]&&i=8&&!en)begin overcome1=overcome1+(a(i-1));i=i+1;end if(~b[i]&&!en&&i=8)begin overcome1=overcome1;i=i+1;end if(i=8&&en)begin i=1;end if(i 8&&!en)begin overcome1=overcome1;end if(en)begin i=1;overcome1=overcome1;end end end always@(posedge en) begin overcome=overcome1;i=1;end/*always@(negedge en)begin overcome1=0;for(i=1;i=size;i=i+1)if(b[i])overcome1=overcome1+(a(i-1));else overcome1=overcome1;end always@(posedge en)overcome=overcome1;*/endmodule仿真图如下:(参见文件中的mult_8gate.vwf)3、乘法运算和锁存器综合模块:(参见文件中的mul.v)电路实现图Verilog HDL语言编程:module mul(clk,rst,start,en1,en2,daina,dainb,overcome,a,b);input clk,rst;input en1,en2,start;output[8:1]a,b;wire[8:1]a,b;input[8:1]daina,dainb;output[16:1]overcome;reg_bbit u0(clk,rst,daina,en1,a);reg_bbit u1(clk,rst,dainb,en2,b);mult_8gate u2(clk,rst,start,a,b,overcome);endmodule仿真图如下:(参见文件中的mul.vwf)en1是key1键,en2是key2键,start是key3键。
8位二进制乘法器设计报告
EDA课程设计报告------8位二进制乘法器设计班级:学号:姓名:目录一.八位乘法器的设计要求与设计思路••2.1 设计目的••2.2 设计要求••二.八位乘法器的综合设计••3.1 八位乘法器功能••3.2 八位乘法器设计方案••3.3 八位乘法器各功能模块VHDL描述及仿真图形••3.4 八位乘法器顶层模块VHDL设计及下载验证••心得体会••参考文献••一、八位乘法器的设计要求与设计思路1.1实验目的学习并掌握应用8位二进制乘法器的原理、设计、分析和测试方法1.2实验内容利用移位相加原理设计一个8位二进制乘法器。
1.3实验要求用VHDL编写代码,下载验证,并用8段数码管显示乘数和乘积。
二、八位乘法器的综合设计2.1 八位乘法器功能通过调节实验板,输入8位二进制的A和B,八位乘法器能实现其乘积,并在数码管上面显示出来其结果。
2.2乘法器设计方案该乘法器是有由8 位加法器构成的以时序方式设计的8 位乘法器,采用逐项移位相加的方法来实现相乘。
用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。
直到所有的部分积都被加过一次。
例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101和10010011,其计算过程如下图(a)下面分解8 位乘法器的层次结构,分为以下4 个模块:①右移寄存器模块:这是一个8 位右移寄存器,可将乘法运算中的被乘数加载于其中,同时进行乘法运算的移位操作。
②加法器模块:这是一个8 位加法器,进行操作数的加法运算。
③1 位乘法器模块:完成8 位与1 位的乘法运算。
④锁存器模块:这是一个16 位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。
EDA实验--8位二进制乘法电路
EDA数字系统设计实验——8位二进制乘法电路学院:电子工程学院学号:0210****姓名:***8位二进制乘法电路1.选题目的:通过八位二进制乘法器设计实验,进一步熟悉VHDL语言的电路设计,及数字电路的基本知识,为以后进一步在数字电路学习上奠定基础。
2.设计要求8位二进制乘法采用移位相加的方法。
即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。
直到所有的部分积都被加过一次。
例如:被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为11010101和10010011,其计算过程如下:1 1 0 1 0 1 0 1× 1 0 0 1 0 0 1 11 1 0 1 0 1 0 1 N0与被乘数相乘的部分积,部分积右移一位1 1 0 1 0 1 0 1 N1与被乘数相乘的部分积+ 1 1 0 1 0 1 0 11 0 0 1 1 1 1 1 1 11 0 0 1 1 1 1 1 1 1 两个部分积之和,部分积之和右移一位+ 0 0 0 0 0 0 0 0 N2与被乘数相乘的部分积0 1 0 0 1 1 1 1 1 1 10 1 0 0 1 1 1 1 1 1 1 与前面部分积之和相加,部分积之和右移一+ 0 0 0 0 0 0 0 0 N4与被乘数相乘的部分积· · ·· · · N7与被乘数相乘的部分积+ 1 1 0 1 0 1 0 11 1 1 1 0 1 0 0 1 0 0 1 1 1 1 与前面部分积之和相加0 1 1 1 1 0 1 0 0 1 0 0 1 1 1 右移一位得到最后的积为了实现硬件乘法器,根据上面的乘法的计算过程可以得出3点:一是只对两个二进制数进行相加操作,并用寄存器不断累加部分积;而是将累加的部分积左移(复制的被乘数不移动);三是乘数的对应位若为0时,对累加的部分积不产生影响(不操作)。
八位二进制乘法器booth
八位二进制乘法器booth八位二进制乘法器Booth是一种快速计算二进制乘法的方法,其原理是将被乘数与乘数一起转化为二进制补码形式,然后进行位移和相加运算,最终得出乘积。
下面我们就来详细了解Booth乘法器的实现流程。
1. 将被乘数和乘数转化为二进制补码形式Booth乘法器的第一步是将被乘数和乘数转化为8位二进制补码形式。
具体来说,要将它们分别转化为8位带符号的二进制数,如果是正数则其二进制与原数相同,如果是负数则其二进制为其绝对值的原码取反加1。
2. 初始化Booth乘法器Booth乘法器的第二步是对其进行初始化。
具体来说,要先在最左侧添加一个0,然后添加8个辅助位,辅助位一般初始化为0。
3. 进行循环,执行移位和加减运算Booth乘法器的第三步是进行循环,每次循环都要进行移位和加减运算。
具体来说,在每一次循环中,都将乘数向右移动一位,并将最后一位的值赋给辅助位。
然后,根据当前乘数的最后一位和辅助位的值,选择加上或者减去被乘数。
4. 得出结果Booth乘法器的最后一步是得出结果。
具体来说,将得到的答案转化为二进制补码形式,然后去掉最左侧辅助位即可得到最终的八位乘积。
除了上述四个步骤外,还有一些细节需要注意。
例如,在进行加减运算时,要先将乘数和被乘数进行符号扩展,将它们分别扩展为一个9位数,扩展时要将第8位的符号复制到第9位。
此外,在进行移位时,要注意移位后最左侧位的值是否为1,如果是1,要进行2次减法。
综上所述,Booth乘法器可以大大加快二进制乘法的运算速度,是一种十分实用的计算方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA课设:选题名称:八位二进制乘法电路(一)设计要求:分拍输入两个八位二进制数字,并四个数码管显示当前输入数字的十进制形式,通过使能端的控制,分拍输出这两位二进制数字的乘积并通过四个数码管显示成十进制。
(二)基本算法:8位二进制乘法采用移位相加的方法。
即用乘数的各位数码,从低位开始依次与被乘数相乘,每相乘一次得到的积称为部分积,将第一次(由乘数最低位与被乘数相乘)得到的部分积右移一位并与第二次得到的部分积相加,将加得的和右移一位再与第三次得到的部分积相加,再将相加的结果右移一位与第四次得到的部分积相加。
直到所有的部分积都被加过一次。
按照这种算法,可以得到下图所示之框图和简单流程图。
图中Y寄存器存放被乘数M,B寄存器存放乘数N,A累加器存放部分积。
A和Y中的数据在加法器中相加后送入A中,而A和B相级联又构成了一个16bit的移位寄存器,当它工作于移位模式时,可以实现数据的右移。
由于乘数的每一位不是0就是1 ,对应的部分积不是0就是被乘数本身,所以实际作部分积相加这一步时,只要根据乘数的对应位判断:如该位为 1 ,则将累加器中的数据加上被乘数再移位;如该位为0时,就不加被乘数而直接移位。
运算时首先将累加器A 清零,并将被乘数M和乘数N分别存入寄存器Y和B,然后依据寄存器B中最右一位B0(数据N0)确定第一个部分积。
将此部分积送入A累加器以后,将A连同寄存器B右移一位,部分积的最低位被移进寄存器B的最左位,乘数的最低位N0被移出寄存器B,而乘数的次低位N1被移至寄存器B的B0位。
第二次仍然依据B0位的数据(N1)来确定第二个部分积,将部分积与累加器中的数据相加后右移一位,N1又被移出寄存器,数据N2被移到B0位置……这样,经过8次部分积相加位的操作,完成1次乘法运算,乘数N恰好被移出寄存器B,寄存器B中保存的就是运算积的低8位数据。
移位相加的次数应用一个计数器来控制,每移位一次,计数器计一个数。
当计数器计得8个数时,发出一个信号,使电路停止操作,并输出运算结果(流程图是按减法计数器设计的,也可使用加法计数器)。
(三)设计方案:1、电路结构。
主要构成如下:2、分模块设计:A、输入模块:通过八个开关控制八位二进制数字输入。
使能控制输入模块:if en='0'and en1='0' thenout2(15 downto 8)<=i1;else if en='1' and en1='0'thenout2(7 downto 0)<=i1;else null; end if;end if;B、使能控制端模块:通过两个开关en、en1构成使能控制模块C、移位加法器模块:根据把位二进制乘法器原理,设计移位加法器VHDL程序:for i in 7 downto 0 loopif(sum2(i)='0') then you:="00000000";else you:="11111111";end if;case i iswhen 0=>sum:="00000000"&(sum1 and you)+sum;when 1=>sum:="0000000"&(sum1 and you)&'0'+sum;when 2=>sum:="000000"&(sum1 and you)&"00"+sum;when 3=>sum:="00000"&(sum1 and you)&"000"+sum;when 4=>sum:="0000"&(sum1 and you)&"0000"+sum;when 5=>sum:="000"&(sum1 and you)&"00000"+sum;when 6=>sum:="00"&(sum1 and you)&"000000"+sum;when 7=>sum:='0'&(sum1 and you)&"0000000";when others=>NULL;end case;end loop;D、数字显示模块:将输入和输出的二进制数字转换为十进制数并通过数码管显示,七段数码管数字代码为:ma:=("1000000","1111001","0100100","0110000","0011001","0010010","0000011", "1111000","0000000","0011000");if en='1'and en1='1' then a9:=conv_integer(out3);else if en='0'and en1='1' then a9:=conv_integer(out3)/10000;else a9:=conv_integer(i1);end if;end if;for i in 3 downto 0 loopam(i):= a9 rem 10;a9:=a9/10;for j in 9 downto 0 loopif am(i)=j thencase i iswhen 3=>ott1<=ma(j);when 2=>ott2<=ma(j);when 1=>ott3<=ma(j);when 0=>ott4<=ma(j);when others=>null;end case;end if;end loop;end loop;3、整体程序VHDL程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity aa isport(i1:in std_logic_vector( 7 downto 0); en:in std_logic;en1:in std_logic; ott1:out std_logic_vector( 6 downto 0);ott2:out std_logic_vector( 6 downto 0);ott3:out std_logic_vector( 6 downto 0);ott4:out std_logic_vector( 6 downto 0);out4:out std_logic_vector( 7 downto 0) );end aa;architecture behavior of aa istype numb is array (0 to 3)of integer;type nump is array (0 to 9)of std_logic_vector( 6 downto 0);signal out2:std_logic_vector(15 downto 0);signal out3:std_logic_vector(15 downto 0);beginprocess(i1,en1)variable am:numb; variable ma:nump; variable i:integer; variable j:integer;variable a9:integer;variable ot1: std_logic_vector( 6 downto 0);variable ot2: std_logic_vector( 6 downto 0);variable ot3: std_logic_vector( 6 downto 0);variable ot4: std_logic_vector( 6 downto 0);beginma:=("1000000","1111001","0100100","0110000","0011001","0010010","0000011", "1111000","0000000","0011000");if en='1'and en1='1' then a9:=conv_integer(out3);else if en='0'and en1='1' then a9:=conv_integer(out3)/10000;else a9:=conv_integer(i1); end if; end if;for i in 3 downto 0 loopam(i):= a9 rem 10;a9:=a9/10;for j in 9 downto 0 loopif am(i)=j thencase i iswhen 3=>ott1<=ma(j);when 2=>ott2<=ma(j);when 1=>ott3<=ma(j);when 0=>ott4<=ma(j);when others=>null;end case;end if;end loop;end loop;end process;process(en,en1)beginif en='0'and en1='0' thenout2(15 downto 8)<=i1;else if en='1' and en1='0'thenout2(7 downto 0)<=i1;else null;end if;end if;end process;process(out2)variable sum:std_logic_vector(15 downto 0);variable you:std_logic_vector(7 downto 0);variable i:integer;variable sum1:std_logic_vector(7 downto 0);variable sum2:std_logic_vector(7 downto 0);beginsum1:=out2(15 downto 8); sum2:=out2(7 downto 0);for i in 7 downto 0 loopif(sum2(i)='0') then you:="00000000";else you:="11111111"; end if;case i iswhen 0=>sum:="00000000"&(sum1 and you)+sum;when 1=>sum:="0000000"&(sum1 and you)&'0'+sum;when 2=>sum:="000000"&(sum1 and you)&"00"+sum;when 3=>sum:="00000"&(sum1 and you)&"000"+sum;when 4=>sum:="0000"&(sum1 and you)&"0000"+sum;when 5=>sum:="000"&(sum1 and you)&"00000"+sum;when 6=>sum:="00"&(sum1 and you)&"000000"+sum;when 7=>sum:='0'&(sum1 and you)&"0000000";when others=>NULL;end case; out3<=sum;end loop;end process;end behavior;(四)仿真结果:注:En、en1为使能端;ott4、ott3、ott2、ott1分别为显示数字的各位十进制数的数码管计算:0255*0218=32640En、en1为00时置乘数为11111111B(255D)四位数码管分别为0255 En、en1为10时置乘数为10000000B(128D)四位数码管分别为0128 En、en1为11时显示乘积最高位,四位数码管分别为:0003 En、en1为01时显示乘积后四位,四位数码管分别为:2640 (五)加载实验结果:将源程序代码编译下载到实验板,可以实现通过使能端的控制进行数字输入、显示,乘法结果显示,符合设计要求。