本文只讲述直接补码阵列乘法器的手工运算方法(应付计算机组成原理)
Verilog HDL代码(八位)
module mul(a,b,z);
parameter d_width=8;
input [d_width-1:0] a,b;
output [d_width*2-1:0] z;
wire [d_width-1:0] ab0=b[0]?a:8'b0;
wire [d_width-1:0] ab1=b[1]?a:8'b0;
wire [d_width-1:0] ab2=b[2]?a:8'b0;
wire [d_width-1:0] ab3=b[3]?a:8'b0;
wire [d_width-1:0] ab4=b[4]?a:8'b0;
wire [d_width-1:0] ab5=b[5]?a:8'b0;
wire [d_width-1:0] ab6=b[6]?a:8'b0;
wire [d_width-1:0] ab7=b[7]?a:8'b0;
assign z=(({8'b1,~ab0[7],ab0[6:0]}+
{7'b0,~ab1[7],ab1[6:0],1'b0})+
({6'b0,~ab2[7],ab2[6:0],2'b0}+
{5'b0,~ab3[7],ab3[6:0],3'b0})+
({4'b0,~ab4[7],ab4[6:0],4'b0}+
{3'b0,~ab5[7],ab5[6:0],5'b0})+
({2'b0,~ab6[7],ab6[6:0],6'b0}+
{1'b1,ab7[7],~ab7[6:0],7'b0}));
endmodule
手工计算举例描述
设十进制数x=-15,y=-13,用直接补码阵列乘法器求x*y=?
[x]补=1 0001,[y]补=1 0011
手工计算方法为:对于所有行 图上黑色显示的数字即是所乘之数,红色即是所乘之数取反 蓝色即额外添加的1
对应图也就是说
第一行(1)黑色即数值位乘数值位,红色即数值位乘符号位取反,最左边添1
中间几行(234)黑色即数值位乘数值位,红色即数值位乘符号位取反
最后一行(5)是用符号位去乘,红色即符号位乘数值位取反,黑色即符号位乘符号位,最左边添1
最后结果0011000011最左边的两个00判断溢出
最终的结果即为[x*y]补=011000011