最好的独热码与二进制转换
独热码与二进制转换
- 简单的独热码转换
- 代码1
- 代码2
- 代码3
- 参数化设计
- 仿真效果图
- 尝试
简单的独热码转换
代码1
`timescale 1ns / 1ns
module test_q #(parameter ONE_HOT_WIDTH = 4)(input[ONE_HOT_WIDTH-1 : 0] one_hot_code,output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code);always_comb begin unique case(1'b1)one_hot_code[0]:bin_code = 'h0;one_hot_code[1]:bin_code = 'h1;one_hot_code[2]:bin_code = 'h2;one_hot_code[3]:bin_code = 'h3;default:bin_code = 'h0;endcase end
endmodule
综合结果

提高位宽
`timescale 1ns / 1ns
module test_q #(parameter ONE_HOT_WIDTH = 8)(input[ONE_HOT_WIDTH-1 : 0] one_hot_code,output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code);always_comb begin unique case(1'b1)one_hot_code[0]:bin_code = 'h0;one_hot_code[1]:bin_code = 'h1;one_hot_code[2]:bin_code = 'h2;one_hot_code[3]:bin_code = 'h3;one_hot_code[4]:bin_code = 'h4;one_hot_code[5]:bin_code = 'h5;one_hot_code[6]:bin_code = 'h6;one_hot_code[7]:bin_code = 'h7;default:bin_code = 'h0;endcase end
endmodule
综合结果

位宽对综合结果无影响
代码2
`timescale 1ns / 1ns
module test_q #(parameter ONE_HOT_WIDTH = 4)(input[ONE_HOT_WIDTH-1 : 0] one_hot_code,output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code);always_comb begin unique case(one_hot_code)4'b0001:bin_code = 'h0;4'b0010:bin_code = 'h1;4'b0100:bin_code = 'h2;4'b1000:bin_code = 'h3;default:bin_code = 'h0;endcase end
endmodule
综合结果

代码3
`timescale 1ns / 1ns
module test_q #(parameter ONE_HOT_WIDTH = 8)(input[ONE_HOT_WIDTH-1 : 0] one_hot_code,output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code);logic [$clog2(ONE_HOT_WIDTH)-1 : 0] temp [ONE_HOT_WIDTH-1 : 0];genvar i;generatefor(i = 0; i < ONE_HOT_WIDTH; i = i+1)beginassign temp[i] = one_hot_code[i]? i:'b0;endendgenerateassign bin_code = temp[0] | temp[1] | temp[2] | temp[3] | temp[4] | temp[5] | temp[6] | temp[7];endmodule
综合结果

参数化设计
`timescale 1ns / 1ns
module test_q #(parameter ONE_HOT_WIDTH = 8)(input[ONE_HOT_WIDTH-1 : 0] one_hot_code,output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code);logic [$clog2(ONE_HOT_WIDTH)-1 : 0] temp1 [ONE_HOT_WIDTH-1 : 0];logic [ONE_HOT_WIDTH-1 : 0] temp2 [$clog2(ONE_HOT_WIDTH)-1 : 0];genvar i,j,k;generatefor(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin : temp1_loopassign temp1[i] = one_hot_code[i]? i:'b0;endendgenerategeneratefor(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin : temp_ch1for(j = 0; j < $clog2(ONE_HOT_WIDTH); j = j+1)begin : temp_ch2assign temp2[j][i] = temp1[i][j];endendendgenerategeneratefor(j = 0; j < $clog2(ONE_HOT_WIDTH); j = j+1)begin : temp2_loopassign bin_code[j] = |temp2[j];endendgenerateendmodule

这种方法应该是趋于完美的写法,资源耗费较少
仿真效果图


尝试

根据推断,独热码转换应该是如下情况
`timescale 1ns / 1ns
module test_q #(parameter ONE_HOT_WIDTH = 8)(input[ONE_HOT_WIDTH-1 : 0] one_hot_code,output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code);//从1开始间隔1位bin_code[0] = one_hot_code[1] | one_hot_code[3] | one_hot_code[5] | one_hot_code[7];//从2开始间隔2位 bin_code[1] = one_hot_code[2] | one_hot_code[3] | one_hot_code[6] | one_hot_code[7];//从4开始间隔4位 bin_code[2] = one_hot_code[4] | one_hot_code[5] | one_hot_code[6] | one_hot_code[7];//从8开始间隔8位 //bin_code[3] = one_hot_code[4] | one_hot_code[5] | one_hot_code[6] | one_hot_code[7];endmodule
如何参数化设计,目前没想到方法;
如果各位有更好的方法可以直接留言
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
