binary - 2 位有符号乘法器
问题描述
使用 4 位加法器的一个实例设计一个 2 位有符号乘法器。请记住,您需要将两个 2 位输入符号扩展为完整的 4 位。
这是我的任务,我想出了以下代码,但我的一些输出是错误的。谁能告诉我我做错了什么?
module mult(C,A,B);
output signed[3:0]C;
input signed[1:0]A,B;
reg signed[3:0]sA,sB;
assign sA = {A[1],A[1],A};
assign sB = {B[1],B[1],B};
wire carry;
wire signed[3:0] A1;
wire signed[3:0] A2;
wire signed[3:0] sum0;
and(A1[0],sA[0],sB[0]);
and(A1[1],sA[1],sB[0]);
and(A1[2],sA[2],sB[0]);
and(A1[3],sA[3],sB[0]);
assign A2[0] = 0;
and(A2[1],sA[0],sB[1]);
and(A2[2],sA[1],sB[1]);
and(A2[3],sA[2],sB[1]);
adder4bit a1(.A(A1),.B(A2),.Co(carry),.sum(sum0));
assign C[0] = sum0[0];
assign C[1] = sum0[1];
assign C[2] = sum0[2];
assign C[3] = sum0[3];
endmodule
module adder4bit(A,B,sum,Co);
input signed[3:0]A,B;
output signed [4:0]sum;
reg signed[4:0]a,b;
output Co;
wire Ci;
assign Ci = 1'b0;
assign a = {A[3],A};
assign b = {B[3],B};
FA a0(.A(a[0]),.B(b[0]),.Ci(Ci),.sum(sum[0]),.Co(w1));
FA a1(.A(a[1]),.B(b[1]),.Ci(w1),.sum(sum[1]),.Co(w2));
FA a2(.A(a[2]),.B(b[2]),.Ci(w2),.sum(sum[2]),.Co(w3));
FA a3(.A(a[3]),.B(b[3]),.Ci(w3),.sum(sum[3]),.Co(w4));
FA a4(.A(a[4]),.B(b[4]),.Ci(w4),.sum(sum[4]),.Co(Co));
endmodule
module FA(A,B,Ci,Co,sum);
input A,B,Ci;
output sum,Co;
assign sum = (A^B)^Ci;
assign Co = (B&Ci) | (A&Ci) | (A&B);
endmodule
解决方案
有一些信号被声明为reg
连接到端口输出,reg
必须在程序块中分配。
我还将加法器中的进位位设为显式wire
向量,而不是多个隐式连线。隐式电线很危险,打字错误会导致断开连接。
我还声明了sum0
乘法器中的 in 与它所连接的端口的输出 in 具有相同的宽度sum
,即使不会使用第 4 位。
就逻辑而言,您只犯了一个错误,A * B = A * B[0] - 2*A * B[1]
而不是A * B[0] + 2*B[1]
ifB
是一个 2 位有符号整数。因为B[1]
是符号位,所以B = B[0] - 2*B[1]
. 我通过-
直接在端口连接中使用一元来解决这个问题,我将把它留给你在结构上编写。
module mult(C,A,B);
output signed[3:0]C;
input signed[1:0]A,B;
wire signed[3:0]sA,sB;
assign sA = {A[1],A[1],A};
assign sB = {B[1],B[1],B};
wire carry;
wire signed[3:0] A1;
wire signed[3:0] A2;
wire signed[4:0] sum0;
and(A1[0],sA[0],sB[0]);
and(A1[1],sA[1],sB[0]);
and(A1[2],sA[2],sB[0]);
and(A1[3],sA[3],sB[0]);
assign A2[0] = 0;
and(A2[1],sA[0],sB[1]);
and(A2[2],sA[1],sB[1]);
and(A2[3],sA[2],sB[1]);
// FIXME: Notice that I am passing -A2, the simulator will
// negate the signal automatically. Maybe for your assignment
// you are requried to expand this using logic primitives...
adder4bit a1(.A(A1),.B(-A2),.Co(carry),.sum(sum0));
assign C[0] = sum0[0];
assign C[1] = sum0[1];
assign C[2] = sum0[2];
assign C[3] = sum0[3];
endmodule
module adder4bit(A,B,sum,Co);
input signed[3:0]A,B;
output signed [4:0]sum;
wire signed[4:0]a,b;
output Co;
wire [4:1] w;
wire Ci;
assign Ci = 1'b0;
assign a = {A[3],A};
assign b = {B[3],B};
FA a0(.A(a[0]),.B(b[0]),.Ci(Ci),.sum(sum[0]),.Co(w[1]));
FA a1(.A(a[1]),.B(b[1]),.Ci(w[1]),.sum(sum[1]),.Co(w[2]));
FA a2(.A(a[2]),.B(b[2]),.Ci(w[2]),.sum(sum[2]),.Co(w[3]));
FA a3(.A(a[3]),.B(b[3]),.Ci(w[3]),.sum(sum[3]),.Co(w[4]));
FA a4(.A(a[4]),.B(b[4]),.Ci(w[4]),.sum(sum[4]),.Co(Co));
endmodule
module FA(A,B,Ci,Co,sum);
input A,B,Ci;
output sum,Co;
assign sum = (A^B)^Ci;
assign Co = (B&Ci) | (A&Ci) | (A&B);
endmodule
推荐阅读
- graphql - 查询不会通过 GraphQL 从 DynamoDB 返回某些项目
- python - 如何在 python 中输入条件参数类型?
- python - 编译的 opencv 4.5.1 仅适用于(windows)anaconda - 为什么?
- html - 如何在使用 html 和 css 或引导程序附加的屏幕截图上制作垂直向上的表格标题?
- powerbi - 以另一列的最小值/最大值作为条件测量为 SUM
- jspdf - Jspdf 和 html2pdf 不能处理多页的动态数据(pdf 中超过 25 页),重叠问题
- r - 使用矩阵在另一个矩阵中填充 NA 值
- python - sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:mariadb.mariadbconnector
- oracle - 当存在行时,ODP.NET ExecuteReader 返回零结果
- junit - 如何为会话对象编写junit