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