Question
Je suis en train d'écrire un BCD Adder dans Verilog, mais j'ai du mal avec l'un des modules. Plus précisément, l'additionneur qui prend deux chiffres BCD et les ajoute. Donc, l'idée est de savoir si la somme des deux chiffres est inférieur ou égal à neuf, il est correct. Cependant, si elle est supérieure, un décalage de 6 doit être ajouté. Voici mon code Verilog jusqu'à présent:
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
De toute façon, lorsque je tente de synthétiser dans Xilinx, je reçois les erreurs suivantes:
ERREUR: HDLCompilers: 247 - "DIGITADD.v" ligne 33 référence à un 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 variable lvalue
ERREUR: HDLCompilers: 42 - ligne "DIGITADD.v" 33 côté illégal gauche de procédure Assign
J'ai essayé de changer certaines choses comme changer le fil à reg, mais je ne peux toujours pas au travail. Toute aide est appréciée.
La solution
D'accord, j'ai tout compris, le bon code est ci-dessous. Au fond, voir le commentaire que je fait sur ma question pour quelques conseils à retenir. Son drôle combien plus simple c'est comparé au gâchis que j'avais plus tôt.
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
Autres conseils
Dans le texte brut, ne dispose pas d'une affectation continue comme instruction « Assign » dans un bloc de procédure à savoir toujours ou initial.
Rappelez-vous la règle et la vie est bon: -)