"Diseñe un multiplicador con signo de 2 bits utilizando una instanciación de su sumador de 4 bits. Recuerde que debe extender el signo de sus dos entradas de 2 bits a 4 bits completos". Esta fue mi tarea y se me ocurrió el siguiente código, pero algunos de mis resultados son incorrectos. ¿Alguien puede decirme qué estoy haciendo mal?

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
0
Jesus Meza 14 mar. 2021 a las 05:34

1 respuesta

La mejor respuesta

Había algunas señales declaradas como reg conectadas a las salidas del puerto, reg deben asignarse en bloques de procedimiento.

También hice que los bits de acarreo en el sumador fueran un vector wire explícito, en lugar de múltiples cables implícitos. Los cables implícitos son peligrosos: un error tipográfico conduce a una desconexión.

También declaré que el sum0 en el multiplicador tiene el mismo ancho que la salida del puerto sum donde está conectado, aunque el bit 4 no se usará.

En términos de lógica, solo cometió un error, el A * B = A * B[0] - 2*A * B[1] en lugar de A * B[0] + 2*B[1] si B es un entero de 2 bits con signo. Porque B[1] es el bit de signo, entonces B = B[0] - 2*B[1]. Arreglé esto usando el unario - directamente en la conexión del puerto, dejaré que usted escriba esto estructuralmente.

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
0
user12750353 14 mar. 2021 a las 09:38