首页 > 其他分享 >寻找第一个1

寻找第一个1

时间:2024-05-10 11:01:24浏览次数:22  
标签:din 第一个 complement 补码 寻找 WIDTH onehot assign

输入一个向量,如何从LSB或者MSB或者反过来找出第一个出现1的位置并生成独热码?这个问题碰到好多次了,今天总结一下。

这个电路有点类似于一个优先编码器(所以该电路就是固定优先级的仲裁器),例如对于一个4bit位宽的向量来说,其真值表如下

Input Output
0001 0001
xx10 0010
x100 0100
1000 1000

上述真值表的Verilog电路实现如下

module OneHot(
    input [3:0] din,
    output [3:0] onehot
);
    reg [3:0] onehot_w;
    always@(*)begin
        casex(din)
            4'b0001:onehot_w = 4'b0001;
            4'b001x:onehot_w = 4'b0010;
            4'b01xx:onehot_w = 4'b0100;
            4'b1000:onehot_w = 4'b1000;
        endcase
    end
    assign onehot = onehot_w;
endmodule

第二种方法是一个比较巧妙的方法,并且进行参数化实现也比较方便。首先有这样一种求一个数的补码的方法:从LSB到MSB,找到第一个为1的位置,该位保持不变,之后一直到MSB所有的位都取反,即可得到该数的补码。稍加思索就可以发现,既然可以用这种方法找到补码,那换句话说补码就一定符合这个规则,那么补码就可以作为mask来找到第一个1出现的地方了:因为补码是从第一个1之后所有的位都取反,那么将原数与补码按位与,就得到了一个独热码,并且该独热码1出现的位置就是原数第一个1出现的位置。

module onehot(
    parameter WIDTH = 8
)(
    input  [WIDTH-1:0] din,
    output [WIDTH-1:0] onehot
);
    wire [WIDTH-1:0] complement_w = ~(din-1);
    assign onehot = din&complement_w;
endmodule

再添加一个参数用于调整寻找的方向,最终的设计如下

module onehot(
    parameter WIDTH = 8,
    parameter DIRECTION = 0
)(
    input  [WIDTH-1:0] din,
    output [WIDTH-1:0] onehot
);
    wire [WIDTH-1:0] din_w;
    generate
        if(DIRECTION==0)begin:gen_lsb_msb
            assign din_w = din;
        end
        else begin:gen_msb_lsb
            assign din_w = din[0:7];
        end
    endgenerate

    wire [WIDTH-1:0] complement_w = ~(din_w-1);
    assign onehot = din_w&complement_w;
endmodule

标签:din,第一个,complement,补码,寻找,WIDTH,onehot,assign
From: https://www.cnblogs.com/lzhj/p/18183845

相关文章

  • 第一个mybatis程序
    注意与之前JDBC的区别,简化在哪里准备工作数据库,表的创建:创建一个名为mybatis的数据库,在其中创建user表,字段为is,name,pwd项目的准备:新建一个普通的maven项目作为父项目,删除src目录,在pom文件中导入必要的依赖(mysql-connector-java,mybatis,junit),创建第一个子项目,选择父项目......
  • 【每日一题】寻找两个正序数组的中位数
    4.寻找两个正序数组的中位数给定两个大小分别为m和n的正序(从小到大)数组 nums1和 nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例......
  • 153. 寻找旋转排序数组中的最小值
    已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次的结果......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......
  • 对于习惯使用ftp传输的企业,如何寻找最佳的替代方案?
    FTP协议广泛应用各行业的文件传输场景中,对于很多企业而言,由于FTP传输应用获取门槛低、使用普遍,因此,有较为稳定的FTP使用习惯,但即便如此,也不得不面对,FTP应用存在着严重缺陷:  传输效率问题:FTP协议作为最早的互联网文件传输协议,虽然解决了传输协议有无的问题,但却在传输性能上未......
  • Hello world! 记我的第一个随笔
    Hello,大家好啊,这是我在博客园写的第一个随笔,之前基本上都是在csdn和github上进行写东西的,最近突然想建立一个自己的博客,这样的话就可以写一点除了技术和经验以外的其他杂事了。把这个当是一个记事本吧,有当作一个交朋友的途径,维护好自己的小博客也是很有成就感的捏( ̄▽ ̄)*欢迎大家和......
  • 二叉树进阶:二叉搜索树、平衡二叉树、KD树(实现KNN算法的快速寻找k个邻居)
    二叉搜索树二叉搜索树又称为二叉排序树、二叉查找树。请记住,本篇所介绍的所有树,都是二叉搜索树,也就是说都用到了二分查找的思想。二叉搜索树的特征:每个结点的左结点都小于结点本身,右结点都大于结点本身。用中序遍历来遍历一棵二叉搜索树,结果必然是有序的。时间复杂度很低......
  • 我第一个开源AI小产品-video2blog即将正式发布
    前言首先它是为了解决我自己的个人问题。不管能不能帮到你,或者对于看到的你是否有点利用价值,也没太大的关系,最起码你可以来看看我开发小产品的整个过程。一段时间以来,我开始通过youtube平台来获取一些知识,或者打发早晚上下班坐地铁的时间。主要是我早晚通勤时间过长,差不多都是一......
  • 获取给定区域内的符合颜色值的第一个和最后一个坐标
    fromPILimportImageGrabimportpyautoguiimporttimeimportpyperclipimportnumpydef获取给定区域内的符合颜色值的第一个和最后一个坐标(left_x:int,left_y:int,right_x:int,right_y:int,color_r:int,color_g:int,color_b:int)->list:'''注意,本函数直接截取......
  • 我的第一个套接字通信(基本多线程)....
    前排叠个甲:为什么现在才学习到Linux套接字???我的回答是:大一玩了一年,大二开始接触C++,其中呢,大二上学习完了Qt,大二下才开始接触Linux,而在这期间,反复阅读了C++的特性源码....所以。回归正题:直接放代码,没什么好说的,就那一套流程:服务器端的代码:#include<stdio.h>#include<stdlib.h>......