2013-08-02 56 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