这个东西一直记得乱乱的 格雷码转二进制只会铺开写 理一下
1、基本原理:
(1)二进制转格雷码:
格雷码最高位是二进制最高位,然后将二进制最高位和次高位做^
或者简单点 在二进制前补一个0,从左到右与二进制^
(2)格雷码转二进制:
二进制最高位是格雷码最高位,然后将二进制最高位和格雷码次高位做^
或者简单点 在二进制前补一个0,从左到右与格雷码^
2、代码:
(1)二进制转格雷码:
module bin2gray#(parameter DW = 8 )(input [DW - 1:0] bin ,output [DW - 1:0] gray);assign gray = (bin >> 1) ^ bin; endmodule
(2)格雷码转二进制:
module gray2bin#(parameter DW = 8 )(input[DW - 1:0] gray ,output reg [DW - 1:0] bin);integer i;always@(*)beginfor(i = 0;i < DW ;i = i + 1)beginbin[k] = ^(gray >> k); endendendmodule
放一段代码这,用于参考:
/*Logic to convert binary numbers into Gray coded binary numbers is implemented in the following Verilog Code.
*/
modulebinary2gray();
regclk;
regrstn;
reg[5:0]counter_binary,counter_binary_reg,counter_gray,counter_gray_reg;
integercount,file_wr;
/* Initial block to generate clock and reset */
initialbegin
clk=0;rstn=0;#100rstn=1;
foreverbegin
#10clk=!clk;
endend
/* Synchronous Logic for registering the data and incrementing the counter for binary data */
always@(posedgeclkornegedgerstn)
begin
if(!rstn)begin
counter_binary_reg<='b0;
counter_gray_reg<='b0;end
elsebegin
counter_binary_reg<=counter_binary+1;
counter_gray_reg<=counter_gray;
$display("binary number= 6'b%b : gray en-coded binary number = 6'b%b",counter_binary_reg,counter_gray_reg);endend
/* Logic is to get Gray code from Binary code */
function[5:0]binary2gray;
input[5:0]value;
integeri;
begin
binary2gray[5]=value[5];
for(i=5;i>0;i=i-1)
binary2gray[i-1]=value[i]^value[i-1];
end
endfunction
/* Get gray encoded output */
always@(*)
begin
counter_gray=counter_gray_reg;
counter_binary=counter_binary_reg;
counter_gray=binary2gray(counter_binary_reg);end
endmodule
参考:
Verilog 中的 ^ 的用法_李锐博恩的博客-CSDN博客_^ verilog
进阶之路——二进制与格雷码的相互转换模块设计_尼德兰的喵的博客-CSDN博客_格雷码转二进制电路图