在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 774|回复: 5

[原创] 一种独热码检测电路

[复制链接]
发表于 2024-5-9 22:41:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
先挖坑
 楼主| 发表于 2024-5-10 10:51:56 | 显示全部楼层
module onehot_unit_2(
input                        i0                ,
input                        i1                ,
output    is_onehot ,// 1 means already has onehot, so the others must be 0
output          not_onehot           // 1 means 100% not onehot, noneed to check others
);

wire i0_inv;        not u_i0_inv (i0_inv,i0);
wire i0_and;  and u_i0_and (i0_and,i0_inv,i1);

wire i1_inv;        not u_i1_inv (i1_inv,i1);
wire i1_and;  and u_i1_and (i1_and,i1_inv,i0);

or u_is_onehot(is_onehot,i0_and,i1_and);

and u_not_onehot(not_onehot,i0,i1);

endmodule

module onehot_unit_2plus(
input                        i_cur,
input     i_is_onehot_pre ,
input     i_not_onehot_pre,
output    o_is_onehot_cur ,
output          o_not_onehot          
);

wire tmp_is_onehot; wire tmp_not_onehot;
onehot_unit_2 u_unit2(.i0(i_is_onehot_pre),.i1(i_cur),.is_onehot(o_is_onehot_cur),.not_onehot(tmp_not_onehot));

or u_not_onehot(o_not_onehot,i_not_onehot_pre,tmp_not_onehot);

);
endmodule


module onehot_unit #(parameter N=10)(
input [N-1:0] din      ,
output        is_onehot
);

wire [N-2:0]tmp_din;
genvar i;
for (i=0;i<N-1;  i=i+1)begin
        if(i==0)begin
                onehot_unit_2plus U_unit0(
                        .i_cur                                          (din[0]                                                        ),
                        .i_is_onehot_pre  (1'b0                                                   ),
                        .i_not_onehot_pre (1'b0                                                   ),
                        .o_is_onehot_cur  (tmp_din[0]                                        ),
                        .o_not_onehot            (tmp_not_onehot[0]        )
                );
        end
        else begin
                onehot_unit_2plus U_unitN(
                        .i_cur                                          (din[i]                                                        ),
                        .i_is_onehot_pre  (tmp_din[i-1]                   ),
                        .i_not_onehot_pre (tmp_not_onehot[i-1]),
                        .o_is_onehot_cur  (tmp_din[i]                                        ),
                        .o_not_onehot            (tmp_not_onehot[i]        )
                );
        end
end

assign is_onehot = ~tmp_not_onehot[N-1] && tmp_din[N-1];

endmodule
 楼主| 发表于 2024-5-11 16:57:25 | 显示全部楼层
// 单个最小实例单元
module onehot_unit_2(
input          i0                 ,
input          i1                 ,
output is_onehot ,// 1 means already has onehot, so the others must be 0
output not_onehot // 1 means 100% not onehot, noneed to check others
);

wire i0_inv;    not u_i0_inv (i0_inv,i0);
wire i0_and;  and u_i0_and (i0_and,i0_inv,i1);

wire i1_inv;   not u_i1_inv (i1_inv,i1);
wire i1_and;  and u_i1_and (i1_and,i1_inv,i0);

or u_is_onehot(is_onehot,i0_and,i1_and);

and u_not_onehot(not_onehot,i0,i1);

endmodule

// 可级联的实例单元
module onehot_unit_2plus(
input            i_cur,
input     i_is_onehot_pre ,
input     i_not_onehot_pre,
output   o_is_onehot_cur ,
output   o_not_onehot          
);

wire tmp_is_onehot; wire tmp_not_onehot;
// 调用单个最小实例单元
onehot_unit_2 u_unit2(.i0(i_is_onehot_pre),.i1(i_cur),.is_onehot(o_is_onehot_cur),.not_onehot(tmp_not_onehot));

or u_not_onehot(o_not_onehot,i_not_onehot_pre,tmp_not_onehot);

);
endmodule


module onehot_unit #(parameter N=10)(
input [N-1:0] din      ,
output         is_onehot
);

//可以任意位数调用实例单元,但是要求N>=2,
//对于1位输入,独热码的讨论没有实际意义
wire [N-2:0]tmp_din;
genvar i;
for (i=0;i<N-1;  i=i+1)begin
        //考虑第0级的调用,它的pre级都是0
        if(i==0)begin
                onehot_unit_2plus U_unit0(
                        .i_cur                   (din[0]                                ),
                        .i_is_onehot_pre    (1'b0                                   ),
                        .i_not_onehot_pre (1'b0                                   ),
                        .o_is_onehot_cur   (tmp_din[0]                        ),
                        .o_not_onehot           (tmp_not_onehot[0]        )
                );
        end
        else begin
        //后面的级数可以递归串联调用
                onehot_unit_2plus U_unitN(
                        .i_cur                  (din[i]                                ),
                        .i_is_onehot_pre   (tmp_din[i-1]                   ),
                        .i_not_onehot_pre (tmp_not_onehot[i-1]      ),
                        .o_is_onehot_cur   (tmp_din[i]                        ),
                        .o_not_onehot           (tmp_not_onehot[i]        )
                );
        end
end

//最后考虑只有tmp_not_onehot信号不生效,且最新的onehot即tmp_din[N-1]生效后,才
//认为是真实的one hot
assign is_onehot = ~tmp_not_onehot[N-1] && tmp_din[N-1];

endmodule

onehot_dct.txt

1.92 KB, 下载次数: 1 , 下载积分: 资产 -2 信元, 下载支出 2 信元

售价: 1 信元资产  [记录]

onehot

 楼主| 发表于 2024-5-12 10:25:32 | 显示全部楼层
// 单个最小实例单元
module onehot_unit_2(
input     i0         ,
input     i1        ,
output    is_onehot ,// 1 means already has onehot, so the others must be 0
output    not_onehot // 1 means 100% not onehot, noneed to check others
);

wire i0_inv;  not u_i0_inv (i0_inv,i0);
wire i0_and;  and u_i0_and (i0_and,i0_inv,i1);

wire i1_inv;  not u_i1_inv (i1_inv,i1);
wire i1_and;  and u_i1_and (i1_and,i1_inv,i0);

or u_is_onehot(is_onehot,i0_and,i1_and);

and u_not_onehot(not_onehot,i0,i1);

endmodule

// 可级联的实例单元
module onehot_unit_2plus(
input     i_cur           ,
input     i_is_onehot_pre ,
input     i_not_onehot_pre,
output    o_is_onehot_cur ,
output    o_not_onehot     
);

wire tmp_is_onehot; wire tmp_not_onehot;
// 调用单个最小实例单元
onehot_unit_2 u_unit2(.i0(i_is_onehot_pre),.i1(i_cur),.is_onehot(o_is_onehot_cur),.not_onehot(tmp_not_onehot));

or u_not_onehot(o_not_onehot,i_not_onehot_pre,tmp_not_onehot);

);
endmodule


module onehot_unit #(parameter N=10)(
input [N-1:0] din      ,
output        is_onehot
);

//可以任意位数调用实例单元,但是要求N>=2,
//对于1位输入,独热码的讨论没有实际意义
wire [N-2:0]tmp_din;
genvar i;
for (i=0;i<N-1;  i=i+1)begin
  //考虑第0级的调用,它的pre级都是0
  if(i==0)begin
    onehot_unit_2plus U_unit0(
      .i_cur            (din[0]             ),
      .i_is_onehot_pre  (1'b0               ),
      .i_not_onehot_pre (1'b0               ),
      .o_is_onehot_cur  (tmp_din[0]         ),
      .o_not_onehot     (tmp_not_onehot[0]  )
    );
  end
  else begin
  //后面的级数可以递归串联调用
    onehot_unit_2plus U_unitN(
      .i_cur            (din[i]              ),
      .i_is_onehot_pre  (tmp_din[i-1]        ),
      .i_not_onehot_pre (tmp_not_onehot[i-1] ),
      .o_is_onehot_cur  (tmp_din[i]          ),
      .o_not_onehot      (tmp_not_onehot[i]  )
    );
  end
end

//最后考虑只有tmp_not_onehot信号不生效,且最新的onehot即tmp_din[N-1]生效后,才
//认为是真实的one hot
assign is_onehot = ~tmp_not_onehot[N-1] && tmp_din[N-1];

endmodule
 楼主| 发表于 2024-5-12 10:27:32 | 显示全部楼层
// 单个最小实例单元
module onehot_unit_2(
input     i0             ,
input     i1             ,
output    is_onehot ,// 1 means already has onehot, so the others must be 0
output    not_onehot // 1 means 100% not onehot, noneed to check others
);

wire i0_inv;    not u_i0_inv (i0_inv,i0);
wire i0_and;  and u_i0_and (i0_and,i0_inv,i1);

wire i1_inv;    not u_i1_inv (i1_inv,i1);
wire i1_and;  and u_i1_and (i1_and,i1_inv,i0);

or u_is_onehot(is_onehot,i0_and,i1_and);

and u_not_onehot(not_onehot,i0,i1);

endmodule

// 可级联的实例单元
module onehot_unit_2plus(
input     i_cur                ,
input     i_is_onehot_pre ,
input     i_not_onehot_pre,
output   o_is_onehot_cur ,
output   o_not_onehot     
);

wire tmp_is_onehot; wire tmp_not_onehot;
// 调用单个最小实例单元
onehot_unit_2 u_unit2(.i0(i_is_onehot_pre),.i1(i_cur),.is_onehot(o_is_onehot_cur),.not_onehot(tmp_not_onehot));

or u_not_onehot(o_not_onehot,i_not_onehot_pre,tmp_not_onehot);

);
endmodule


module onehot_unit #(parameter N=10)(
input [N-1:0] din,
output  is_onehot
);

//可以任意位数调用实例单元,但是要求N>=2,
//对于1位输入,独热码的讨论没有实际意义
wire [N-2:0]tmp_din;
genvar i;
for (i=0;i<N-1;  i=i+1)begin
  //考虑第0级的调用,它的pre级都是0
  if(i==0)begin
    onehot_unit_2plus U_unit0(
      .i_cur(din[0]),
      .i_is_onehot_pre(1'b0),
      .i_not_onehot_pre(1'b0),
      .o_is_onehot_cur(tmp_din[0]),
      .o_not_onehot(tmp_not_onehot[0])
    );
  end
  else begin
  //后面的级数可以递归串联调用
    onehot_unit_2plus U_unitN(
      .i_cur(din[i]),
      .i_is_onehot_pre(tmp_din[i-1]),
      .i_not_onehot_pre(tmp_not_onehot[i-1]),
      .o_is_onehot_cur(tmp_din[i] ),
      .o_not_onehot(tmp_not_onehot[i])
    );
  end
end

//最后考虑只有tmp_not_onehot信号不生效,且最新的onehot即tmp_din[N-1]生效后,才
//认为是真实的one hot
assign is_onehot = ~tmp_not_onehot[N-1] && tmp_din[N-1];

endmodule
发表于 2024-5-16 09:19:45 | 显示全部楼层
感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 19:10 , Processed in 0.020382 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表