Мне нужно построить калькулятор, который принимает 2 подписанных 16-разрядных номера (in1, in2) и функции преформ на них в зависимости от opCode (4-битный вход). Выходы должны быть подписанным 16-битным номером с именем «результат» и один бит «переполнение»Verilog Calculator с 16-разрядными входами с подписями
Мне действительно нужна помощь в исправлении кода. Это не работает, и я не уверен, что я делаю неправильно.
OpCode
- 0000 ..... Добавить IN1 и IN2
- 0001 ..... вычитать in1-in2
- 0010 ..... разделить in1 на десять с остатком 1 или ноль (использование оператора модуль)
- 0011 ..... побитовое и IN1 IN2
- 0100 ..... побитового XOR IN1 | дюйм2
- 0101 ..... комплемента IN1
- 0110 ..... побитовое ИЛИ in1 in2
- 0111 ..... дополнение in1
- 1000 ..... приращение in1 1
1001 .... декремента in1 на 1
module calculator( input [15:0] in1, input [15:0] in2, input [3:0] opCode, output [15:0] ); reg [3:0] opCode; reg [15:0] in1; reg [15:0] in2; reg [15:0] result; reg overflow; always @ (opcode) begin if (opCode == 0000) begin // add in1+in2 result=in1+in2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); end if (opCode == 0001) begin //subtract in1-in3 result=in1-in2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1, in2, result, overflow); end if (opCode == 0011) begin //divide int1 by 10 w/ remainder as overflow result=in1%10; $display("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); $monitor("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); end if (opCode == 0100) begin //preforms AND operation in1 in2 result=in1&int2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); end if (opCode == 0101) begin //preforms XOR operation in1 in2 result=in1^int2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); end if (opCode == 0110) begin //preforms OR op on in1 in 2 result=in1|int2; $display("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); $monitor("opCode(%b),in1(%d),in2(%d),result(%d),overflow(%b)", opCode, in1,in2, result, overflow); end if (opCode == 0111) begin //complement of in1 result=!in1; $display("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); $monitor("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); end if (opCode == 1001) begin //increase in1 by 1 result=in1+1; $display("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); $monitor("opCode(%b),in1(%d),result(%d),overflow(%b)", opCode, in1, result, overflow); end if (opCode == 1000) begin //decrease in2 by 1 result=in2-1; $display("opCode(%b),in2(%d),result(%d),overflow(%b)", opCode, in2, result, overflow); $monitor("opCode(%b),in2(%d),result(%d),overflow(%b)", opCode, in2, result, overflow); end end end endmodule endmodule
«Это не работает»: вам нужно предоставить гораздо больше деталей. – toolic
Попробуйте 'always @ *' вместо 'always @ (opcode)'. Узнайте разницу между '$ display' и' $ monitor'. Ваш код может пригодиться в случае case. – Greg
Просто заметили, что есть несколько очевидных ошибок компиляции. Просмотрите файл журнала. – Greg