0

嘿伙计们,我被困在一个项目上,正在寻找一些见解。问题是:构建一个名为“calculator”的 Verilog 模块,它接收两个名为“in1”和“in2”的有符号 16 位数字,并根据名为“opCode”的第三个 4 位输入的值执行以下功能(见下表)。模块“计算器”的输出必须是一个名为“结果”的有符号 16 位数字和一个 1 位“溢出”。请注意,“溢出”的值并不总是以相同的方式计算,它取决于操作。如果发生溢出或“result”的值不完全准确或正确,则输出“overflow”的值为1;否则输出“溢出”将为零。请勿使用 $display 或 $monitor 语句

我已经完成了大部分工作,但是当 opCode == 0010、0011、1000 和 1001 时,我很难检测到溢出。

这是我到目前为止所拥有的:

module Calculator(in1,in2,opCode,result,overflow);

input signed[15:0] in1, in2;

input[3:0] opCode;  
output reg signed[15:0] result;
output reg overflow;

always @ (*) begin
if(opCode == 0000) begin
   if(in1+in2<=32767 & in1+in2>= -32768) begin
       overflow = 0;
       end
       else
       begin
       overflow = 1;
       end
       end
end
always @ (*) begin
   if(opCode == 0001) begin
   if(in1-in2<=32767 & in1-in2>= -32768) begin
       overflow = 0;
       end
       else
       begin
       overflow = 1;
       end
       end
end
always @ (*) begin
   if(opCode == 0010) begin
   if(in1*5<=32767 & in1*5>= -32768) begin
       overflow = 0;
       end
       else
       begin
       overflow = 1;
       end
       end
end
always @ (*) begin
   if(opCode == 0011) begin
   if ((in1 % 10) == 0) begin
   overflow = 0;
end else begin
   overflow = 1;
end
   end
end
always @ (*) begin
   if(opCode == 0100) begin
   overflow = 0;
       end
end
always @ (*) begin
if(opCode == 0101) begin
   overflow = 0;
       end
end
always @ (*) begin
   if(opCode == 0110) begin
   overflow = 0;
       end
end
always @ (*) begin
   if(opCode == 0111) begin
   overflow = 0;
       end
end
always @ (*) begin
   if(opCode == 1000) begin
   if(in1 == 32767) begin
       overflow = 1;
       end
       else begin
       overflow = 0;
       end
       end
end
always @ (*) begin
   if(opCode == 1001) begin
   if(in1==-32768) begin
       overflow = 1;
       end
       else
       begin
       overflow = 0;
       end
       end
end
always @ (*) begin
case(opCode)
4'b0000: result = in1+in2; //add
4'b0001: result = in1-in2; //subtract
4'b0010: result = in1*5; //mult by 5
4'b0011: result = in1/10; //divide by 10
4'b0100: result = in1&in2; //AND
4'b0101: result = in1^in2; //XOR
4'b0110: result = in1|in2; //OR
4'b0111: result = /*((2^16)-1)-in1;*/(-(in1))-1; //complement
4'b1001: result = in1-1; //decrement
4'b1000: result = in1+1; //increment
endcase
end
endmodule

任何帮助和建议将不胜感激。

4

1 回答 1

0

它应该在 if 语句中与 4'b1000 等一起使用。你刚刚用了1000

于 2016-02-23T06:34:17.537 回答