Verilog калькулятор с 16-битными входами

Эй, ребята, я застрял в проекте и ищу понимание. Проблема заключается в следующем: создайте модуль Verilog с именем "calculator", который принимает два 16-разрядных числа со знаком с именами "in1" и "in2" и выполняет следующие функции в зависимости от значения третьего 4-разрядного ввода с именем "opCode" (см. таблицу ниже). Выходные данные модуля "калькулятор" должны иметь 16-разрядное число со знаком, называемое "результат", и 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

Любая помощь и совет будет принята с благодарностью.

1 ответ

Он должен работать с 4'b1000 и т. Д. В операторах if. Вы только что использовали 1000

Другие вопросы по тегам