2017-06-26 31 views
-1

代码在寄存器中对二进制进行签名扩展和零扩展的格式是什么?Verilog:如何在注册表中扩展二进制文件?

reg[0:0] a;  //a is 1-bit. 
reg[31:0] b, c; //b and c are 32-bits. 
//some code... 

符号扩展a到32位,将其添加到b,并把结果存入c

零延伸a为32位,将其添加到b,并将结果放入c

+0

@toolic你能解释你在那里做了什么吗?谢谢 – NoName

+0

'reg [0:0] a;'=>'reg a;'这是一点。 –

回答

0

签名扩展有很多方法,我将使用需要最少量代码的方法。我们将使用Verilog 复制串联操作。

复制格式:{numberOfTimesToRepeat{value}}

即{20 {A [0]}}

复制第0位在a寄存器20倍。

级联格式:{value1, value2}

即{A,B}

串接中寄存器二进制a和寄存器b。之前

{{31 {A [0]}},一个}

复制第0位在a寄存器31次,并连接:

符号扩展二进制寄存器a

要零扩展:

{{31 {零}},一个} //零是含有零位的1位寄存器。

将值零复制31次,并连接在寄存器a的二进制之前。

1

这里是一个系统的Verilog方式:

logic signed a; 
logic [31:0] b, c; 
... 

b = a; 

在上面的例子b将成为a一个符号扩展值。

+0

使用这种方法,你将如何零扩展?将'逻辑无符号a;'和'逻辑无符号[31:0] b,c;'? – NoName

+0

'signed'变量将被符号扩展。所有其他人将被零扩展。请注意,带符号的变量会改变关系操作的结果,因为比较会记录登录。此外,签名变量使用高位来表示符号。 – Serge