来聊一聊独热码检测

国庆假期不小心扭伤了脚踝,在家没事看到一篇文章挺有意思,于是写出来分享给大家。

这是一道数字电路面试题,也是很多面试官很喜欢考察面试者的一道题目,题干很简单:给定一个4bit的信号A,设计逻辑来判断A是不是独热码,设输出为Y,如果A是独热码,则输出1,如果不是,则输出0;

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

下面的表格是独热码来表示0-7这8个数。

其实one-hot编码在电路设计中非常常见,举个简单的例子,给定一个SRAM的地址,要读出SRAM中的一行,SRAM内部就是利用address的某几位来转换为one-hot的select从而选中对应的word line和bit line,还有一些场合,利用one-hot来编码状态机,好处就是一个flop就表示一个状态,用来判断状态机在哪一个状态的时候就只需要看第几个flop为1即可,而不需要像binary编码那样是所有flop在一起参与比较,这样可以省下来一点点逻辑比较电路的延时,代价显而易见,用one-hot编码状态机需要的寄存器比binary编码要多,这就是一个典型的利用面积换性能的trade off;

回到这个问题本身,其实直接回答上面这个问题难度不大,相信所有学过数字逻辑的同学都能都立刻想到解决办法--利用真值表和卡诺图,这也是面试官要考察你的第一层,对于学校的课程基础支持掌握的是不是扎实。

真值表略过,直接上卡诺图:

很明显,在这个例子中,卡诺图并不能帮我们简化逻辑(为什么?)最后的表达式其实都可以直接想到。

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]);

【卡诺图中的1/0是怎么来的?其实是根据真值表来的,为1的项表示真值表可能存在的值,以1000为例,这一项就是这个one-hot可能存在的一个值,因此在卡诺图中该项为1】  

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

回答到这里,面试官可以认为你在数字电路的课没有完全睡觉,至少最基本的只是你是掌握的,能够回答出这个答案不一定会给你offer,但是回答不出来那肯定是对不起谢谢了。

那么接下来面试官会进一步问,如果输入变成了16bit,甚至32bit或者更多呢,你要怎么设计电路?如果用verilog来表示你的电路呢?

当然你可以继续使用卡诺图和真值表,直接写表达式,16个最小项,再把他们或起来,可是你知道这不是面试官想要的答案,因为面试官想要你设计的,是一个参数化的表达,参数化的设计是数字逻辑设计中很重要的一个点,它体现了你的设计是不是可以复用,而且能够匹配各种应用需求,以这个为例,面试官想要你设计的其实是下面这个function。

parameter WIDTH = 16;
function is_one_hot(input[WIDTH-1:0] signal)
// code your rtl
endfunction

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

当然,如果你告诉面试官这个思路,面试官会很乐于让你写以下RTL code,code不长,只要你能写出来,没有语法错误,那你在面试官心里又加了一分,下面是一个上述思路的RTL参考code。

function automatic logic is_one_hot(input [WIDTH-1:0] signal)
parameter SUM_WIDTH = $clog2(WIDTH)+1;
logic [SUM_WIDTH-1:0] sum;
sum = 'd0;
for (int i =0; i< WIDTH; i++)sum = sum + sig[i];is_one_hot = (sum ==1);
endfunction

如果你能写出上面的代码,特别是能注意到automatic $clog2等,说明你对systemverilog掌握的不错,是写过几行代码的人,如果你是一个应届生,能够写出这样的code,并且能够回答出面试官针对这几行code的问题,面试官已经对你很感兴趣了,这里面有几个小点需要大家注意,SUM_WIDTH要用$clog2之后再加1,为什么要这样大家自己思考一下。

那么面试官下来就会问你,这段code综合出来的电路是什么样子的呢?这里面试官想考察你对for loop在RTL中实际理解,对于许多RTL的初学者,通常搞不清楚for loop的作用,错误的把程序设计中的for循环的想法滥用在RTL设计中,这里我们一直在强调,RTL的每一行代码都是在面熟电路,大家一定要做到心中有电路,手下才有code。

上面的电路以WIDTH=4为例,综合处的电路(优化前)其实是:

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

那么有什么办法可以优化呢?当然如果你继续对上面的思路进行优化,比如第一级,第二级其实不需要一个2bit的adder,而是可以将a[0],a[1],送到一个half adder里面,这样就可以替换掉前面两个2bit adder,还有half adder本质其实就是一个XOR gate等等,这些都是面试官很乐意和你探讨的,你探讨的越细,在面试官心里的加分就越多,其实在面试过程中你是不是给出最优解并不关键,重要的是给面试官展现出来你的思考过程,展现出你利用现在有的只是去一点点解决未知问题的能力,一般来说,如果这道题目你经过这么一个思考过程,包括写代码画电路和面试官讨论,你在这个问题上的表现已经在面试官心里有谱了。

那么这个问题再上一个层次要怎么回答呢?其实思路来自一个稍微冷门但其实又非常常用的知识点:对一个binary number进行奇偶校验

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

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

 我们可以看到一个规律,即对于独热码,我们得到的P会是这样一个数:如果独热码A的第i位为1,那么P的第i-1到第0位都是0,而第i位和更高位都是1,注意这个规律只对独热码适用,大家可以试验以下其他任何数,只要多于1位是1,那么就不会出现高位连续的都是1,高位必然会出现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_one_hot(input [WIDTH-1:0] signal)logic [WIDTH-1:0] parity;parity[0] = signal[0];for (int i=1; i< WIDTH ; i++)parity[i] = signal[i] ^ parity[i-1];is_one_hot = parity[i-1] & (&(parity | ~sig));
endfunction

至此,这个问题就讲的差不多了,说实话能够回答出最后一种解法的人寥寥无几,作为一道面试题,这道题的区分度其实并不怎么样,面试官更看重面试者是否能够顺利的利用前面基本思路来给出一个可以work的解法。

转载:面试题分析--独热码检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面

使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面 使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面 使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面什么是图形视图框架(Graphics View Framework)&#xff1f;…

数学建模Matlab之基础操作

作者由于后续课程也要学习Matlab&#xff0c;并且之前也进行了一些数学建模的练习&#xff08;虽然是论文手&#xff09;&#xff0c;所以花了几天零碎时间学习Matlab的基础操作&#xff0c;特此整理。 基本运算 a55 %加法&#xff0c;同理减法 b2^3 %立方 c5*2 %乘法 x 1; …

Qt 综合练习小项目--反金币(2/2)

目录 4 选择关卡场景 4.2 背景设置 4.3 创建返回按钮 4.3 返回按钮 4.4 创建选择关卡按钮 4.5 创建翻金币场景 5 翻金币场景 5.1 场景基本设置 5.2 背景设置 5.3 返回按钮 5.4 显示当前关卡 5.5 创建金币背景图片 5.6 创建金币类 5.6.1 创建金币类 MyCoin 5.6.…

WPF绑定单变量Binding和绑定多变量MultiBinding 字符串格式化 UI绑定数据,数据变化自动更新UI,UI变化自动更新数据

UI绑定数据&#xff0c;数据变化自动更新UI&#xff0c;UI变化自动更新数据。 支持多设备&#xff0c;同时下载。 绑定单变量 在WPF (Windows Presentation Foundation) 中&#xff0c;您可以使用数据绑定来将变量绑定到界面元素。这允许您在界面上显示变量的值&#xff0c;…

SpringCloud-Bus

接上文 SpringCloud-消息组件 1 注册Bus Bus需要基于一个具体的消息队列实现&#xff0c;比如RabbitMQ.还使用最开始的服务拆分项目&#xff0c;比如现在借阅服务的某个接口调用时&#xff0c;能给用户服务和图书服务发送一个通知。 首先父项目导入SpringCloud依赖 <depend…

【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解

一&#xff0c;域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集&#xff0c;比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具&#xff0c;汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

全志ARM926 Melis2.0系统的开发指引⑥

全志ARM926 Melis2.0系统的开发指引⑥ 编写目的9. 系统启动流程9.1. Shell 部分9.2.Orange 和 desktop 部分9.3. app_root 加载部分9.4. home 加载部分 10. 显示相关知识概述10.1. 总体结构10.2. 显示过程10.3. 显示宽高参数关系 -. 全志相关工具和资源-.1 全志固件镜像修改工具…

2023/10/4 QT实现TCP服务器客户端搭建

服务器端&#xff1a; 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { cla…

C++设计模式-生成器(Builder)

目录 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、…

《计算机视觉中的多视图几何》笔记(13)

13 Scene planes and homographies 本章主要讲述两个摄像机和一个世界平面之间的射影几何关系。 我们假设空间有一平面 π \pi π&#xff0c;平面上的一点为 x π x_{\pi} xπ​。 x π x_{\pi} xπ​分别在两幅图像 P , P ′ P, P P,P′上形成了 x , x ′ x, x x,x′。 那…

JavaEE 网络原理——TCP的工作机制(中篇 三次握手和四次挥手)

文章目录 一、TCP 内部工作机制——连接管理1. 连接(三次握手)(1).有连接和确认应答之间的关系(2). 通过客户端和服务器详细描述三次握手 2. 断开连接(四次挥手)(1)讨论“四次握手”中间步骤的合并问题。(2) 根据简单的 TCP 代码解释断开连接(3) 四次挥手中的两个重要的 TCP 状…

@ConfigurationProperties配置绑定~

ConfigurationProperties注解是Spring Boot中的一个注解&#xff0c;用于将配置文件中的属性值绑定到Java类中的字段上。 ConfigurationProperties注解的作用包括&#xff1a; 实现配置文件属性和Java类字段的映射&#xff0c;简化了读取配置文件的操作。 可以指定配置文件中…

React项目部署 - Nginx配置

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

GB28181学习(六)——实时视音频点播(数据传输部分)

GB28181系列文章&#xff1a; 总述&#xff1a;https://blog.csdn.net/www_dong/article/details/132515446 注册与注销&#xff1a;https://blog.csdn.net/www_dong/article/details/132654525 心跳保活&#xff1a;https://blog.csdn.net/www_dong/article/details/132796…

GPT系列论文解读:GPT-2

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

企业微信机器人对接GPT

现在网上大部分微信机器人项目都是基于个人微信实现的&#xff0c;常见的类库都是模拟网页版微信接口。 个人微信作为我们自己日常使用的工具&#xff0c;也用于支付场景&#xff0c;很怕因为违规而被封。这时&#xff0c;可以使用我们的企业微信机器人&#xff0c;利用企业微信…

【数据结构】排序(1) ——插入排序 希尔排序

目录 一. 直接插入排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 希尔排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 直接插入排序 基本思想 把待排序的记录按其关键码值的大小依次插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&…

程序三高的方法

程序三高的方法 目录概述需求&#xff1a; 设计思路实现思路分析1.1&#xff09;高并发 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…

全志ARM926 Melis2.0系统的开发指引⑤

全志ARM926 Melis2.0系统的开发指引⑤ 编写目的8. 固件修改工具(ImageModify)使用8.1.界面说明8.2.操作步骤8.2.1. 配置平台8.2.2. 选择固件8.2.3. 选择要替换的文件8.2.4. 替换文件8.2.5. 保存固件 8.3.注意事项8.4.增加固件修改权限设置8.4.1. 概述8.4.2. 操作说明8.4.2.1.打…

竞赛选题 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…