2014-10-16 3 views
-3
module adder4(
output[3:0] sum, 
output c_out,  // carry out 
input[3:0] a, b, // operands 
input c_in);  // carry in 

wire [2:0] c_o; 
full_adder fa1(c_o[0],sum[0],a[0],b[0],c_in); 
full_adder fa2(c_o[1],sum[1],a[1],b[1],c_o[0]); 
full_adder fa3(c_o[2],sum[2],a[2],b[2],c_o[1]); 
full_adder fa4(c_out,sum[3],a[3],b[3],c_o[2]); 

endmodule 

module full_adder(
    output sum, 
    output c_out, // carry out 
    input a, 
    input b, 
    input c_in); // carry in 

wire sum1; 
wire c_in1; 
wire c_out2; 
    half_adder ha1(sum1,c_in1,a,b); 
    half_adder ha2(sum,c_out2,sum1,c_in); 
    or(c_out,c_out2,c_in1); 
endmodule 


module half_adder(
    output sum, 
    output c_out, // carry out 
    input a, 
    input b); 

assign sum=a^b; 
assign c_out=a&&b; 

endmodule 

안녕하세요! 4 개의 가산기에서 4 비트 가산기를 만들려고했지만 잘못된 결과가 계속 나타납니다. a = 3, b = 8 일 때 합계가 11 대신 9가됩니다. 나는 실수를 보지 못합니다. 누군가 내가 여기서 잘못하고있는 것을 알아 낸 것입니까?4 비트 덧셈기가 잘못된 결과를 반환합니다.

답변

0

일부 연결이 잘못되었습니다. c_o[0]sum 포트 full_adder (c_o[2:1]c_out과 동일)에 연결하고 있습니다. 포트 순서는 위치별로 인스턴스화 할 때 중요합니다. 가장 빠른 해결 방법은 다음을 사용하는 것입니다.

module full_adder(
    output c_out, // carry out 
    output sum, 

일반적으로 위치 대신 이름을 사용하여 인스턴스화하는 것이 좋습니다. 분명히, 이것은 더 자세한이지만, 배선 버그의 당신의 유형을 방지 않습니다

full_adder fa1 (.c_out(c_o[0]) , .sum(sum[0]), .a(a[0]), .b(b[0]), .c_in(c_in)); 

UPDATE :

full_adder fa[3:0] (
    .c_out ({c_out, c_o}), 
    .sum (sum), 
    .a  (a), 
    .b  (b), 
    .c_in ({c_o, c_in}) 
); 
+0

감사합니다 : : 또한 인스턴스 배열을 활용할 수있는 D를, 나는하지 않았다 지금까지 그것을 깨달으십시오. –

+0

이제 a = 8, b = 3 및 c_in = 1 일 때 12가됩니다. –

+0

@lulia Dobra : 1) 환영합니다. 2) 12 점을 얻어야합니다. – toolic

관련 문제