简单的独热码转换
代码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;
generate
for(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin
assign temp[i] = one_hot_code[i]? i:'b0;
end
endgenerate
assign 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;
generate
for(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin : temp1_loop
assign temp1[i] = one_hot_code[i]? i:'b0;
end
endgenerate
generate
for(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin : temp_ch1
for(j = 0; j < $clog2(ONE_HOT_WIDTH); j = j+1)begin : temp_ch2
assign temp2[j][i] = temp1[i][j];
end
end
endgenerate
generate
for(j = 0; j < $clog2(ONE_HOT_WIDTH); j = j+1)begin : temp2_loop
assign bin_code[j] = |temp2[j];
end
endgenerate
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
);
//从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
如何参数化设计,目前没想到方法;文章来源:https://www.toymoban.com/news/detail-602733.html
如果各位有更好的方法可以直接留言文章来源地址https://www.toymoban.com/news/detail-602733.html
到了这里,关于最好的独热码与二进制转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!