面试问题及答案整理合集
硬件描述语言是一种用形式化的方法来描述数字电路和系统的语言。数字电路的设计者利用这种语言可以从上层到下层逐层描述自己的设计思想,用一系列分层次的模块来表示及其复杂的数字系统。然后利用电子设计自动化(EDA)工具来进行仿真验证,再把其中需要变为具体物理电路的模块组合经由自动综合工具转换到门级电路网表,再用专用集成电路(ASIC)或者现场可编程门阵列(FPGA)自动布局布线工具把网表转换为具体电路布线结构的实现,通俗点说,自己来设计内部电路。而软件编程语言是没法改变电路结构的,因为芯片内部已经固化,所以软件编程操作意味着是对内部寄存器的操作。
关于FPGA如何选芯片,其实就是根据项目实际情况,对选型芯片做一个综合评估,选择出最具“性价比”的芯片,一般情况下,芯片厂商都会按照产品系列列出所有的产品,直观的告诉你某个系列产品的应用场合。如何选择芯片厂商,要看项目的特殊需求、芯片厂商的供货、报价、以及己方的技术人员对产品的熟悉程度和芯片的成熟度,比如说是不是有较好的软件开发平台呀,还有就是芯片的内部资源,引脚封装、速度等级等。
建立时间Tsu: 指数据信号到达触发器输入端的时间要早于 时钟敏感边沿 到达触发器的时间,只有满足建立时间,信号才能正确的保存到触发器,否则数据就不能在此时钟信号变化时被记录,从而无法正确保存到触发器。简言之,时钟沿到来之前,数据保持稳定不变的时间。
保持时间:指 时钟边沿 到达后 输入数据 需要保持稳定不变的时间,满足这个条件,才能保证数据能够保存到触发器,否则,数据就不能在下一个时钟信号变化时被记录下来,导致无法正确的保存到触发器。简言之,时钟沿到来之后,数据保持稳定不变的时间。
综述:输入的数据必须在建立时间前达到,且要持续到保持时间后。
亚稳态:输入信号在时钟有效沿的建立时间和保持时间之间变化,导致其不满足触发器建立保持时间的时序要求,使得输出有一段时间的不确定状态。
亚稳态现象包括如下几种:
1、跨时钟域中的亚稳态:由于源信号时钟与目的信号时钟的相移未知,可能导致保持时间和建立时间条件不满足,从而产生亚稳态现象。——采用FIFO对跨时钟域数据通信进行缓冲设计。
2、异步信号中的亚稳态:由于异步信号不与触发器同步时钟同步,所以可能导致保持时间和建立时间条件不满足,产生亚稳态现象。—— 通过同步处理来解决。
3、异步复位检测中的亚稳态:复位信号的变化出现在建立或者保持时间内,也无法保证满足Tsu和Th的要求,出现亚稳态。——对复位电路采用异步复位、同步释放方式处理。
竞争(Competition): 在组合逻辑电路中,某个输入变量通过多条(两条及以上)途径传到输出端,由于每条途径延迟时间不同,到达输出门的时间就有先有后,这种现象称为竞争。竞争又分为临界和非临界竞争,不会产生错误输出的竞争为非临界竞争。产生暂时性或永久性错误的竞争为临界竞争。
冒险(risk):信号在器件内部通过连线和逻辑单元时,都有一定延时。延时的时间与连线的长短和逻辑单元数目有关,同时还受器件的制造工艺、电压、温度等影响;
多路信号在电平值变化时也都存在不同的延迟,对应的组合逻辑的输出也就有了先后顺序,因此就产生了冒险。冒险现象中会出现一些不正确的尖峰信号,称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在冒险。也可以说由于竞争引起电路输出发生瞬间错误,该现象为冒险。
竞争和冒险都是由于存在电路延迟引起的,同时冒险是由竞争造成的,而竞争是因为电路中的时延不同,但是有竞争的时候不一定会出现冒险。解决方法:1:加滤波电路,消除毛刺的影响;2:加选通信号,避开毛刺;3:增加冗
余项消除逻辑冒险。
乒乓操作是一个主要用于数据流控制的处理技巧,外部输入数据流通过“输入数据选择控制”模块送入两个数据缓冲区中,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM(Dual RAM),SRAM,SDRAM,FIFO等。在第1个缓冲周期,将输入的数据流缓存到“数据缓冲1”模块,在第2个缓冲周期,“输入数据选择控制”模块将输入的数据流缓存到“数据缓冲2”模块的同时,“输出数据选择控制”模块将“数据缓冲1”模块第一个周期缓存的数据流送到“后续处理”,模块进行后续的数据处理,在第三个缓冲周期,在“输入数据选择控制”模块的再次切换后,输入的数据流缓存到“数据缓冲1”模块,与此同时,“输出数据选择控制”模块也做出切换,将“数据缓冲2”模块缓存的第二个周期的数据送到“后续处理模块”,如此循环。这里正是利用了乒乓操作完成数据的无缝缓冲与处理,乒乓操作可以通过“输入数据选择控制”和“输出数据选择控制”按节拍,相互配合地进行来回切换,将经过缓冲的数据流没有停顿的送到“后续处理模块”。
同步逻辑:时钟之间有着固定的因果关系,且触发只和时钟有关,只要在时钟沿处才能触发。
同步电路: 同步电路中所有触发器的时钟端连接在同一时钟源上,所有触发器状态的改变都与时钟信号同步。因此当时钟沿到来则输出变化,否则保持,直到下一时钟脉沿到来才发生变化。
异步逻辑:时钟之间没有固定的因果关系,其触发和多种控制因素有关,当任何一个因素发生变化,那么都能实现触发。
异步电路中没有统一的时钟。有些触发器的时钟输入端与时钟源相连,只有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。
总结:同步逻辑和异步逻辑不是完全割裂的,异步逻辑中肯定有同步逻辑的成分在,但同步逻辑中不可能有异步逻辑的成分。
同步复位:复位信号与clk有效,当clk有效的时候,复位才有效。
优点:有利于进行时序分析;由于只在clk有效的时候有效,因此能防止毛刺现象的出现。
缺点:复位信号必须大于时钟周期,才能被系统真正识别;大部分逻辑器件中的D触发器都只有异步复位端口,因此采用同步复位的话,需要在寄存器的数据输入端插入组合逻辑,此时我们就需要考虑组合逻辑延迟等因素。
异步复位:复位信号与clk无关,只和自身输入的复位信号有关。
优点:大部分逻辑器件中的D触发器都只有异步复位端口,无需再插入组合逻辑,省资源;设计相对简单;
缺点:复位信号可能不满足建立和保持时间要求,因此容易出现亚稳态;容易受毛刺影响;
Moore 有限状态机输出只与当前状态有关,与输入信号的当前值无关。在时钟脉冲的 有效边沿作用后的有限个门延后,输出达到稳定值。从时序上看,Moore 状态机属于同步输出状态机。Moore 有限状态机最重要的特点就是将输入与输出信号隔离开来。
Mealy 状态机的输出是现态和所有输入的函数,随输入变化而随时发生变化。从时序上看,Mealy 状态机属于异步输出状态机,它不依赖于时钟。
同步FIFO:读写都是同一个时钟源;异步FIFO:读写不是同一个时钟源。
最常见的就是异步FIFO的问题,因为异步FIFO会存在如下几种情形:
1、写时钟快于读时钟,写和读的过程中没有空闲周期
答:假设写时钟频率为80MHz,读时钟频率为50MHz,突发传输大小为120,写和读的过程中没有空闲周期,分析过程:写时钟周期Tw = 1000/80 ns = 12.5ns;同理读时钟周期为20ns;突发写长度为120个数据,写120个数据耗时120 * 12.5 = 1500ns;1500ns时间内读出数据1500/20ns = 75个;故最小FIFO深度为120 - 75 = 45。
2、写时钟频率大于读时钟频率,但在读写的过程中存在空闲周期
答:假设写时钟频率为80MHz,读时钟频率为50MHz,突发传输大小为120,写和读的过程中有空闲周期,每2个写时钟周期写1个数据,每4个时钟周期读一个数据,那么写一个数据需要25ns,读一个数据需要80ns,那么由于突发写数据个数为120个,写这么多数据需要时间120 * 25ns = 3000ns;4个读时钟周期读一个数据,因此读一个数据需要时间80ns,3000ns读了3000/80 = 37.5个数据(0.5不算一个数据,没读完整),约等于37个数据。
所以,FIFO的最小深度为120 - 37 = 83。
3、写时钟慢于读时钟,且读写过程中没有空闲周期
答:假设写时钟频率为30MHz,读时钟频率为50MHz,突发传输大小为120,写和读的过程中没有空闲周期,分析:这种情况下永远也不会发生数据丢失的情况;fifo的深度为1。
4、写时钟频率小于读时钟频率,但读写过程中存在空闲周期
答:假设写时钟频率为30MHz,读时钟频率为50MHz,突发传输大小为120,写和读的过程中有空闲周期,每2个写时钟周期写1个数据,每4个时钟周期读一个数据,分析:写时钟周期1000/30 ns = 100/3 ns;读时钟周期 20ns;写一个数据需要2个时钟,也就是200/3 ns;读一个数据需要4个时钟,也就是80 ns;写120个数据需要时间8000ns,这段时间内读出数据8000/80 = 100个;
因此,FIFO的最小深度为120 - 100 = 20;
5、读写时钟速率相同,且无空闲时钟
答:分析:如果读写时钟之间没有相位差,则不需要FIFO就可以进行读写;如果二者存在相位差,只需要FIFO的深度为1即可。
6、读写时钟频率一致,但在读写过程中存在空闲周期
答:读写时钟均为50MHz,突发传输大小为120,写和读的过程中有空闲周期,每2个写时钟周期写1个数据,每4个时钟周期读一个数据,分析:两个时钟写一个数据,需要时间40ns;4个时钟读一个数据,需要80ns;由于突发长度120,需要120*40 = 4800ns写完;这段时间读出数据个数:4800/80 = 60;所以,FIFO最小深度为120 - 60 = 60;
未完待续,尚在总结中。。。。。
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有, 也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手