在Verilog门级编码一个简单的计算器

时间:2017-04-30 02:55:39

标签: verilog behavior

您好我是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
  1. 如何检测溢出数A和B,关于两者是> 99999还是&lt; -9999,特别是在门级?因为我不确定,但我认为'如果'和'案例'是行为级代码。

  2. 因此,2位开关用于确定计算的类型(加法,减法,乘法或除法),但如何不使用“case”?

  3. 如何检测乘法器和除法器结果的溢出?我知道加法和减法溢出可以通过对最大的两个进位进行异或来检测,但我不知道乘法和除法。

1 个答案:

答案 0 :(得分:1)

以下是问题的答案

  1. 是的,如果和案例陈述是行为的。你必须使用比较器。用于检查A> A的简单2比特比较器等式。 B将是O = A0&amp; ~B1&amp; ~B0 | A1&amp; ~B1 | A1&安培; A0&安培;〜B0
  2. 使用多路复用器选择适当的输出而不是case语句。
  3. 计算输出为双倍宽度的乘积,即16位输入的32位输出,然后使用比较器计算溢出。