Кодирование простого калькулятора на уровне ворот Verilog

Привет, я студент EE на курсе Digital Systems, и у меня есть задание написать код калькулятора в 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 или <-9999, особенно на уровне шлюза? Потому что я не уверен, но я думал, что "если" и "случай" были кодами поведенческого уровня.

  2. Таким образом, предполагается, что 2-битный переключатель определяет тип вычисления (сложение, вычитание, умножение или деление), но как мне сделать это, не используя "case"?

  3. Как я могу обнаружить переполнение для результата множителя и делителя? Я знаю, что переполнение сложения и вычитания может быть обнаружено с помощью XORing двух самых больших переносов, но я понятия не имею о умножении и делении.

1 ответ

Вот ответы на вопросы

  1. да, если и заявления случая являются поведенческими. Вы должны использовать компаратор. Простое 2-битное уравнение компаратора для проверки, будет ли A > B O = A0&~B1&~B0 | A1&~B1 | A1 и A0 и B0 ~
  2. Используйте мультиплексор, чтобы выбрать соответствующий вывод вместо оператора case.
  3. Рассчитайте произведение с двойной шириной для вывода, т.е. 32-битным выходом для 16-битных входов, а затем используйте компаратор для расчета переполнения.
Другие вопросы по тегам