2010-11-14 387 views
5

我想在Verilog中編寫BCD加法器,但是我遇到了其中一個模塊的問題。具體來說,需要兩個BCD數字並添加它們的加法器。所以,這個想法是,如果兩位數的總和小於或等於九,那麼它是正確的。但是,如果它更大,則必須添加6的偏移量。這裏是我的Verilog代碼至今:Verilog中的BCD加法器

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的或可變的左值

ERROR:HDLCompilers:247 - 「DIGITADD.v」線33參考爲「S2」的標量線是不是合法的REG的或可變的左值

錯誤:HDLCompilers:42 - 「DIGITADD.v」第33行程序助手左側非法gn

我試着改變一些東西,如改變電線註冊,但我仍然無法得到它的工作。任何幫助表示讚賞。

+1

好吧,我現在想通了。它基本上只是verilog令人討厭,但一些技巧,以防萬一誰發現這一點,並有同樣的問題。 1.不要把賦值語句放在塊 中2.在這種情況下,線路應該是reg 3.基本上,你聲明reg [4:0] s2並且分配SUM = s2 [3:0]和COUT s2 [4] 4.然後它更容易做邏輯 – DemonicImpact 2010-11-14 23:49:10

+0

你可以添加自己的答案,然後接受它。這樣,這個問題就不會出現在未回答的問題列表中。 – George 2010-11-15 09:03:46

+0

好的,謝謝。我不知道,如果它不是很明顯,我對此還是有點新鮮的。 – DemonicImpact 2010-11-17 11:25:43

回答

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