二进制到灰度转换

时间:2014-02-20 04:51:33

标签: verilog system-verilog

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上的示例。

5 个答案:

答案 0 :(得分:1)

^是XOR(独占或)运算符。

A B | Result
----+-------
0 0 |  0
0 1 |  1
1 0 |  1
1 1 |  0

i只是循环中当前位置和最后位置的索引。

(一元)Xor也可以用作缩减运算符来生成单词的奇偶校验:

^4'b0001 => 1'b1
^4'b0101 => 1'b0

答案 1 :(得分:1)

更紧凑的解决方案(尽管功能相同)是:

assign gray_value[PTR:0] = binary_value[PTR:0] ^ {1'b0, binary_value[PTR:1]};

这避免了生成块和循环,但仍然对除MSB之外的所有位执行按位异或。

你需要的地方是另一个方向(灰色到二进制):

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

答案 2 :(得分:0)

这就是转换的工作方式。如果您按照此图像,您将看到与Verilog代码基本相同的操作。

答案 3 :(得分:0)

简单二进制到灰度转换数据流模型Verilog代码:

模块bintogray(输入[3:0] bin,输出[3:0]灰色);

指定灰色[3] = bin [3];

指定灰色[2] = bin [3] ^ bin [2];

指定灰色[1] = bin [2] ^ bin [1];

指定gray [0] = bin [1] ^ bin [0];

endmodule

答案 4 :(得分:-1)

试试此代码

module B2G (binary_value, gray_value);
  input [7:0] binary_value;
  output [7:0] gray_value;

  genvar i;
  generate
    for(i=6; i>=0; i=i-1)
    begin

    assign gray_value[i] = binary_value[i+1] ^ (binary_value[i]);
  end
endgenerate

assign gray_value[7] = binary_value[7];
endmodule