module binarytogray #(
parameter PTR=2
)(
input logic [PTR:0] binary_value,
output logic [PTR:0] gray_value
);
genvar i;
generate
for(i=0;i<PTR;i=i+1) begin:for_loop
assign gray_value[i]=binary_value[i]^binary_value[i+1];
end
endgenerate
assign gray_value[PTR]=binary_value[PTR];
endmodule这个二进制到灰度的转换代码是一本书中的一个例子。有谁能解释一下:
assign gray_value[i]=binary_value[i]^binary_value[i+1];我不能理解这种从二进制转换为格雷码的特定XOR操作。
EDAplayground上的示例。
发布于 2014-02-20 16:59:58
^是一个异或(异或)运算符。
A B | Result
----+-------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0i只是循环中当前和最后位置的索引。
(一元) Xor还可以用作缩减操作符,以生成单词的奇偶校验:
^4'b0001 => 1'b1
^4'b0101 => 1'b0发布于 2014-02-21 03:39:57
一种更紧凑的解决方案(尽管功能相同)是:
assign gray_value[PTR:0] = binary_value[PTR:0] ^ {1'b0, binary_value[PTR:1]};这避免了生成块和循环,但仍然对除MSB之外的所有位执行逐位XOR。
你确实需要循环的地方是在另一个方向(从灰色到二进制):
always_comb begin
binary_value[PTR] = gray_value[PTR];
for(int i=PTR-1; i>=0; i--) begin
binary_value[i] = gray_value[i] ^ binary_value[i+1];
end
end发布于 2017-07-02 20:18:21
这就是转换的工作方式。如果您遵循此图像,您将看到与您的Verilog代码基本相同的操作。

https://stackoverflow.com/questions/21898403
复制相似问题