数电— 4位并行乘法器的电路设计与仿真 联系客服

发布时间 : 星期三 文章数电— 4位并行乘法器的电路设计与仿真更新完毕开始阅读71a1df0e76c66137ee061956

题目: 4位并行乘法器的电路设计与仿真 功能要求:

1. 实现4位并行乘法器的电路设计;

2. 带异步清零端; 3. 输出为8位;

4. 单个门延迟设为5 ns。 设计要求

? 使用Verilog语言寄存器传输级(RTL)方法描述电路; ? 使用testbeach方法验证电路;验证要求计算总时延等。

? 开发环境选用Modelsim 6.5b;

? 文档:分析文档、设计文档、测试文档、代码和总结。 ? 设要有完整的组合逻辑电路设计步骤; ? 每一步骤完成要正确合理; ? 设计电路时分模块测试。

时间安排

? 分析设计阶段:周一至周二上午;

? 代码编写阶段:周二下午至周三; ? 代码测试优化阶段:周四; ? 仿真分析及总结:周五上午; ? 验收:周五下午。 验收标准

? 文档齐全(20分)。

注:无文档不可以进行下一步。

? 仿真结果正确,回答问题正确。(50分) ? 课程设计报告。(30分)

一、分析

A3A2A1A0与B3B2B1B0相乘,按乘法规则进行计算如下:

A3B0 A2B0 A1B0 A0B0 A3B1 A2B1 A1B1 A0B1 A3B2 A2B2 A1B2 A0B2

+ A3B3 A2B3 A1B3 A0B3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

每一列相加均采用全加器,最直接的方法是采用一位全加器,也可采用超前进位加法器,相对延迟会更短。

采用一位全加器,有两种算法,第一种为每两列相加,每一行加法器串行进位,这种方法相对延迟较大,设每个全加器延迟为t,采用这种方法的最大延迟为8t。第二种为断开串行进位的进位链,以缩短每次加法的延迟。实现方法为:将第j步第i位的进位输出连到下一步(第j+1步)第i+1位的进位输入。但最后要添加一行串行进位的加法器。此种方法的最大延为6t。

A3B0 A3B2 A3B3 A2B3 A3B1 + A1B3 A0B3 A2B2 + + A2B1 A1B1 A0B1 A1B2 + + A0B2 + ++ + + + + A3B0 A3B0 A3B0 A3B0 // 四位并行乘法器模块 module mul4x4(reset,a,b,y); output [7:0] y; input [3:0] a,b; input reset;

wire [11:0] s,co; wire [15:0] c;

assign #5 c[0]=a[0]&b[0], c[1]=a[1]&b[0], c[2]=a[2]&b[0], c[3]=a[3]&b[0]; assign #5 c[4]=a[0]&b[1], c[5]=a[1]&b[1], c[6]=a[2]&b[1], c[7]=a[3]&b[1]; assign #5 c[8]=a[0]&b[2], c[9]=a[1]&b[2], c[10]=a[2]&b[2], c[11]=a[3]&b[2]; assign #5 c[12]=a[0]&b[3], c[13]=a[1]&b[3], c[14]=a[2]&b[3], c[15]=a[3]&b[3];

fulladder add0(s[0],co[0],c[1],c[4],1'b0); fulladder add1(s[1],co[1],c[2],c[5],1'b0); fulladder add2(s[2],co[2],c[3],c[6],1'b0); fulladder add3(s[3],co[3],c[8],s[1],co[0]); fulladder add4(s[4],co[4],c[9],s[2],co[1]);

fulladder add5(s[5],co[5],c[10],c[7],co[2]); fulladder add6(s[6],co[6],c[12],s[4],co[3]); fulladder add7(s[7],co[7],c[13],s[5],co[4]); fulladder add8(s[8],co[8],c[14],c[11],co[5]);

fulladder add9(s[9],co[9],s[7],co[6],1'b0); fulladder add10(s[10],co[10],s[8],co[7],co[9]); fulladder add11(s[11],co[11],c[15],co[8],co[10]); assign #5 y[0]=~reset&c[0]; assign #5 y[1]=~reset&s[0]; assign #5 y[2]=~reset&s[3]; assign #5 y[3]=~reset&s[6]; assign #5 y[4]=~reset&s[9]; assign #5 y[5]=~reset&s[10]; assign #5 y[6]=~reset&s[11]; assign #5 y[7]=~reset&co[11]; endmodule

// 乘法器测试模块 module tb_mul4x4; reg reset;

reg [3:0] a,b; wire [7:0] y; integer j=0,i=0; mul4x4 mul(reset,a,b,y); initial

begin

$monitor($time,\ a=4'd1;b=4'd4;reset=1'b1; #200 reset=1'b0;a=4'd1;b=4'd4; for(i=0;i<16;i=i+1)begin for(j=0;j<16;j=j+1) begin #200 a=i;b=j; end end

end endmodule

// 一位全加器模块 module fulladder(s,co,a,b,ci); output s,co;

input a,b,ci;

assign #15 s=~((~a&~b&~ci)|(a&~b&ci)|(~a&b&ci)|(a&b&~ci)); assign #15 co=~((~a&~b)|(~b&~ci)|(~a&~ci)); endmodule

// 全加器测试模块 module tb_fulladder; reg a,b,ci; wire s,co;

fulladder add0(s,co,a,b,ci); initial begin

a=1'b0;b=1'b0;ci=1'b1; #15 a=1'b0;b=1'b0;ci=1'b0;

$monitor($time,\#15 a=1'b0;b=1'b0;ci=1'b1;

#15 a=1'b0;b=1'b1;ci=1'b0; #15 a=1'b0;b=1'b1;ci=1'b1; #15 a=1'b1;b=1'b0;ci=1'b0; #15 a=1'b1;b=1'b0;ci=1'b1; #15 a=1'b1;b=1'b1;ci=1'b0; #15 a=1'b1;b=1'b1;ci=1'b1; end

endmodule

//一位全加器加上最大延迟15ns,分析乘法器最大延时为90ns(六个全加器), //实际测得乘法器延时75ns,即可输出正确结果。测试结果如下: # 0reset=1,a= 1,b= 4,y= 0 # 200reset=0,a=15,b=14,y= 4 # 215reset=0,a=15,b=14,y= 78 # 230reset=0,a=15,b=14,y=146 # 245reset=0,a=15,b=14,y=162

# 260reset=0,a=15,b=14,y=178

# 275reset=0,a=15,b=14,y=210

//加法器设置15ns个延时,测试时也设置15ns延时。测试结果如下: # 15a=0,b=0,ci=0,s=1,co=0 # 30a=0,b=0,ci=1,s=0,co=0 # 45a=0,b=1,ci=0,s=1,co=0 # 60a=0,b=1,ci=1,s=1,co=0 # 75a=1,b=0,ci=0,s=0,co=1 # 90a=1,b=0,ci=1,s=1,co=0 # 105a=1,b=1,ci=0,s=0,co=1

# 120a=1,b=1,ci=1,s=0,co=1 # 135a=1,b=1,ci=1,s=1,co=1

//加法器设置15ns个延时,测试时设置20ns延时。测试结果如下: # 20a=0,b=0,ci=0,s=1,co=0 # 35a=0,b=0,ci=0,s=0,co=0 # 40a=0,b=0,ci=1,s=0,co=0 # 55a=0,b=0,ci=1,s=1,co=0 # 60a=0,b=1,ci=0,s=1,co=0 # 80a=0,b=1,ci=1,s=1,co=0 # 95a=0,b=1,ci=1,s=0,co=1 # 100a=1,b=0,ci=0,s=0,co=1 # 115a=1,b=0,ci=0,s=1,co=0 # 120a=1,b=0,ci=1,s=1,co=0 # 135a=1,b=0,ci=1,s=0,co=1 # 140a=1,b=1,ci=0,s=0,co=1

# 160a=1,b=1,ci=1,s=0,co=1 # 175a=1,b=1,ci=1,s=1,co=1

//再给复位时的与门和位相与的与门加上5ns延迟,测得延时为85ns # 0reset=1,a= 1,b= 4,y= x # 5reset=1,a= 1,b= 4,y= 0 # # # #

100reset=0,a=15,b=14,y= 0 105reset=0,a=15,b=14,y= 4 125reset=0,a=15,b=14,y= 78 140reset=0,a=15,b=14,y=146

# 155reset=0,a=15,b=14,y=162 # 170reset=0,a=15,b=14,y=178 # 185reset=0,a=15,b=14,y=210 # 200reset=0,a= 0,b= 0,y=210 # 225reset=0,a= 0,b= 0,y=156 # 240reset=0,a= 0,b= 0,y=120 # 255reset=0,a= 0,b= 0,y= 0 # 300reset=0,a= 0,b= 1,y= 0