2013-08-02 232 views
1

我試圖創建一個Verilog的8086處理器,和我有一個更好的高於平均水平的基本認識大部分的架構(可以相處愉快,一旦我得到過去,這點),但我似乎無法圍繞ALU中的Carry和Auxiliary標誌如何工作。進/輔助標誌功能

據我所知,CF是建立在一個加法或減法(在這種情況下,它被稱爲借位),將導致結果爲比ALU的位寬度大觸發。

但是,我怎麼會寫Verilog代碼進行加減,讓我寫這些標誌[0](CF)位,然後再訪問它繼續運作?任何人都可以給我例子,我可以解構?

此外,這更是一個n00b問題,但如果一個帶進位操作的ALU能夠支持創建一個17位數字(如果SI和DI寄存器的寬度只有16位),它是怎麼樣的呢?這個多餘的位置在哪裏呢?如果乘法產生相同的位溢出,會發生什麼?

很多道歉的新手級問題。我幾乎覺得自己會因爲某些明顯的無知或對此缺乏理解而大吼一聲。非常感謝任何能夠幫助並給予理解的代碼行,以便爲我闡明這一點。

回答

1

我不太清楚你的意思然後重新訪問它以繼續操作,但是如果你只是問你怎麼能從16位加/減生成一個進位,這是一個方法來做到這(使用級聯寫結果到兩個不同的寄存器):

always @ posedge clk begin 
    if(add_with_carry) 
    {CF[0], result[15:0]} <= a[15:0] + b[15:0]; 
    else if(sub_with_carry) 
    {CF[0], result[15:0]} <= a[15:0] - b[15:0]; 
    else if(add_without_carry) 
      result[15:0] <= a[15:0] + b[15:0]; 
    else if(sub_without_carry) 
      result[15:0] <= a[15:0] - b[15:0]; 
end 

這也是基本相同的事情作爲結果寫入到17位寄存器,然後只指定結果[16]如進位標誌。

+0

噢好吧。所以這種操作的結果將是CF FLAGS位和寄存器結果的組合。這對我來說更有意義 - 我愚蠢地認爲,ALU把它們總結在一起並放在某個地方,哈哈。 – ecfedele

+0

現在,如果處理器被告知無需進位兩個可以設置CF位的值,會發生什麼情況? – ecfedele

+0

如果你需要額外的操作而不觸碰進位位,那麼你可以在那裏添加額外的子句來做不同的事情(比如不向CF寫入數據)。有很多不同的方式可以完成。 – Tim