找到序列最高位的1和最高位的0并输出位置

这篇具有很好参考价值的文章主要介绍了找到序列最高位的1和最高位的0并输出位置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言:

        该题为睿思芯科笔试题,笔试时长20分钟。

题目描述

        接口如下:

module first_1_and_0#(
    parameter WIDTH = 8
)(
    input   [WIDTH-1:0]         data_in ,
    input                       target  ,
    output                      exist   ,
    output  [$clog2(WIDTH):0]   pos
);

         target可以等于1,也可以等于0。当target等于1时,检测data_in最高位的1,并输出其位置,位置计数从0开始。举例:当target=1时,序列4'b0101,存在1,所以输出exist = 1,检测1的位置pos=1。


题目解析

        找到序列第一个1的位置,可以参考笔者本篇博客:不用循环和分治,仅用“按位”操作,找到序列第一个1和最后一个1

        找到第一个0的位置,可以利用同样的思想。首先给pre最高位赋1,然后pre的低7位等于pre的高7位和data的高7位相与,这里可能会产生一个疑问,明明pre的低7位都没赋值,都是x,怎么能直接取高7位来和data做或,那输出不都是x吗?

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

pre[7]=1

pre[6]=pre[7] & data[7]=1

pre[5]=pre[6] & data[6]=1

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

pre[3]=pre[4] & data[4]=0

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

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

data=8'b1110_1101

pre  =8'b1111_0000

这时候,我们再利用性质:一个数和它自身的补码相与,结果为最低位的1。

找到pre的最低位的1:pre & ~(pre - 1)=8'b0001_0000,这时候one_hot码1的位置就是data中最高位0的位置了。

利用(WIDTH-$clog2(one_hot_0)-1)就可以输出0的position了,代码如下:


代码

module first_1_and_0#(
    parameter WIDTH = 8
)(
    input   [WIDTH-1:0]         data_in ,
    input                       target  ,
    output                      exist   ,
    output  [$clog2(WIDTH):0]   pos
);

// signal defination
wire [WIDTH-1:0] find_1_pre,find_0_pre;
wire [WIDTH-1:0] one_hot_1,one_hot_0;
wire             exist_1,exist_0;
wire [$clog2(WIDTH):0] pos_0,pos_1; 

//find first 1
assign find_1_pre[WIDTH-1] = 0;
assign find_1_pre[WIDTH-2:0] = find_1_pre[WIDTH-1:1] | data_in[WIDTH-1:1];

assign one_hot_1 = data_in & (~find_1_pre);
assign exist_1 = |data_in;
assign  pos_1 = exist_1 ? (WIDTH-$clog2(one_hot_1)-1): 0;

//find first 0
assign find_0_pre[WIDTH-1] = 1;
assign find_0_pre[WIDTH-2:0] = find_0_pre[WIDTH-1:1] & data_in[WIDTH-1:1];

assign one_hot_0 = find_0_pre & ~(find_0_pre-1);
assign exist_0 = !(&data_in);
assign pos_0 = exist_0 ? (WIDTH-$clog2(one_hot_0)-1): 0;

//output 
assign exist = target ? exist_1 : exist_0;
assign pos   = target ? pos_1   : pos_0  ;

endmodule

testbench

module tb#(
    parameter WIDTH = 8
)();

reg target;
reg [WIDTH-1:0] data_in;
wire exist;
wire [$clog2(WIDTH):0] pos;

initial begin 
    target  =  1'b0;
    data_in =  8'd0;
#10
    target  =  1'b1;
#10
    data_in =  8'b11111111;
    target  =  1'b1;
#10
    target  =  1'b0;
    data_in =  8'b10110110;
    target  =  1'b0;
#10
    target  =  1'b1;
#10
    data_in =  8'b00110101;
    target  =  1'b0;
#10
    target  =  1'b1;
#10
    $finish();
end

first_1_and_0 u_first(
    .target (target     ),
    .data_in(data_in    ),
    .exist  (exist      ),
    .pos    (pos        )
);

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

波形图

找到序列最高位的1和最高位的0并输出位置,数字IC手撕代码,fpga开发,数字IC,手撕代码,笔试真题文章来源地址https://www.toymoban.com/news/detail-628881.html

到了这里,关于找到序列最高位的1和最高位的0并输出位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2023年04月08日
    浏览(27)
  • 数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

     前言:         本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。 目录如下: 1.数字IC手撕代码-分频器(任意偶数分频) 2.数字IC手撕代码-分频器(任意奇数分频) 3.数字IC手撕代码-分

    2024年02月02日
    浏览(31)
  • 【数据结构和算法】找到最高海拔

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(40)
  • 【序列信号发生器(IC)】

      在数字信号传输的过程中,有时会需要产生一组特定的串行数字信号,产生这种序列信号的电路称为序列信号发生器。 通过数字信号设计与Verilog代码理解序列信号发生器;下面介绍几种Verilog编程中常用的方法。 1、环形移位寄存器   例如需要发出一组100111的一组6位序

    2024年02月05日
    浏览(26)
  • 使用JavaScript将数字格式化成千分位的n种方法

    1,使用数组方法: 1) 数字转字符串,字符串按照小数点.分割 2) 整数部分拆分成字符串数组,并倒叙 3) 遍历, 按照每三位添加逗号,号 4) 拼接整数部分+小数部分 2.使用字符串的substring截取 1) 数字转字符串,并按照小数点’.’分割 2) 整数部分对3取模,获取余数, 获得substring(0, 余数)的

    2024年02月04日
    浏览(38)
  • verilog手撕代码3——序列检测和序列发生器

    2023.4.25 2023.4.26 学习打卡,天气转晴 1.1.1 序列缓存对比/移位寄存器法 把输入的数据缓存到数组,然后与目标进行对比 例1 :检测序列 0111_0001 ,满足序列输出为1 例2 :检测序列 1101 ,用移位寄存器实现 例3 : 含有无关项的序列检测 检测序列 001_xxx_110 ,中间三位不关心,这

    2024年02月05日
    浏览(28)
  • 数字IC后端设计如何从零基础快速入门?(内附数字IC后端学习视频)

    数字IC后端工程师主要职责是把数字IC前端工程师写的逻辑功能RTL转变成物理实际连线GDS版图。这个过程的本质是基于一定的时序约束和物理约束将设计的逻辑功能等价转变成物理连接。因为这个GDS最后是要提交给foundary进行芯片加工制作的,光刻机无法识别逻辑功能,它只认

    2024年01月20日
    浏览(32)
  • Verilog设计_找到1的位置

    在输入数据中找到1的位置:找到第一个1的位置和最后一个1的位置。 给出了两种设计方法:第一种使用二分法,但是有一定局限性;第二种则是通用的参数化设计方法。 目录 一、二分法实现 二、参数化实现 输入一个数据,输出第一个1所在的位置和最后一个1所在的位置。

    2024年02月10日
    浏览(27)
  • 模拟IC与数字IC设计该怎么选?哪个岗位薪资高?

    很多同学想要入行IC,但不知道数字和模拟方向怎么选? 如果没有亲身体会过模拟设计,并有发自内心的自信或者兴趣,一般不看好纯小白去学模拟电路设计。 模拟设计想做好,没有数学功底,没有电路分析的功底,很难会有出彩的机会。就连零极点分析都搞不清、基尔霍夫

    2024年02月03日
    浏览(52)
  • 【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)

    声明:案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。 Verilog线性序列机点灯案例(一) Verilog线性序列机点灯案例(二) Verilog线性序列机点灯案例(三) Verilog线性序列机点灯案例(四) 使用8个拨码开关控制一个LED灯,每个拨码开关

    2024年04月14日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包