两个'的Verilog构造;补码比较器

两个'的Verilog构造;补码比较器,verilog,Verilog,我试图为两个4位2的补码的比较器编写一些简单的verilog代码。我有两个4位输入(A[3:0],B[3:0])和3个输出(AeqB,AgtB,AltB)来显示A和B是否相等,A是否大于B,或A是否小于B。还有第三个输入名为sign,如果0表示数字无符号,如果1,则表示数字有符号 所以我知道两个有符号的2的补码可以通过减去它们来比较,但我不能让它在我的设计中正常工作。以下是我尝试过的: if(sign==0) begin if(({sign,A}-{sign,B})==0)

我试图为两个4位2的补码的比较器编写一些简单的verilog代码。我有两个4位输入(A[3:0],B[3:0])和3个输出(AeqB,AgtB,AltB)来显示A和B是否相等,A是否大于B,或A是否小于B。还有第三个输入名为sign,如果0表示数字无符号,如果1,则表示数字有符号

所以我知道两个有符号的2的补码可以通过减去它们来比较,但我不能让它在我的设计中正常工作。以下是我尝试过的:

if(sign==0)
 begin

    if(({sign,A}-{sign,B})==0)
        AeqB = 1;
    else if(({sign,A}-{sign,B}) > 0)
        AgtB = 1;
    else if (({sign,A}-{sign,B}) < 0
        AltB = 1;
end
if(符号==0)
开始
if({sign,A}-{sign,B})==0)
AeqB=1;
else如果({sign,A}-{sign,B})>0)
AgtB=1;
else如果({sign,A}-{sign,B})<0
AltB=1;
结束

似乎这应该是可行的。我将符号位连接到4位数字的前面,减去它们,然后检查它们是否大于或等于零。如果A-B我不确定你在用
{sign,A}做什么
。如果数字的格式是有符号的,这将强制数字为负数。除非符号强制数字为负数

您可以将输入定义为有符号或强制进行有符号比较,并在无符号情况下0填充msb以共享硬件,您所暗示的是三个减法器并行。合成可能会做得很好并共享硬件,但每次都必须检查它是否为您提供了所需的硬件

if (sign) begin
   A_i = {A[3], A};
   B_i = {B[3], B};
end
else begin
   A_i = {1'b0, A};
   B_i = {1'b0, B};
end

AgtB = $signed(A_i) > $signed(B_i) ;
AltB = ~AgtB ;
加减法数字时,位增长的结果是最大位宽输入+1。对于无符号0填充,中断结果为无符号。对于有符号数字,通过重复MSB进行符号扩展

为了帮助理解2的补码,我提供了一些有符号无符号算术的4位示例

无符号算术:

   3 : (0)0011 
 + 1 : (0)0001
 = 4 :  0 0100    
  15 :  (0)1111 //Zero pad for correct bitwidths
 + 1 :  (0)0001
 =16 :   1 0000
   7 : (0)0111
  -1 : (1)1111 //(twos complement of 1)
  // Sum the bits as you did for unsigned
  =6 :  0 0110  
大无符号算术:

   3 : (0)0011 
 + 1 : (0)0001
 = 4 :  0 0100    
  15 :  (0)1111 //Zero pad for correct bitwidths
 + 1 :  (0)0001
 =16 :   1 0000
   7 : (0)0111
  -1 : (1)1111 //(twos complement of 1)
  // Sum the bits as you did for unsigned
  =6 :  0 0110  
大签名(溢出):
在结果上,不同的(01)MSB指示截断返回到4位的溢出

   7 : (0)0111
  +1 : (0)0001
  =8 :  0 1000 bits
减法:

   3 : (0)0011 
 + 1 : (0)0001
 = 4 :  0 0100    
  15 :  (0)1111 //Zero pad for correct bitwidths
 + 1 :  (0)0001
 =16 :   1 0000
   7 : (0)0111
  -1 : (1)1111 //(twos complement of 1)
  // Sum the bits as you did for unsigned
  =6 :  0 0110  

你是否在其他情况下重置了值。我认为你应该在所有情况下设置所有3个
AeqB、AgtB、AltB
。是的,它们都初始化为零,如果设置了一个,其他的都会重置。将其更改为那样的有符号值是否会自动使用两个补码?@Riley,全数字算术(+-)是二的补足。只有你如何解释答案才是真正重要的。