2013-11-26 3 views
0
module fa(a,b,cin,cout,sum); 
     input a; 
     input b; 
     wire bxor; 
     input cin; 
     output cout; 
     output sum; 

     assign bxor = b^cin; 
     assign sum = ((a^bxor)^(cin)); 
     assign cout = ((a&bxor)|((a^bxor)&cin)); 
endmodule 

module rca(a,b,cin,cout,sum); 
     input cin; 
     output cout; 
     output [7:0] sum; 
     input [7:0] a, b; 
     wire c[6:0];  

     fa first(a[0],b[0],cin,c[0],sum[0]); 
     fa second(a[1],b[1],c[0],c[1],sum[1]); 
     fa third(a[2],b[2],c[1],c[2],sum[2]); 
     fa fourth(a[3],b[3],c[2],c[3],sum[3]); 
     fa fifth(a[4],b[4],c[3],c[4],sum[4]); 
     fa sixth(a[5],b[5],c[4],c[5],sum[5]); 
     fa seventh(a[6],b[6],c[5],c[6],sum[6]); 
     fa eighth(a[7],b[7],c[6],cout,sum[7]); 
endmodule 

module alu_op(a,b,op,out); 
     input [7:0] a, b; 
     input [2:0] op; 
     output [7:0] out; 
     output reg out1; 

     always @ (op or a or b) 
       case (op) 
         3'b000 : out1 = fa(a, b, op[0], op[0], out); 
         3'b001 : out1 = fa(a,b,op[0], op[0], out); 
         //3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]); 
         3'b011 : out1 = a^b; 
         3'b100 : out1 = a | b; 
         3'b101 : out1 = a & b; 
       endcase 
endmodule 

사례 진술에서 함수를 호출 할 수 없기 때문에 문제라고 생각합니다. 나는 이것에 완전히 새롭고 무엇을 해야할지 전혀 모른다. 나는 기본적으로 alu를 만들고 있는데, 처음 두 사례는 add와 sub를 사용하기로되어있다. 내가 컴파일 할 때Verilog이 내 기능을 보지 못했습니다.

내가 얻을 :

alutester.vl:66: error: No function fa in this context (alu.utt). 
alutester.vl:67: error: No function rca in this context (alu.utt). 

내가 왜 아무 생각이 없습니다. 누군가 나를 도와 줄 수 있니?

+0

나는 거기에있는 리플 캐리 가산기를 사용하려고 시도했지만, 나는 단지 전체 가산기를 어떻게 사용했는지 파악할 수 없었다. rca가 나에게 알려주는 경우 – user2197126

답변

2

당신은이 fa라는 기능이없는, 당신은 fa라는 모듈을 (그들은 같은 것이 아니다) 만들었습니다. 그리고 절차 적 블록 안에 모듈을 인스턴스화 할 수 없습니다.

해당 모듈로 무엇을 하려는지 명확하지 않습니다. 나는이 모든

out1 = fa(a, b, op[0], op[0], out);

먼저 무엇을 의미하는지 잘 모르겠어요, 당신은 작전을 묶는 것 [0] 잘못된 것, 그리고이 걸릴 것으로 예상되는 어떤 값을 out1 분명하지 않다하는, CIN 및 cout을 모두 . 가산기의 합계 출력을 얻어야합니까? fa의 일부 출력에서 ​​out1을 가져오고 always 블록 외부에서 인스턴스화 한 다음 out1을 원하는 경우 모듈에서 오는 전선과 같게 설정하십시오.

+0

op [0]은 수행 할 작업의 첫 번째 비트를 선택합니다. 0 또는 1입니다. 0이면 1을 더하고 빼면 1을 출력합니다. out1은 alu의 출력이라고 가정합니다. – user2197126

+0

그런 경우, op [0]을'cout'에서 연결 해제해야합니다. 그러면 신호에 와이어 경합이 발생하고 강제로 'x'가됩니다. 절차 블록 외부에서 ALU를 인스턴스화하고 ALU의 출력을 와이어에 할당 한 다음 ALU 출력에서 ​​샘플링하려는 경우 해당 와이어를 out1에 연결합니다 – Tim

1

8 비트 덧셈기 인 rca 모듈을 만들었습니다.

은 나중에, 당신은 입력 피연산자로 ab를 취하는 ALU, 그리고 수행 할 의향이 동작에 따라 out1를 할당 보이는 있습니다.

은 어느 당신은 ... a 플러스 b의 합을 사용할 수 있기 위하여 당신의 alu_op 모듈의 rca 모듈을 인스턴스화

module alu_op(a,b,op,out); 
     input [7:0] a, b; 
     input [2:0] op; 
     output [7:0] out; 
     output reg out1; 

     wire [7:0] sum; 
     rca my_adder(.a(a),.b(b),.cin(1'b0),.sum(sum)) 

     always @ (op or a or b) 
       case (op) 
         3'b000 : out1 = sum; 
         //3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]); 
         3'b011 : out1 = a^b; 
         3'b100 : out1 = a | b; 
         3'b101 : out1 = a & b; 
       endcase 
endmodule 

또는 (반드시 더 나은), 어떻게 컴파일러 그냥 알아 보자 + 연산자를 사용하여 덧셈기를 작성하십시오.

module alu_op(a,b,op,out); 
     input [7:0] a, b; 
     input [2:0] op; 
     output [7:0] out; 
     output reg out1; 

     always @ (op or a or b) 
       case (op) 
         3'b000 : out1 = a + b; 
         //3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]); 
         3'b011 : out1 = a^b; 
         3'b100 : out1 = a | b; 
         3'b101 : out1 = a & b; 
       endcase 
endmodule 

은 BTW : 나는 당신이 (연산 001) 빼기를 원하는 확신으로 비트 이동은 마이너스 - 연산자도 사용할 수 있습니다, 또한 유효한의 Verilog 피연산자이며,. 또한 비트 쉬핑 및 뺄셈은 합성 가능합니다.

관련 문제