BCD Adder в Verilog

Я пытаюсь написать сумматор BCD в Verilog, но у меня проблемы с одним из модулей. В частности, сумматор, который берет две цифры 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 Недопустимая левая часть процедурного назначения

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


person DemonicImpact    schedule 14.11.2010    source источник
comment
Ничего страшного, теперь я понял. Это в основном просто раздражает verilog, но пара советов на случай, если кто-то обнаружит это и столкнется с той же проблемой. 1. Не помещайте операторы присваивания в блоки always 2. В этом случае провод должен быть reg 3. Обычно вы объявляете reg [4: 0] s2 и присваиваете SUM = s2 [3: 0] и COUT s2 [4] 4. Тогда логику будет намного проще.   -  person DemonicImpact    schedule 15.11.2010


Ответы (2)


Ладно разобрался, правильный код ниже. В основном, посмотрите комментарий, который я сделал по моему вопросу, чтобы запомнить несколько советов. Забавно, насколько это проще по сравнению с тем беспорядком, который у меня был ранее.

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 
person DemonicImpact    schedule 17.11.2010

В обычном тексте не используйте непрерывное присваивание, такое как оператор assign, в процедурном блоке, т.е. всегда или начальное.

Помните правило и жизнь хороша :-)

person JYasir    schedule 30.03.2018