1、 移位乘法器工作流程图二、 实验步骤算法主程序module MUL(A,B,data );input 7:0 A;0 B;output 15:0 data;wire 15:reg 7:0 D;0 A1;0 B1;reg C;always (A or B)beginA1 = A;B1 = B;D = 0;C = 0;repeat(8)if(A10=1)C,D = D + B1;elseC,D = D + 0;C,D,A1 = C,D,A1 1;endassign data = D,A1;endmodule移位乘法器测试文件module test; reg 7: / Outputs wire 15
2、: / Instantiate the Unit Under Test (UUT) MUL uut ( .A(A), .B(B), .data(data) initial begin / Initialize Inputs A = 0; B = 0; / Wait 100 ns for global reset to finish #20; A = 8b0000_0010; B = 8b0000_1101; / Add stimulus here end三、 实验结果及分析2进制输入输出结果10进制输入输出结果四、 体会通过移位乘法器的设计,简单的了解了ISE软件的基本功能,主要菜单选项,以及
3、如何建立一个工程,如何在工程里面写程序和进行编译和综合等。 总体来说最困难的部分就是把这个移位乘法器的算法弄明白。可能我们平常自己算乘法没有任何困难,但是要通过编码的形式,让计算机能够了解整个算法的流程却不是一件容易的事情。在整个编写移位乘法器的过程中,看懂整个流程图花费了我很长的时间。了解整个算法的流程之后编程自然顺理成章了。所以,我在之后做自己的课题“booth乘法器”的时候我也花费了很长的时间通过上网查询,详细了解这个算法的确切含义。虽然花费了很长的时间在研究算法上,但是我觉得是值得的,因为那是最根本的地方。最后结果也如愿出来了。所以,我觉得以后在编程的时候,了解你要编写模块的作用以及通
4、过什么算法来实现是一件很重要的事情。8位booth乘法器设计Booth算法是一种十分有效的计算有符号数乘法的算法。算法的新型之处在于减法也可用于计算乘积。Booth发现加法和减法可以得到同样的结果。因为在当时移位比加法快得多,所以Booth发现了这个算法,Booth算法的关键在于把1分类为开始、中间、结束三种,如下图所示当然一串0或者1的时候不操作,所以Booth算法可以归类为以下四种情况:Booth算法根据乘数的相邻2位来决定操作,第一步根据相邻2位的4中情况来进行加或减操作,第二部仍然是将积寄存器右移,算法描述如下:(1) 根据当前为和其右边的位,做如下操作: 00: 0的中间,无任何操作
5、; 01: 1的结束,将被乘数加到积的左半部分; 10:1的开始,积的左半部分减去被乘数; 11: 1的中间,无任何操作。(2) 将积寄存器右移1位。 因为Booth算法是有符号数的乘法,因此积寄存器移位的时候,为了保留符号位,进行算术右移。同时如果乘数或者被乘数为负数,则其输入为该数的补码,若积为负数,则输出结果同样为该数的补码。主程序代码:module booth8(data_on,data_out);input data_on;0 data_on;output 19:0 data_out;wire 19:0 R0,R1,R2;reg c1,p;reg 4:0 i;reg 3:0 tmp;
6、reg 19:always(data_on)R0=0;R1=data_on7:0;R2=data_on15:8;p=0;case(R20,p)2b00: R0=R0;b01: R0=R0+R1;b10: R0=R0-R1;b11:endcasec1=R07;c1,R0,R2,p=c1,R0,R2,p1;data=0;repeat(16)repeat(5)tmp,data=tmp,data=5)tmp=tmp+3;tmp=tmp;data3:0=tmp;data,R0,R2=data,R0,R2assign data_out=data;顶层模块:module top( clk,rst,data_
7、out,data_in); input clk,rst; output 19: output 15:0 data_in; reg 2:0 addra,ct; reg clk1; always(posedge clk or negedge rst) begin if(rst = 0) ct=0; clk1 else if(ct=7)=clk1; else ct=ct+1; booth8 U1( .data_out(data_out), .data_on(data_in) ); rom U2( .clka(clk1), / input clka .addra(addra), / input 2 :
8、 0 addra .douta(data_in) / output 15 : 0 douta always(posedge clk1 or negedge rst) if (rst=0) addra = 0;= addra + 1;测试模块: / Inputs reg clk; reg rst; wire 19: top uut ( .clk(clk), .rst(rst), .data_out(data_out), .data_in(data_in) clk = 0; rst = 1; #10 rst=0; #10 rst=1; #800 $stop; always #5 clk=clk;C
9、OE文件,输入的8组数据cdc输出结果:A:乘数 B:被乘数 data_booth:BCD输出积十进制输出积测试波形经过两个礼拜的不懈努力,终于把最后的实验结果按要求完成了。从一开始的一头雾水到逐渐明白了方向,了解了该如何操作。一切都是对未知知识上下求索。虽然团队只有三个人,但是我们互相协助,各司其职,每个人分派自己的任务,并且每天按时按量完成;虽然我们三个人的基础不是很好,但是我们齐心协力,把劣势变成优势,把压力当成动力,每天在实验室忙完了还会主动的在寝室把没有做完的模块继续完善,或者把不了解的部分通过网上查资料、查课本、问同学等方式逐渐弄明白。整个课程设计的过程中,老师和研究生学长以及周围的同学也给了我们很大的帮助,对于一些我们不了解的知识他们都无私的分享给我们。在此,特别向课程设计过程中那些帮助过我们的人表示我诚挚的谢意!虽然两个礼拜时间不是很长,但那种做项目时沉心静气的心态以后值得继续保持!
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2