实施ALU

时间:2015-10-25 05:46:03

标签: verilog alu

我正在尝试使用特定的功能代码实现ALU。

由于某些原因,下面的代码没有运行,并且根据编译器有错误。

  

错误(可抑制):alu.v(61):( vlog-2388)已在此范围(alu)中声明'结果'。
  错误(可抑制):alu.v(67):( vlog-2388)'operand0'已在此范围内声明(alu)。
  错误(可抑制):alu.v(67):( vlog-2388)'operand1'已在此范围内声明(alu)。
  错误(可抑制):alu.v(68):( vlog-2388)'control'已在此范围内声明(alu)。
  错误:(vlog-13069)alu.v(71):near“< =”:语法错误,意外< =。
  错误:alu.v(71):( vlog-13205)在'result'后面的范围内发现语法错误。缺少'::'吗?

如果我将结果,操作数0,操作数1和控制的声明删除为有线和寄存器,我仍然会收到错误,说“结果”超出范围或无法访问。我真的很困惑这一部分,非常感谢任何帮助。

我觉得问题出在了regs和wire的某个地方,但我不确定。

module alu 
(
//--------------------------
// Input Ports
//--------------------------
input   [31:0]  operand0, 
input   [31:0]  operand1, 
input   [3:0]   control,
//--------------------------
// Output Ports
//--------------------------
output  [31:0]  result,
output          zero,
output          overflow
);



// Signal Declarations: local params




// Signal Declarations: reg





// Signal Declarations: wire


always @(*)
begin
case(control) 
4'b0000: result= operand0 | operand1; // OR 

4'b0001: begin
        result= operand0 & operand1; // AND
     end  
default: result = 4'b0;
endcase
end


endmodule 

我将上面的代码更改为修改后的版本。我仍然会遇到错误:

现在说: (vlog-2110)非法引用网络“结果”。 3次

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。有两种声明输入和输出的方法:

  module alu (
         input   [31:0]  operand0, 
         input   [31:0]  operand1, 
         input   [3:0]   control,

         output reg [31:0]  result,
         output          zero,
         output          overflow
             );

和第二种方法是:

   module (operand0,operand1,control,result,zero,overflow);
   input [31:0]  operand0; 
   input   [31:0]  operand1;
   input   [3:0]   control;
   output reg [31:0]  result;
   output          zero;
   output          overflow;

我希望你能看出差异。因此,在您的代码中,您将重新声明输入和输出。

同样非阻塞分配,即< = 通常用于顺序逻辑。对于组合逻辑,阻塞分配是优选的,即 =

如果您想将输出定义为 reg ,则必须在始终块内使用,否则将其定义为电线。

您的代码可以写成如下:

module alu 
(
input   [31:0]  operand0, 
input   [31:0]  operand1, 
input   [3:0]   control,

output reg [31:0]  result,
output          zero,
output          overflow
);


always @(*)
begin
 case(control) 
  4'b0000: result= operand0 | operand1; // OR 

  4'b0001: begin
           result= operand0 & operand1; // AND
           end  
 default : result =4'b0;
endcase
end
 endmodule