Вопрос
Я пытаюсь написать в Verilog Adder BCD, но у меня проблемы с одним из модулей. В частности, сумка, который принимает две цифры BCD и добавляет их. Таким образом, идея заключается в том, что сумма двух цифр меньше или равна девяти, то это правильно. Однако, если это больше, то необходимо добавить смещение 6. Вот мой код Verilog до сих пор:
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output reg COUT,
output reg [3:0] SUM
);
wire s2, c2;
always @ ( * )
begin
assign {c2, s2} = IN_A + IN_B + CIN;
if(s2 <= 9 && c2 == 0) begin
assign {COUT, SUM} = {c2, s2};
end
else if({c2, s2} > 9) begin
assign {COUT, SUM} = {c2, s2 + 6};
end
end
endmodule
В любом случае, когда я пытаюсь синтезировать его в Xilinx, я получаю следующие ошибки:
Ошибка: hdlCompilers: 247 - "DigitAdd.v" Линия 33 Ссылка на скалярную проволоку 'C2' не является законным регеном или переменной lvalue
Ошибка: HDLCompilers: 247 - "DigitAdd.v" Линия 33 Ссылка на скалярную проволоку 'S2' не является законным регеном или переменной lvalue
Ошибка: HDLCompilers: 42 - "DigitAdd.v" Строка 33 Незаконная левая сторона процедурного назначения
Я попытался изменить некоторые вещи, такие как изменение провода на Reg, но я все еще не могу заставить его работать. Любая помощь ценится.
Решение
Хорошо, я понял это, правильный код ниже. По сути, посмотрите на комментарий, который я сделал по своему вопросу, чтобы запомнить несколько советов. Забавно, насколько проще это по сравнению с беспорядком, который у меня был ранее.
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output COUT,
output [3:0] SUM
);
reg [4:0] s2;
assign SUM = s2[3:0];
assign COUT = s2[4];
always @ ( * )
begin
s2 = IN_A + IN_B + CIN;
if (s2 > 9)
begin
s2 = s2 + 6;
end
end
endmodule
Другие советы
В простом тексте не имейте непрерывного назначения, подобного оператору «Назначить» в процедурном блоке, ie всегда или начальной.
Помните, что правило и жизнь хороша :-)