您好我是EE系学生参加数字系统课程,我的任务是在Verilog中编写计算器代码。我不应该使用行为代码,除了*和/,我有3个关于我的代码的问题。 我的代码如下。
module fa(x, y, z, s, c);
input x, y, z;
output s, c;
wire p, q, r;
xor XOR1(p, x, y);
xor XOR2(s, p, z);
and AND1(q, x, y);
and AND2(r, z, p);
or OR1(c, q, r);
endmodule
module rca(B, A, C0, CS , S, V);
input [16:0] A, B;
input C0, CS;
output [16:0] S;
output V;
wire [17:1] C;
wire [16:0] nB;
xor SignB0(nB[0], CS, B[0]);
xor SignB1(nB[1], CS, B[1]);
xor SignB2(nB[2], CS, B[2]);
xor SignB3(nB[3], CS, B[3]);
xor SignB4(nB[4], CS, B[4]);
xor SignB5(nB[5], CS, B[5]);
xor SignB6(nB[6], CS, B[6]);
xor SignB7(nB[7], CS, B[7]);
xor SignB8(nB[8], CS, B[8]);
xor SignB9(nB[9], CS, B[9]);
xor SignB10(nB[10], CS, B[10]);
xor SignB11(nB[11], CS, B[11]);
xor SignB12(nB[12], CS, B[12]);
xor SignB13(nB[13], CS, B[13]);
xor SignB14(nB[16], CS, B[14]);
xor SignB15(nB[15], CS, B[15]);
xor SignB16(nB[16], CS, B[16]);
fa Bit0(nB[0], A[0], C0, S[0], C[1]);
fa Bit1(nB[1], A[1], C[1], S[1], C[2]);
fa Bit2(nB[2], A[2], C[2], S[2], C[3]);
fa Bit3(nB[3], A[3], C[3], S[3], C[4]);
fa Bit4(nB[4], A[4], C[4], S[4], C[5]);
fa Bit5(nB[5], A[5], C[5], S[5], C[6]);
fa Bit6(nB[6], A[6], C[6], S[6], C[7]);
fa Bit7(nB[7], A[7], C[7], S[7], C[8]);
fa Bit8(nB[8], A[8], C[8], S[8], C[9]);
fa Bit9(nB[9], A[9], C[9], S[9], C[10]);
fa Bit10(nB[10], A[10], C[10], S[10], C[11]);
fa Bit11(nB[11], A[11], C[11], S[11], C[12]);
fa Bit12(nB[12], A[12], C[12], S[12], C[13]);
fa Bit13(nB[13], A[13], C[13], S[13], C[14]);
fa Bit14(nB[14], A[14], C[14], S[14], C[15]);
fa Bit15(nB[15], A[15], C[15], S[15], C[16]);
fa Bit16(nB[16], A[16], C[16], S[16], C[17]);
xor Overflow(V, C[17], C[16]);
endmodule
module mul(A, B, Z, Vc);
input [16:0] A, B;
output [16:0] Z;
output Vc;
assign Z = A * B;
det Vm(Z, Vc);
endmodule
module div(A, B, Z, Vc);
input [16:0] A, B;
output [16:0] Z;
output Vc;
assign Z = A / B;
det Vd(Z, Vc);
endmodule
module det(A, V);
input [16:0] A;
output V;
always @* begin
if(A>99999) begin
V = 1;
end
else if(A<-9999) begin
V = 1;
end
else begin
V = 0;
end
end
endmodule
module cal_alu(A, B, S, Z, V);
input [16:0] A, B;
input [1:0] S;
output [16:0] Z;
output V;
wire Va, Vb, Vc;
det VA(A, Va);
det VB(B, Vb);
always @* begin
case(S)
2'b00 :
rca Add(A, B, 0, 0, Z, Vc);
2'b01 :
rca Sub(A, B, 0, 1, Z, Vc);
2'b10 :
mul Mul(A, B, Z, Vc);
2'b11 :
div Div(A, B, Z, Vc);
endcase
end
or VV(V, Va, Vb, Vc);
endmodule
如何检测溢出数A和B,关于两者是> 99999还是&lt; -9999,特别是在门级?因为我不确定,但我认为'如果'和'案例'是行为级代码。
因此,2位开关用于确定计算的类型(加法,减法,乘法或除法),但如何不使用“case”?
如何检测乘法器和除法器结果的溢出?我知道加法和减法溢出可以通过对最大的两个进位进行异或来检测,但我不知道乘法和除法。
答案 0 :(得分:1)
以下是问题的答案