2013-11-26 32 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 

我在想这是因为你不能在case语句中调用函数。我对此完全陌生,不知道该怎么做。我基本上做了一个铝,前两个案件应该做添加和分。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]双方CIN和COUT,这似乎是错误的,目前还不清楚应该采取什么样的价值out1 。它应该得到加法器的总和输出吗?如果你想从fa的某些输出中取出1,然后在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模块。

后来,你有什么似乎是一个ALU这需要ab作为输入操作数,并依据是愿意要执行的操作分配out1

要么你实例化你的alu_op模块中的rca模块,以便有可用的ab总和,...

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:位移位也是一个有效的Verilog操作,而且,我敢肯定你想减法(操作001),减号-运营商可用。另外,位删除和减法也是可以合成的。