2010-11-14 30 views
5

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.

+1

Ç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

+0

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

+0

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

Répondre

10

D'accord, je l'ai compris, le code correct est ci-dessous. Fondamentalement, voir le commentaire que j'ai fait sur ma question pour quelques conseils à retenir. C'est drôle combien c'est plus simple comparé au désordre que j'ai eu 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