//========================================================================================================================================================
// Company:
// Engineer:
// Create Date:
// Design Name:
// Module Name:
// Target Device:
// Tool versions:
// Description: 二进制到格林码转换、格林码到二进制转换
// Dependencies:
// Revision:
// Additional Comments:
//========================================================================================================================================================
module code_transfer#(parameter DATA_WIDTH = 8) (
input sys_clk, //系统时钟
input reset_n, //复位信号
input[DATA_WIDTH-1:0] gray_code_in, //格林码输入
input gray_code_in_valid, //二进制格林码输入有效标志
input[DATA_WIDTH-1:0] binary_code_in, //二进制输入
input binary_code_in_valid, //二进制有效输入
output[DATA_WIDTH-1:0] gray_code_out, //格林码输出
output gray_code_out_valid, //二进制格林码输出有效标志
output[DATA_WIDTH-1:0] binary_code_out, //二进制输出
output binary_code_out_valid //二进制有效输出
);
//========================================================================================================================================================
//内部变量声明
//========================================================================================================================================================
reg[DATA_WIDTH-1:0] binary2gray_code_r;
reg[DATA_WIDTH-1:0] gray2binary_code_r;
reg binary2gray_code_valid_r;
reg gray2binary_code_valid_r;
//========================================================================================================================================================
//二进制码到格林码的转换
//function:graycode=binarycode^(binarycode>>1)
//========================================================================================================================================================
always @(posedge sys_clk)
begin
if (!reset_n)
binary2gray_code_r <= 'd0;
else if (binary_code_in_valid)
binary2gray_code_r <= binary_code_in ^ (binary_code_in >> 1);
else
binary2gray_code_r <= binary2gray_code_r;
end
always @(posedge sys_clk)
begin
if (!reset_n)
binary2gray_code_valid_r <= 'd0;
else if (binary_code_in_valid)
binary2gray_code_valid_r <= 1'b1;
else
binary2gray_code_valid_r <= 1'b0;
end
//========================================================================================================================================================
//格林码到二进制码转换
//bianrycod[i]=^gray_code[DATA_WIDTH-1:i];
//========================================================================================================================================================
generate
genvar num;
for (num = 0; num<=DATA_WIDTH - 1; num = num + 1)
begin
always @(posedge sys_clk)
begin
if (!reset_n)
gray2binary_code_r[num] <= 1'b0;
else if (gray_code_in_valid)
gray2binary_code_r[num] <= ^(gray_code_in >> num);
else
gray2binary_code_r[num] <= gray2binary_code_r[num];
end
end
endgenerate
always @(posedge sys_clk)
begin
if (!reset_n)
gray2binary_code_valid_r <= 1'b0;
else if (gray_code_in_valid)
gray2binary_code_valid_r <= 1'b1;
else
gray2binary_code_valid_r <= 1'b0;
end
//========================================================================================================================================================
//输出信号连接
//========================================================================================================================================================
assign binary_code_out = gray2binary_code_r;
assign binary_code_out_valid = gray2binary_code_valid_r;
assign gray_code_out = binary2gray_code_r;
assign gray_code_out_valid = binary2gray_code_valid_r;
endmodule
二进制,格雷码
最新推荐文章于 2023-09-13 15:05:51 发布