当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在verilog中将数字转换为2的补码?》经验,为你挑选了1个好方法。

我试图在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 if附近有语法错误".我尝试了许多不同的转换方法,包括使用一个以Y为参数的Case,然后检查所有可能的4位组合,并将它们转换为二进制补码.

Z是确定加法器是否进行减法或加法的因素.如果它为0,则表示减法,我想将y转换为2的补码,然后只进行常规加法.我确定加法器的其余部分是正确的,我只是不知道我试图转换的部分有什么问题.



1> Steve K..:
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

几个要点.

    将if语句放在always块中.不要使用两个always块,你将在模拟器中创建一个竞争条件.

    我创建了一个新变量Y_因为使用Y,这是一个输入,记住,在赋值的左侧可能会推断出锁定或在合成时做一些令人讨厌的事情.

    我建议使用按位反转运算符'〜'来反转Y,如果'not'原语.综合工具可以更自由地以这种方式优化代码.

    仔细检查一下正确的结果,自从我构建了一个加法器以来已经有一段时间了.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有