首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制到灰度的转换

二进制到灰度的转换
EN

Stack Overflow用户
提问于 2014-02-20 12:51:33
回答 5查看 8.9K关注 0票数 1
代码语言:javascript
复制
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

这个二进制到灰度的转换代码是一本书中的一个例子。有谁能解释一下:

代码语言:javascript
复制
assign gray_value[i]=binary_value[i]^binary_value[i+1];

我不能理解这种从二进制转换为格雷码的特定XOR操作。

EDAplayground上的示例。

EN

回答 5

Stack Overflow用户

发布于 2014-02-20 16:59:58

^是一个异或(异或)运算符。

代码语言:javascript
复制
A B | Result
----+-------
0 0 |  0
0 1 |  1
1 0 |  1
1 1 |  0

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

(一元) Xor还可以用作缩减操作符,以生成单词的奇偶校验:

代码语言:javascript
复制
^4'b0001 => 1'b1
^4'b0101 => 1'b0
票数 2
EN

Stack Overflow用户

发布于 2014-02-21 03:39:57

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

代码语言:javascript
复制
assign gray_value[PTR:0] = binary_value[PTR:0] ^ {1'b0, binary_value[PTR:1]};

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

你确实需要循环的地方是在另一个方向(从灰色到二进制):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-07-02 20:18:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21898403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档