如何将数字转换为2';verilog中的补码?

如何将数字转换为2';verilog中的补码?,verilog,circuit,hdl,Verilog,Circuit,Hdl,我正试图在verilog中设计一个4位加法-减法器。这只是我用verilog写的第二件事,我还不知道所有正确的语法。这是我到目前为止所学的模块: module Question3(carryin, X, Y, Z, S, carryout, overflow); parameter n = 4; input carryin, Z; input [n-1:0]X, Y; output reg [n-1:0]S; output reg carryout, ov

我正试图在verilog中设计一个4位加法-减法器。这只是我用verilog写的第二件事,我还不知道所有正确的语法。这是我到目前为止所学的模块:

module Question3(carryin, X, Y, Z, S, carryout, overflow);
    parameter n = 4;
    input carryin, Z;
    input [n-1:0]X, Y;
    output reg [n-1:0]S;
    output reg carryout, overflow;

    if(Z==0)
    begin
        Y = not(y) + 4'b0001;
    end

    always @(X, Y, carryin)
        begin
            {carryout, S} = X + Y + carryin;
            overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
        end

endmodule
我的编译器(xilinx 10.1)一直在说“if附近的语法错误”。我尝试了许多不同的转换方法,包括只使用以Y为参数的大小写,然后检查所有可能的4位组合,并将它们转换为2的补码


Z是决定加法器是进行减法运算还是加法运算的参数。如果它是0,它意味着减法,我想把y转换成2的补码,然后做常规加法。我确信加法器的其余部分是正确的,我只是不知道我试图转换的部分有什么问题。

您在“y=not(y)+4'b0001”中使用了小写“y”


此外,您使用的附加内容比您需要的要多。X-Y与NOT(不是(X)+Y)是一样的。

将if语句放在初始块中

有几点很重要

  • 将if语句放在always块中。不要使用两个始终块,您将在模拟器中创建竞争条件
  • 我创建了一个新变量,Y_u,因为在赋值的左侧使用Y,这是一个输入,记住,当你合成时,它可能会推断锁存或做一些其他讨厌的事情
  • 我建议使用位反转运算符“~”来反转Y,如果“不是” 原始的。通过这种方式,合成工具可以更自由地优化代码
  • 仔细检查结果是否正确,我已经有一段时间没有构建加法器了

  • 如果你这样做,它可能不会正确合成。
    Y
    是否意味着
    Y comp1
    ?就个人而言,如果
    ,我不会将整个加法器包装在
    中。您所写的实现了两个加法器,然后在输出端放置一个多路复用器。您需要的是一个在输入端带有多路复用器的加法器。你要求乐观主义者做很多事情。
    
    reg [n-1:0] Y_compl;
    
    always @( Z, Y, X, carryin ) begin
      Y_ = ( ~Y + 4'b0001 );
      if ( Z == 1'b0 ) begin
        {carryout, S} = X + Y_compl + carryin;
        overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
      end
      else begin
        {carryout, S} = X + Y + carryin;
        overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
      end
    
    end