Verilog设计,找到第一个1的位置

输入一个多bit的数,找到第一个1的位置

module pos #(parameter N=9)(
             input   clk,rst_n,
             input   [N-1:0] din,
            output   [N-1:0] first_pos,
            output   [N-1:0] first_pos_out,
            output   [N-1:0] last_pos,
            output   [N-1:0] last_pos_out
         );
 
         assign first_pos = din & (~(din-1));
         // assign first_pos_out = $clog2(first_pos); // 不可综合
        integer i;
		reg [$clog2(DATA_WIDTH)-1:0] idx;
		wire [DATA_WIDTH-1:0] din;
		always @(*)begin
    		idx = 'd0;
    		// 行为级描述
    		for(i=0;i<DATA_WIDTH;i=i+1)begin
        		if(first_pos [i])
            		idx = i;
    		end
		end
		// 从MSB到LSB,第一个1出现的位置
		assign first_pos_out = idx;
 
         genvar i,j;
         reg [N-1:0] tmp;
         reg [N-1:0] tmp_pos;
 		
 		// 从LSB到MSB第一个1出现的位置
         generate 
             for(i=0;i<N;i=i+1)begin
                 assign tmp[N-1-i] = din[i];
             end
         endgenerate
 
         assign tmp_pos = tmp & (~(tmp-1));
 
         generate 
             for(j=0;j<N;j=j+1)begin
                 assign last_pos[N-1-j] = tmp_pos[j];
             end
         endgenerate
 
         // assign last_pos_out = $clog2(last_pos); // 不可综合
 		
 
endmodule

独热码转二进制码

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

参考https://blog.csdn.net/u013749478/article/details/128564521

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值