Verilog x86 ALU中的进位/辅助标志函数

Verilog x86 ALU中的进位/辅助标志函数,verilog,status,x86-16,alu,Verilog,Status,X86 16,Alu,我试图在Verilog中创建一个8086处理器,我对大多数体系结构有着比一般人更好的基本理解(一旦我越过了这一点,我就可以愉快地相处),但我似乎无法理解ALU中进位和辅助标志是如何工作的 我知道CF是在加法或减法(在这种情况下称为借用)时触发的,这将导致结果大于ALU的位宽度 但是,我如何编写用于加法和减法的Verilog代码,以允许我写入标志[0](CF)位,然后重新访问它以继续操作?谁能给我举个例子,我可以解构 此外,这更像是一个n00b问题,但如果SI和DI寄存器的宽度只有16位,带进位操

我试图在Verilog中创建一个8086处理器,我对大多数体系结构有着比一般人更好的基本理解(一旦我越过了这一点,我就可以愉快地相处),但我似乎无法理解ALU中进位和辅助标志是如何工作的

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

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

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


对于新手级别的问题,我深表歉意。我几乎觉得我会因为一些明显的无知或对这一点缺乏理解而被骂。非常感谢任何能够帮助我并给出代码行的人为我解释这一点。

我不太明白你的意思,然后重新访问它以继续操作,但如果你只是问如何从16位加法/减法生成进位,这是一种方法(使用串联将结果写入两个不同的寄存器):

始终@posedge clk begin
如果(添加带进位的进位)

{CF[0],result[15:0]}我不太清楚您的意思,然后重新访问它以继续操作,但如果您只是问如何从16位加法/减法生成进位,这是一种方法(使用串联将结果写入两个不同的寄存器):

始终@posedge clk begin
如果(添加带进位的进位)

{CF[0],结果[15:0]}哦,好的。这样一个操作的结果将是CF标志位和寄存器结果的组合。这对我来说更有意义-我愚蠢地认为ALU将它们相加并放在一起,哈。现在,如果处理器被告知不携带两个值来设置CF位,那么会发生什么?如果您需要在不接触进位的情况下进行添加的附加操作,然后您可以在
if
中添加附加子句来执行不同的操作(例如,在不写入CF的情况下执行添加)。有很多不同的方法可以实现。这里,让我重新表述一下-如果我给处理器添加命令(不带进位的添加),会发生什么情况但是有两个值会溢出到17位,从而设置进位?另外,乘法中是否有任何等价物-也就是说,如果输出溢出,乘法运算会发生什么?请查看编辑后的答案,看看这对您是否有意义。您也可以对乘法做类似的操作。哦,好的。那么结果是什么这种操作的lt将是CF标志位和寄存器结果的组合。这对我来说更有意义-我愚蠢地认为ALU将它们相加并放在一起,哈。现在,如果处理器被告知添加两个值而不携带两个值来设置CF位,会发生什么?如果你需要额外的o在不接触进位的情况下进行添加的操作,那么您只需在
if
中添加附加子句即可执行不同的操作(例如,在不向CF写入的情况下执行添加)。有很多不同的方法可以执行。这里,让我重新表述一下-如果我给处理器添加命令,会发生什么情况(不带进位的加法)但有两个值会溢出到17位,从而设置进位?此外,乘法中是否有任何等价项?即,如果输出溢出,乘法运算会发生什么情况?请查看编辑后的答案,看看这是否对您有意义。您也可以对乘法执行类似操作。
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