x86 ALU中的进位/辅助标志功能

时间:2013-08-02 18:57:28

标签: verilog status x86-16 alu

我正在尝试在Verilog中创建一个8086处理器,并且我对大多数架构有一个比平均水平更好的基本理解(并且一旦我超越这一点就可以愉快相处),但我不能似乎围绕着ALU中的进位和辅助标志如何起作用。

我知道CF会在加法或减法(在这种情况下称为借位)触发,这会导致结果大于ALU的位宽。

但是,如何编写用于加法和减法的Verilog代码,以便我可以写入FLAGS [0](CF)位然后重新访问它以继续操作?任何人都可以给我一些我可以解构的例子吗?

此外,这更像是一个n00b问题,但如果SI和DI寄存器的宽度仅为16位,带进位操作的ALU如何支持创建17位数?这个额外的位置去哪里或用它完成了什么?如果乘法产生相同的位溢出会发生什么?

许多新手级问题的道歉。我几乎觉得我会因为明显的无知或对此缺乏理解而大喊大叫。非常感谢能够提供帮助并为理解提供代码行的人,以便为我阐明这一点。

1 个答案:

答案 0 :(得分: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]指定为进位标志。