独热码介绍

独热码是一种二进制编码方式,它的特点是,用来编码这个数的N位bit中,有且只有一位是1,其余位全部为0。因为只有1位是1,所以叫做one-hot (对应的,还有一种编码方式是只有1位是0,其余位都是1,叫做one-cold)

状态机中使用独热码的好处
利用one-hot来编码状态机,好处就是一个flop就表示一个状态,用来判断状态机在哪一个状态的时候就只需要看第几个flop为1即可,而不需要像binary编码那样是所有flop在一起参与比较这样可以省下一点点逻辑的比较电路的延时,代价显而易见,用one-hot编码状态机需要的寄存器比binary编码要多,这就是一个典型的利用面积换性能的trade off。

独热码检测

题目要求:

给出一个多bit信号,判断该信号是否为读热码,如果是独热码,则输出为1,如果不是,则输出为0;

第一种方法
真值表卡诺图化简
这里以输入数据为4bit为例

很明显,在这个例子中,卡诺图并不能帮我们简化逻辑(为什么?),这里是因为相邻状态不会有挨着的1出现,所以化简不了。
最后的表达式其实都可以直接想到


Y = (A[0] & (!A[1]) & (!A[2]) & (!A[3])) |((!A[0]) & A[1] & (!A[2]) & (!A[3]))|((!A[0]) & (!A[1]) & A[2] & (!A[3]))|((!A[0]) & (!A[1]) & (!A[2]) & A[3]);

这个时候面试官可能会问你,需要多少个逻辑门。关于上面的表达式,假设我们有四输入的与门和四输入的或门,而且假设输入可以取反,那么我们就需要4个与门,1个或门,如下图所示:

但是这种方法有个显而易见的缺点,当输入信号bit数逐渐增加,卡诺图及其最后的表达式会越来越复杂。

第二种方法

利用for循环
其实有个很简单的思路,就是从独热码的定义出发:只有一位是1,其余位都是0。那么不管我输入信号有多少位,有一个性质是不变的 – 把这些位各自相加,最后的结果肯定得是1。那么我们就可以利用一个for循环,把每一位相加,最后再把最终的结果和1比较一下,如果是1,那就是独热码,如果不是1,那就是其他的数,非常直观吧?


function automatic logic is_onehot(input [WIDTH-1:0] sig);localparam SUM_WIDHT = $clog2(WIDTH) + 1;logic [SUM_WIDTH-1:0] sum;sum = '0;for(int i = 0; i < WIDHT; i++)sum = sum + sig[i];is_onehot = (sum == 1);
endfunction

这里面有个小点需要大家注意,SUM_WIDTH要用$clog2之后再加1,为什么呢?因为加入输入为4位信号,如果SUM_WIDTH要用clog2之后不加1的话,SUM_WIDTH的位宽为2bit,最大表达为11(3),而4位信号全为1时,sum应该为4,表达位宽不够。

这段code综合出来的电路是什么样的呢?

很明显,这样的电路可以达到设计的目的,但是并不是最优的,大家可以计算一下每个2bit full adder需要多少门,comparator需要多少门,再和之前利用卡诺图方法得出的最简电路比较一下。

那么有什么办法可以优化呢?当然如果你继续对上面的思路进行优化,比如第一级,第二级其实不需要一个2bit的adder, 而是可以将a[0],a[1]送到一个half adder里面,这样就可以替换掉前面两个2bit adder,还有half adder本质其实就是一个XOR gate等等…

第三种方法

其实思路来自一个稍微冷门但其实又非常常用的知识点:对一个binary number进行奇偶校验。

举例来说,对于一个4位的二进制数,我们对这4位奇偶校验,利用XOR门依次进行每一位,最后的结果如果是奇数个1那么4位XOR之后结果就是1,如果偶数个1那么结果就是0。看到了吗,我们要找的独热码其实是奇数个1的特殊情况,即只有1位是1。所以更加巧妙的方法就来自于这个按位XOR。

我们再来看几个例子,看能不能找出独热码按位XOR的特点。还是以4位为例,我们定义如下运算,把A相应按位XOR的结果记为P,其中P[0] = A[0], P[i] = A[i] ^ P[i-1]。(勘误:下图第一个P[0]应该是1)


我们可以看到一个什么规律?即对于独热码,我们得到的P会是这样一个数:如果独热码A的第i位为1,那么P的第i-1到第0位都是0,而第i位和更高位都是1。注意,这个规律只对独热码适用,大家可以试验一下其他任何数,只要多于1位是1,那么就不会出现高位连续的都是1,高位必然会出现0。(思考,什么时候P的高位会出现0?)

那么我们就可以继续观察,如果我们将A按位取反,然后再和P按位OR起来会得到什么?A既然是独热码,那么除了为1的那一位(假设是第i位),取反之后都会变成1,只有第i位会是0。而P的第i位是1,那么最后按位OR的结果是什么?全部每一位都是1。

那么如果A不是独热码,而是有两个1或者更多1,假设第i位和第k位是1(k是i之后第一个1),我们进行上面的操作会得到什么?P[k]会得到0。A反和P按位OR之后第k位也是0.

至此,我们距离我们的最终答案只有一步之遥,A反和P按位OR之后的结果我们再对每一位进行按位AND,得到的结果如果是0,那么一定不是独热码!

为什么是一步之遥呢?我们这里漏了一个特殊情况,即A为全0。当A为全0的时候,P也是全0,但是A取反之后是全1,所以A反和P按位OR之后也会得到全1。幸好,特殊情况就只有这一种,我们只需要对A进行一下全0判断就可以了。

至此,我们更加高效的通用解法就出来了


function automatic logic is_onehot(input [WIDTH-1:0] sig);logic [WIDTH-1:0] parity;parity[0] = sig[0];for(int i = 1; i < WIDTH; i++)parity[i] = parity[i-1] ^ sig[i];is_onehot = parity[i-1] & (&(parity | ~sig));
endfunction

本篇文章参考自面试题分析–独热码检测

verilog独热码检测相关推荐

  1. Verilog笔记——数据检测/独热码检测——Quartus与Modelsim仿真

    MATLAB 与 FPGA无线通信.图像处理.数字信号处理系列 1.题目要求 输入32-bit数据,若是2的N次方(如1=20,2=21),输出1,否则输出0,复位时输出高阻态.(实际上,这是对32位 ...

  2. Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码

    一般的,在Verilog中最常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码. 二进制码和格雷码是压缩状态编码. 若使用格雷编码,则相邻状态转 ...

  3. Verilog常见编码方式:二进制码、格雷码、独热码

    Verilog常见编码方式有:二进制码.格雷码.独热码:三种编码方式各有特点利弊,因此有必要理解比较,以求不同场合的合理选择: 目录 一.结论: 二.详细了解 二进制码 格雷码 独热码 比较 三.参考 ...

  4. 【Verilog基础】为什么状态机中多使用独热码,而不是二进制码或者格雷码?

    为什么例子中我们使用的是独热码而非二进制码或格雷码呢? 那就要从每种编码的特性上说起了,首先独热码因为每个状态只有 1bit 是不同的,例如在执行到(state== TWO)这条语句时,综合器会识别出 ...

  5. verilog中状态机的三种编码方式的比较(二进制码、独热码、格雷码)

    最近做了一个小项目,是关于状态机中三种编码方式的比较,总结了一下三种编码方式的不同,可以会在以后IC笔试面试过程中用到,简单记录一下三种编码方式的优缺点. 三种编码方式如下图所示:其中独热码只有一位为 ...

  6. Verilog专题(二十)one-hot FSM(独热码有限状态机)

    HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 题目 The following is the state transition table for ...

  7. FPGA中有限状态机的状态编码采用格雷码还是独热码?

    今天看<从算法设计到硬件逻辑的实现>这本电子书时,遇到了一个问题,就是有限状态机的编写中,状态编码是采用格雷码还是独热码呢?究竟采用哪一种编码呢? 采用独热码为什么节省许多组合电路? 等等 ...

  8. FPGA学习笔记---二进制码、独热码、格雷码分析对比

    在Verilog学习中常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码,对于新手来说,搞不清楚编码为什么要分这么多格式?统一用一种格式不好吗? ...

  9. 二进制码、格雷码、独热码的区别

    格雷码 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又称循 ...

最新文章

  1. 小白兔写话_聪明的小白兔看图写话
  2. 谷歌对2021年的六个预测:数据和云技术的革命即将到来
  3. 步步高vivo高通解锁工具_高通人工智能开放日,窥见5G+AI的未来
  4. Synergy 一套键鼠同时控制多台电脑的神器
  5. 在 Windows 中,当一个应用程序窗口被关闭,该应用程序将会保留在哪里?
  6. 光盘隐藏文件夹 linux,linux常用命令大全2--挂载/dpkg/文件系统分析/apt/光盘/关机...
  7. LeetCode 229 : Majority Element II
  8. 打包vue项目时报错:Expected indentation of 6 spaces but found 10
  9. linux限制堆栈大小,进程超过RedHat Enterprise Linux 6的线程堆栈大小限制?
  10. “电”亮数字生活,阿里云助力南方电网智能调度
  11. word设置多级标题样式及编号
  12. 字段计算器python教程_字段计算器综合(python-02)
  13. matlab好看的字体,最佳50个新鲜+漂亮的字体(2011)
  14. JS定时器原理及案例
  15. python绘制四边形,三角形图形案例
  16. java adsl 拨号_[zt]利用脚本实现ADSL自动拨号上网
  17. word里双横线怎么打_如何在word中画线 怎么在word中输入横线[图文]
  18. 【Android 12.0】Android S WiFi启动业务流程分析(UML图)
  19. python(x,y)安装和使用
  20. 出海、上市,分众传媒还能再造一个“分众”吗?

热门文章

  1. 浅谈打造泛在电力物联网大数据平台
  2. Python_代码风格_合理分解代码,提高代码可读性
  3. CCFCSP星际旅行(95)
  4. Pixhawk ardupilot 手机地面站 DroidPlanner Tower
  5. 苹果cms第三方登录QQ互联正确回调设置方法
  6. 线下分享 | 2018云和恩墨大讲堂深圳站
  7. 文案不知道怎么写?为你分享自媒体人必学的几个文案写作技巧
  8. 竞品分析:抖音vs快手 以及在未来发展中所会遇到的问题
  9. html静态网站基于个人介绍网站网页设计与实现共计5个页面(带报告4900字)
  10. bgp通告四原则_BGP选路原则详解