J'essaie d'écrire un BCD Adder dans Verilog, mais j'ai des problèmes avec l'un des modules. Plus précisément, l'additionneur prend deux chiffres BCD et les ajoute. Donc, l'idée est de savoir si la somme des deux chiffres est inférieure ou égale à neuf, alors c'est correct. Cependant, s'il est plus grand, un décalage de 6 doit être ajouté. Voici mon code Verilog jusqu'à présent:BCD Adder dans 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
Quoi qu'il en soit, lorsque je tente de synthétiser dans Xilinx, je reçois les erreurs suivantes:
ERREUR: HDLCompilers: 247 - ligne "DIGITADD.v" 33 Référence à fil scalaire 'c2' est pas un reg juridique ou variable lvalue
ERREUR: HDLCompilers: 247 - "DIGITADD.v" ligne 33 référence au fil scalaire 's2' est pas un reg juridique ou lvalue variables
ERREUR: HDLCompilers: 42 - "DIGITADD.v" ligne 33 Le côté gauche illégal de l'assi procédural gn
J'ai essayé de changer certaines choses comme changer le fil à reg, mais je ne peux toujours pas le faire fonctionner. Toute aide est appréciée.
Ça va, j'ai compris maintenant. C'est fondamentalement juste verilog être ennuyeux, mais quelques conseils au cas où quelqu'un trouve cela et a le même problème. 1. Ne mettez pas les instructions d'affectation dans les blocs 2. Dans ce cas, le fil doit être reg 3. Fondamentalement, vous déclarez reg [4: 0] s2 et affectez SUM = s2 [3: 0] et COUT s2 [4] 4. Ensuite, il est beaucoup plus facile de faire la logique – DemonicImpact
Vous pouvez ajouter votre propre réponse, puis l'accepter. De cette façon, cette question n'apparaîtra pas sur la liste des questions sans réponse. – George
D'accord, merci. Je ne le savais pas, au cas où ce n'est pas évident, je suis encore un peu nouveau à ce sujet. – DemonicImpact