计算机组成原理第二次实验(带符号的阵列乘法器)

一、实验目的

  1. 掌握乘法器的原理及其设计方法。
  2. 熟悉 CPLD 应用设计及 EDA 软件的使用。

二、实验原理与内容

  硬件乘法器常规的设计是采用“串行移位”和“并行加法”相结合的方法,这种方法并不 需要很多的器件,然而“加法-移位”的方法毕竟太慢。随着大规模集成电路的发展,采用高速 的单元阵列乘法器,无论从计算机的计算速度,还是从提高计算效率,都是十分必要的。阵列 乘法器分带符号和不带符号的阵列乘法器,本节只讨论不带符号阵列乘法。高速组合阵列乘法 器,采用标准加法单元构成乘法器,即利用多个一位全加器(FA)实现乘法运算。
  对于一个 4 位二进制数相乘,有如下算式:

在这里插入图片描述

  这个 4 × 4 阵列乘法器的原理如图 1-3-1 所示。
在这里插入图片描述

图 1-3-1 4×4 阵列乘法器原理图

  FA(全加器)的斜线方向为进位输出,竖线方向为和输出。图中阵列的最后一行构成了一 个串行进位加法器。由于 FA 一级是无需考虑进位的,它的进位被暂时保留下来不往前传递,因此同一极中任意一位 FA 加法器的进位输出与和输出几乎是同时形成的,与“串行移位”相比可 大大减少同级间的进位传递延迟,所以送往最后一行串行加法器的输入延迟仅与 FA 的级数(行 数)有关,即与乘数位数有关。本实验用 CPLD 来设计一个 4×4 位加法器,且全部采用原理图方式实现。
  本次实验要求实现一个带符号的4×4阵列乘法器。

三、实验过程

  1. 根据上述阵列乘法器的原理,使用 Quartus II 软件编写程序并进行调试。程序代码如下:
module zhenliechengfa(
input [4:0] x,
input [4:0] y,
output [8:0] z
    );
wire c0 = 0;
wire [2:0]cin1=0;
wire [2:0]cin2;
wire [2:0]cin3;
wire [2:0]cin4;
wire [1:0]m4;
wire [1:0]m3;
wire [1:0]m1;
wire [1:0]m2;
wire a1,a2,a3,a4;
xor M(z[8], x[4], y[4]);
lie1 aaa1(.x(x),.y(y[0]),.m(m1),.s(z[0]),.a(a1));
lie234 aaa2(.x(x),.y(y[1]),.cin(cin1),.u(m1),.aa(a1),.s(z[1]),.m(m2),.a(a2),.cout(cin2));
lie234 aaa3(.x(x),.y(y[2]),.cin(cin2),.u(m2),.aa(a2),.s(z[2]),.m(m3),.a(a3),.cout(cin3));
lie234 aaa4(.x(x),.y(y[3]),.cin(cin3),.u(m3),.aa(a3),.s(z[3]),.m(m4),.a(a4),.cout(cin4));
chaoqian3 aaa5(.c0(c0),.x({a4,m4[1],m4[0]}),.y(cin4),.sum({z[6],z[5],z[4]}),.cout(z[7]));
endmodule

module lie1(input [3:0]x,input y,output [1:0]m,output s,output a);
and(s,x[0],y);
and(m[0],x[1],y);
and(m[1],x[2],y);
and(a,x[3],y);
endmodule

module lie234(input [3:0]x,input y,input [2:0]cin,input [1:0]u,input aa, 
output s,output [1:0]m,output a,output [2:0]cout);
wire [2:0]bi;
and(bi[0],x[0],y);
and(bi[1],x[1],y);
and(bi[2],x[2],y);
and(a,x[3],y);
fa u1(.a(u[0]),.b(bi[0]),.cin(cin[0]),.sum(s),.cout(cout[0]));
fa u2(.a(u[1]),.b(bi[1]),.cin(cin[1]),.sum(m[0]),.cout(cout[1]));
fa u3(.a(aa),.b(bi[2]),.cin(cin[2]),.sum(m[1]),.cout(cout[2]));
endmodule

module chaoqian3(input c0,input [2:0]x,input [2:0]y,output [2:0]sum,output cout);
    wire [2:0]c;
    chaoqianjinwei add3(x,y,c,c0);
    wire [2:0]u;
    fa U1(.cout(u[0]),.sum(sum[0]),.a(x[0]),.b(y[0]),.cin(c0));
    fa U2(.cout(u[1]),.sum(sum[1]),.a(x[1]),.b(y[1]),.cin(c[0]));
    fa U3(.cout(u[2]),.sum(sum[2]),.a(x[2]),.b(y[2]),.cin(c[1]));
    assign cout=c[2];
endmodule

module chaoqianjinwei(x,y,c,c0);
    input c0;
    input [2:0]x;
    input [2:0]y;
    output  [2:0]c;
    wire [2:0]G,P;
    assign P = x | y;
    assign G = x & y;
    assign c[0]= G[0] | (c0&P[0]);
    assign c[1]= G[1] | (P[1]&G[0]) | (P[1]&P[0]&c0);
    assign c[2]= G[2] | (P[2]&G[1]) | (P[2]&P[1]&G[0]) | (P[2]&P[1]&P[0]&c0);
endmodule


module fa(
input a,
input b,
input cin,
output sum,
output cout
);
wire S1, T1, T2, T3;
xor x1 (S1, a, b);
xor x2 (sum, S1, cin);
and A1 (T3, a, b );
and A2 (T2, b, cin);
and A3 (T1, a, cin);
or O1 (cout, T1, T2, T3 );
endmodule

  1. 进行仿真调试,检测程序运行是否正确,并进行管脚的分配。仿真图及管脚分配图如下:
    . 在这里插入图片描述
图3-1 仿真调试图

四、实验总结

   本次实验通过编写程序、仿真运行、电路连接等步骤,较好地实现了带符号的4×4阵列乘法器的功能。可以通过本程序,实现两个带符号的4位二进制数的乘法,最终得到一个带符号的8位二进制数的结果。

  • 1
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoLo-8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值