如何在verilog中进行一位补码

如何在verilog中进行一位补码,verilog,xilinx,complement,Verilog,Xilinx,Complement,我想问一下如何将位向量x[0:3]中的一位,例如x[3]转换为一,如果它为零,或者如果它在verilog中为一,则转换为零。因此,如果x=0101,它将变成x=0100。我尝试了与not进行合并,但在verilog中它是错误的。你能帮我做到这一点吗? 我的代码在这里: 其中x:input和y:x在变异一位后 提前谢谢 always_comb begin x = 4'b0101 ; x[3] = ~x[3] ; //overwrite x[3] with its complem

我想问一下如何将位向量x[0:3]中的一位,例如x[3]转换为一,如果它为零,或者如果它在verilog中为一,则转换为零。因此,如果x=0101,它将变成x=0100。我尝试了与not进行合并,但在verilog中它是错误的。你能帮我做到这一点吗? 我的代码在这里: 其中x:input和y:x在变异一位后

提前谢谢

always_comb begin
   x    = 4'b0101 ; 
   x[3] = ~x[3] ; //overwrite x[3] with its complement
end


要将一位更改为总线的一部分,请执行以下操作:

module bit_mangle(
  input  [3:0] x,
  output [3:0] y
);

  always @* begin
    y = {x[3:1], ~x[0]} ;
  end

endmodule
我已经在EDA游乐场上更新了您的代码副本,并修复了testharness中的一些问题。


更常见的是从[SIZE-1:0]定义总线。您的旧变异代码试图在两个位置驱动输入,而不是让上面的级别驱动值。

谢谢。。但是仍然有很多错误。这是我的代码。你能帮我吗?其中x:input和y:x在变异1位之后。模块突变(x,y);输入[0:3]x=0000;输出[0:3]y;reg[0:3]y;始终@(x)开始x=4'b0101;x[3]=~x[3]//用补码y={x[0:3]}覆盖x[3];端模块//也是,这是测试台模块TBM;参数s=4;reg[0:s-1]x;导线[0:s-1]y;突变m(.x(x),.y(y);初始开始//初始化输入x=2;//等待100 ns,等待全局重置完成#100;end ENDMULETHIS错误:第30行:不允许对非寄存器x进行过程赋值,左侧应为reg/integer/time/genvar。第30行位于:x[3]=~x[3];以干净的方式(而不是注释)编写代码是一种很好的做法,这样其他人就可以轻松阅读。你也可以写在这里,并在这个网站上发布一个链接。此外,在发布问题之前,您可能希望查看此页面:作业应位于
始终
块中,或带有
分配
关键字。但在我的代码作业中,作业位于始终中,您能否在修改后编写代码以理解您的意思?
module bit_mangle(
  input  [3:0] x,
  output [3:0] y
);

  always @* begin
    y = {x[3:1], ~x[0]} ;
  end

endmodule