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