(This code was contributed by Jeff Cassidy at Isophase Computing (jeff@isophase-computing.ca, https://github.com/isophase), with edits by myself.)
Converts a Reflected Binary Gray Code to the corresponding unsigned binary number.
Because of the abundance of binary adder/subtractor logic on an FPGA, if you want to do arithmetic with a Gray Code number, you are better off to first convert it to binary, do the math, then convert it back to Gray Code.
`default_nettype none
module Gray_to_Binary_Reflected
#(
parameter WORD_WIDTH = 0
)
(
input wire [WORD_WIDTH-1:0] gray_in,
output reg [WORD_WIDTH-1:0] binary_out
);
localparam ZERO = {WORD_WIDTH{1'b0}};
initial begin
binary_out = ZERO;
end
function [WORD_WIDTH-1:0] gray_to_binary
(
input [WORD_WIDTH-1:0] gray
);
integer i;
reg [WORD_WIDTH-1:0] binary;
begin
binary[WORD_WIDTH-1] = gray[WORD_WIDTH-1];
for(i=WORD_WIDTH-2; i >= 0; i=i-1) begin
binary[i] = binary[i+1] ^ gray[i];
end
gray_to_binary = binary;
end
endfunction
always@(*) begin
binary_out = gray_to_binary(gray_in);
end
endmodule