2012-10-31 71 views
4

我一直在試圖建立一個返回(3位)輸入的二進制補碼錶示(第一位是符號)的模塊。我認爲下面的代碼是正確的概念,但我可能失去了一些東西它的結構:當我嘗試編譯,我得到以下錯誤:Verilog中的二進制補碼

(vlog-2110) Illegal reference to net "f_o". 
(vlog-2110) Illegal reference to net "f_o". 
(vlog-2110) Illegal reference to net "f_o". 

搜索該錯誤表明使用時,它通常出現一個變量作爲輸入和輸出在同一時間,但這不是我的情況。你能指出錯誤在哪裏嗎?

module ca2 (a_i,f_o); 
    input [2:0] a_i; 
    output [2:0] f_o; 

    always @(a_i[2:0] or f_o[2:0]) 
    begin 
    if (a_i[2] == 1) 
    begin 
     f_o[2] = a_i[2]; 
     f_o[1:0] = (~a_i[1:0] + 'b1); 
    end 
    else 
    begin 
     f_o = a_i; 
    end 
    end 
endmodule 

回答

2

在Verilog中,未聲明的標識符在大多數情況下被認爲是隱含的導線聲明。由於f_o沒有被聲明,編譯器認爲它是一個連線,而不是一個變量。這會導致編譯器抱怨所有的分配。

// What was typed 
module ca2 (a_i,f_o); 
    input [2:0] a_i; 
    output [2:0] f_o; 

// What the compiler implicitly declares 
    wire [2:0] a_i; 
    wire [2:0] f_o; 

要修復它,您可以聲明變量或聲明端口和變量。

module ca2 (a_i,f_o); 
    input [2:0] a_i; 
    output [2:0] f_o; 
    reg [2:0] f_o; 

module ca2 (a_i,f_o); 
    input  [2:0] a_i; 
    output reg [2:0] f_o; 
+0

非常感謝你......這種「小」的東西,我不能把它放在手指上! – Ironil

1

f_o需要聲明爲reg。 output reg [2:0] f_o

另外我不確定你在計算什麼,這不是一個標準的二進制補碼。

module ca2 (
    input  [2:0] a_i, 
    output  [2:0] twos_comp, 
    output  [2:0] also_twos_comp 
); 

    assign  twos_comp = ~a_i + 1'b1; 
    assign also_twos_comp = -a_i ; 
endmodule 

你可能會處理的編碼輸入,但twos_complement是否定我希望符號位(MSB)更改號碼。雖然我們將它稱爲符號位,但它也包含有關該值的信息,因此不能只是被剝離並保持不變。

+0

也謝謝你,問題的解決方法與Adam12相同。關於你的其他評論,基本上我所做的就是如果輸入是正數,則數字保持不變,如果輸入是負數,則改爲ca2表示(即:如果輸入爲101,則意味着-3,ca2爲011) 。我不知道我是否對這個例子很有意義,但無論如何,代碼都會做我所需要的。 – Ironil

+0

嗯,這是轉換符號(MSB)幅度(LSBs)爲Twos補碼。 – Morgan