不用循环和分治,仅用“按位”操作,找到序列第一个1和最后一个1

找到序列第一个1

        找序列第一个1需要一点技巧,首先给pre最高位赋0,然后pre的低7位等于pre的高7位和data的高7位相或,这里可能会产生一个疑问,明明pre的低7位都没赋值,都是x,怎么能直接取高7位来和data做或,那输出不都是x吗?

        是这样的,pre[7]=0,在比较的时候,是1bit 1bit比较,因此组合逻辑会先计算pre[6]=pre[7]|data[7]。得到pre[6]的结果后,再计算pre[6]|data[6],以此类推。这个方法妙就妙在当算出1bit的pre为1时,后面的所有pre都为1,譬如data=8'b0010_1101

pre[7]=0

pre[6]=pre[7] | data[7]=0

pre[5]=pre[6] | data[6]=0

pre[4]=pre[5] | data[5]=1

pre[3]=pre[4] | data[4]=1

pre[2]=pre[1]=pre[0]=1

这样,再对pre进行按位取反的时候:

data=8'b0010_1101

~pre  =8'b1110_0000

(~pre) & data = 8'b0010_0000 

得到最高位的one_hot码,用这样的原理我们可以求得最高位的1,代码如下

代码

module find_first_1(
	input   [7:0]   data     ,
	output  [7:0]   one_hot
);
		
wire [7:0] pre;

assign pre[7] = 0;

assign pre[6:0] = pre[7:1] | data[7:1];

assign one_hot = data & ~pre;
	
endmodule

 testbench

module tb();

wire [7:0] one_hot;
reg [7:0] data;


initial begin
    repeat(10) #10 data = $random%255;
    #20 $finish();
end

initial begin
    $fsdbDumpfile("find_one.fsdb");
    $fsdbDumpvars(0);
end

find_first_1 u_find_first_1(
    .data       (data)      ,    
    .one_hot    (one_hot)
);

endmodule 

波形 


找到序列最后一个1

找序列最后一个1,就是用补码的性质,一个数和它的补码相与,得到最低位的1。

代码

module find_last_1(
	input   [7:0]   data     ,
	output  [7:0]   one_hot
);
		
assign one_hot = data & ~(data-1);
	
endmodule

testbench

module tb();

wire [7:0] one_hot;
reg [7:0] data;


initial begin
    repeat(10) #10 data = $random%255;
    #20 $finish();
end

initial begin
    $fsdbDumpfile("find_one.fsdb");
    $fsdbDumpvars(0);
end

find_last_1 u_find_last_1(
    .data       (data)      ,    
    .one_hot    (one_hot)
);

endmodule 

波形

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃葱的酸菜鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值