Я делаю домашнюю работу для класса, и один из разделов - написание модуля mod16. По сути, у вас есть вход «OpB», и вы должны изменить его на 16 и установить «mod16» для вывода «result». Проблема в том, что нам не разрешается использовать циклы или «<<», ни операторы «+» или «-». Это должно быть чисто комбинационным. Проблема в том, что когда вы выполняете смену с помощью команды assign, она постоянно связывает этот вход с новым, который не будет работать. Я действительно не знаю, что делать отсюда. </p>
Сначала я попытался использовать все провода и назначить операторы, потому что обычно выполняются все наши назначения, но я не могу заставить это работать. Мой приятель сказал, что использует операторы конкатенации, но я не мог этого понять. Затем я попытался использовать regs (которые я никогда раньше не использовал), потому что я прочитал, что они будут копировать значение ввода один раз, и поэтому я мог манипулировать им без ошибок или изменять ввод, однако это не дает правильного значениядля мода во время работы, и я не могу сказать, почему или как это исправить.
//Do not change the port declarations
module block2 (result, OpA, OpB, switches);
input [2:0] switches;
input [7:0] OpA, OpB;
output [7:0] result;
// Replace this assign statement with your Verilog code.
// The operation of the arithmetic circuit is defined in the specification.
wire [7:0] mult8;
// B * 8
assign mult8[7:3] = OpB[4:0];
assign mult8[2:0] = 1'b0;
// B mod 16
wire [7:0] mod16, crr;
reg [7:0] OpB2, intB, comp;
initial OpB2 = OpB;
initial intB = OpB2;
initial intB[3:0] = 1'b0;
initial comp = (~intB) ^ 1;
assign mod16[0] = OpB[0] ^ comp[0];
assign crr[0] = OpB[0] & comp[0];
assign mod16[7:1] = OpB[7:1] ^ comp[7:1] ^ crr[6:0];
assign crr[7:1] = OpB[7:1] & comp[7:1] | (crr[6:0] & (OpB[7:1] ^ comp[7:1]));
//Output
assign result = (switches == 3'b101) ? mult8 :
(switches == 3'b110) ? mod16 : 8'bxxxxxxxx;
endmodule
Конечным результатом должен быть модуль из двух частей, который либо умножает B на 8 (эта часть работает нормально) или моды B на 16 без использования петель, встроенных сдвигов и всех сложений и вычитаний должны выполняться комбинационно (т. е. половинные сумматоры, полные сумматоры и т. д.).