2010-11-14 36 views
5

में बीसीडी योजक मैं Verilog में एक बीसीडी योजक लिखने की कोशिश कर रहा हूं, लेकिन मुझे मॉड्यूल में से एक के साथ परेशानी हो रही है। विशेष रूप से, वह योजक जो दो बीसीडी अंकों को लेता है और उन्हें जोड़ता है। तो, विचार यह है कि यदि दो अंकों का योग नौ से कम या बराबर है, तो यह सही है। हालांकि, यदि यह अधिक है, तो 6 का ऑफसेट जोड़ा जाना चाहिए। यहाँ अब तक मेरी Verilog कोड है: फिर भी जब मैं Xilinx में यह संश्लेषण करने की कोशिशवेरिलोग

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 

,, मैं निम्नलिखित त्रुटियाँ मिलती है:

त्रुटि: HDLCompilers: 247 - "DIGITADD.v" लाइन 33 संदर्भ अदिश तार 'c2' के लिए एक कानूनी reg या चर lvalue

त्रुटि नहीं है: HDLCompilers: 247 - "DIGITADD.v" अदिश तार 'एस 2' के लिए लाइन 33 संदर्भ एक कानूनी reg या चर lvalue नहीं है

त्रुटि: एचडीएल कॉम्पलर: 42 - "DIGITADD.v" लाइन 33 प्रक्रियात्मक assi के अवैध बाएं हाथ की ओर gn

मैंने कुछ चीजों को बदलने के लिए तार बदलने की कोशिश की, लेकिन मैं अभी भी इसे काम नहीं कर सकता। किसी भी मदद की सराहना की है।

+1

ठीक है, मुझे अभी पता चला है। इसकी मूल रूप से केवल verilog परेशान होने वाला है, लेकिन अगर किसी को यह पता चलता है और एक ही समस्या है तो कुछ युक्तियाँ। 1. हमेशा ब्लॉक में असाइन स्टेटमेंट्स न डालें 2. इस मामले में, तार 3 होना चाहिए। असल में, आप reg [4: 0] s2 घोषित करते हैं और SUM = s2 [3: 0] और COUT s2 असाइन करते हैं [4] 4. फिर तर्क – DemonicImpact

+0

करने के लिए यह बहुत आसान है आप अपना जवाब जोड़ सकते हैं और फिर इसे स्वीकार कर सकते हैं। इस तरह यह प्रश्न अनुत्तरित प्रश्न सूची पर प्रकट नहीं होगा। – George

+0

ठीक है धन्यवाद। मुझे नहीं पता था कि, अगर यह स्पष्ट नहीं है, तो मैं अभी भी इस तरह का नया हूं। – DemonicImpact

उत्तर

10

ठीक है, मैंने इसे समझ लिया, सही कोड नीचे है। असल में, याद रखने के लिए कुछ सुझावों के लिए मैंने अपने प्रश्न पर टिप्पणी की। यह मजाकिया है कि इससे पहले की गड़बड़ी की तुलना में यह कितना आसान है।

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