最好的独热码与二进制转换

简单的独热码转换

代码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

综合结果
通过qurtus ii查看综合后电路

代码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

如何参数化设计,目前没想到方法;

如果各位有更好的方法可以直接留言

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值