1

我正在尝试在 Verilog 中创建一个 8086 处理器,并且我对大多数体系结构的基本理解要好于平均水平(一旦我通过这一点就可以愉快地相处),但我似乎无法包装我对进位和辅助标志在 ALU 中的作用感到头疼。

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

但是,我将如何编写用于加法和减法的 Verilog 代码,以允许我写入 FLAGS[0] (CF) 位,然后重新访问它以继续操作?谁能给我可以解构的例子?

此外,这更像是一个 n00b 问题,但是如果 SI 和 DI 寄存器的宽度仅为 16 位,那么带进位运算的 ALU 怎么能支持创建 17 位数字呢?多余的部分去哪里了,或者用它做了什么?如果乘法产生相同的位溢出会发生什么?

对于新手级别的问题,我们深表歉意。我几乎觉得我会因为一些明显的无知或对此缺乏理解而大喊大叫。非常感谢任何可以提供帮助并提供代码行以帮助我理解这一点的人。

4

1 回答 1

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 位寄存器,然后将 result[16] 指定为进位标志基本相同。

于 2013-08-03T04:02:38.147 回答