加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

【手撕代码】平头哥面试,找出一组数中第一个1的位置或统计1的个数

2022/04/18
2197
阅读需 3 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在秋招中,很多求职者都遇到过关于找1的手撕代码题,其中平头哥面试就会让面试者手撕这种类型的题,其中出题套路大多为从最高位/最低位开始找到1个8bit/16bit数的第一个位置,统计8bit/16bit数中1的个数。

大家不妨先想想自己遇到这个问题会怎么写这个代码?下面小编给出几种思路:

1、从最高位开始找出一个8bit数的第一个1的位置(二分法)(1)设计代码

module find_first1_h2L(input [7:0]x,output wire [2:0]y    );
wire [3:0]data_4;wire [1:0]data_2;
assign y[2]=|x[7:4];assign data_4=y[2]?x[7:4]:x[3:0];assign y[1]=|data_4[3:2];assign data_2=y[1]?data_4[3:2]:data_4[1:0];assign y[0]=data_2[1];  
endmodule

(2)仿真代码

module find_first1_h2L_tst();reg [7:0]x;wire [2:0]y;
find_first1_h2L U_find_first1_h2L(.x(x),.y(y));
initial begin
x=8'b00101110;#20 x=8'b01100000;#20 x=8'b00000000;#20 x=8'b00000001;
end
endmodule

2、输入[15:0]data_in中,从低位开始找到第一个1出现的位置。

(1)设计代码

module find_one(input clk,input rst_n,input [15:0]data_in,input data_in_valid,output reg[3:0]position    );wire [15:0]data_in_r;assign   data_in_r=~(data_in-1)&data_in;always@(posedge clk)if(!rst_n)  position<=0;else begincase(data_in_r)  16'b0000000000000001:position<=4'd0;  16'b0000000000000010:position<=4'd1;  16'b0000000000000100:position<=4'd2;  16'b0000000000001000:position<=4'd3;    16'b0000000000010000:position<=4'd4;  16'b0000000000100000:position<=4'd5;    16'b0000000001000000:position<=4'd6;  16'b0000000010000000:position<=4'd7;      16'b0000000100000000:position<=4'd8;  16'b0000001000000000:position<=4'd9;  16'b0000010000000000:position<=4'd10;  16'b0000100000000000:position<=4'd11;    16'b0001000000000000:position<=4'd12;  16'b0010000000000000:position<=4'd13;    16'b0100000000000000:position<=4'd14;  16'b1000000000000000:position<=4'd15;      default:position<=0;  endcase  end  endmodule

(2)仿真代码

module find_one_tst();reg       clk     ;reg       rst_n   ;reg [15:0]data_in ;reg data_in_valid;wire[3:0] position;
find_one U_find_one(.clk       (clk     ),.rst_n     (rst_n   ),.data_in   (data_in ),.data_in_valid(data_in_valid),.position  (position));
initial beginclk=1;rst_n=0;data_in=0;data_in_valid=0;#20 rst_n=1;data_in=16'd12;data_in_valid=1;#40 data_in=16'd9;#20 data_in_valid=0;endalways #10 clk=~clk;endmodule

 

大家也可以用二分法试试!

3、统计输入[7:0]data_in中1的个数,要求优化资源使用

(1)设计代码

module find_number1(  input [7:0]data,  output [7:0]number    );
  parameter m1 = 8'b01010101;  parameter m2 = 8'b00110011;  parameter m3 = 8'b00001111;
  wire [7:0]data1;  wire [7:0]data2;
  assign data1 = (data & m1) + ({data[0],data[7:1]} & m1);  assign data2 = (data1 & m2) + ({data1[1:0],data1[7:2]} & m2);  assign number = (data2 & m3) + ({data2[3:0],data2[7:4]} & m3);endmodule

(2)仿真代码

module tst_find_number1();  reg [7:0]data;  wire [7:0]number;  
  find_number1 u1(  .data  (data),  .number (number)    );
  initial begin  data = 8'b11010100;  end
endmodule

 

上面的解法并非最优,仅给大家提供一种思路。如果大家有更好的写法,欢迎与小编交流。大家对文章中的内容如果有疑问,欢迎留言,我们看到了会给大家解答的。也欢迎大家加入下面的qq群或者添加IC媛加入微信群进行讨论交流!

 

平头哥

平头哥

平头哥半导体有限公司于2018年9月宣布成立,是阿里巴巴集团的全资半导体芯片业务主体。平头哥拥有端云一体全栈产品系列,涵盖数据中心人工智能芯片、处理器IP授权等,实现芯片端到端设计链路全覆盖。

平头哥半导体有限公司于2018年9月宣布成立,是阿里巴巴集团的全资半导体芯片业务主体。平头哥拥有端云一体全栈产品系列,涵盖数据中心人工智能芯片、处理器IP授权等,实现芯片端到端设计链路全覆盖。收起

查看更多

相关推荐

电子产业图谱

公众号:IC媛; IC学姐,致力于分享数字IC知识 | 求职经验 | 职场生活 | 招聘信息,快乐学习,共同进步!