赞
踩
硬件乘法器常规的设计是采用“串行移位”和“并行加法”相结合的方法,这种方法并不 需要很多的器件,然而“加法-移位”的方法毕竟太慢。随着大规模集成电路的发展,采用高速 的单元阵列乘法器,无论从计算机的计算速度,还是从提高计算效率,都是十分必要的。阵列 乘法器分带符号和不带符号的阵列乘法器,本节只讨论不带符号阵列乘法。高速组合阵列乘法 器,采用标准加法单元构成乘法器,即利用多个一位全加器(FA)实现乘法运算。
对于一个 4 位二进制数相乘,有如下算式:
这个 4 × 4 阵列乘法器的原理如图 1-3-1 所示。
FA(全加器)的斜线方向为进位输出,竖线方向为和输出。图中阵列的最后一行构成了一 个串行进位加法器。由于 FA 一级是无需考虑进位的,它的进位被暂时保留下来不往前传递,因此同一极中任意一位 FA 加法器的进位输出与和输出几乎是同时形成的,与“串行移位”相比可 大大减少同级间的进位传递延迟,所以送往最后一行串行加法器的输入延迟仅与 FA 的级数(行 数)有关,即与乘数位数有关。本实验用 CPLD 来设计一个 4×4 位加法器,且全部采用原理图方式实现。
本次实验要求实现一个带符号的4×4阵列乘法器。
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
本次实验通过编写程序、仿真运行、电路连接等步骤,较好地实现了带符号的4×4阵列乘法器的功能。可以通过本程序,实现两个带符号的4位二进制数的乘法,最终得到一个带符号的8位二进制数的结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。