紫光展锐数字IC笔试题

1. 如果DFF的hold时间不满足,通常可以通过降低时钟运行速度来解决( )
A 是 B 不是
解析:
建立时间:即时钟有效沿来临之前数据需要保持稳定的最小周期,以便数据在随时钟信号采样时是准确的。
保持时间:时钟有效沿来临之后数据需要保持稳定的最小时间,以便数据能够准确的被采样。

建立时间和保持时间的概念相对于FPGA内部的D触发器而言的,每一款FPGA的手册中都会给出其所支持的建立保持时间的最小值。下图是Microsemi公司的IGLOO2 FG484手册中给出的建立保持时间表:
在这里插入图片描述
从上表可以看出,这款FPGA的建立时间标准情况是0.421ns,保持时间是0ns,即数据相对于时钟有效沿,至少需要提前0.421ns保持稳定,时钟有效沿之后可以立刻发生变化。

在FPGA中触发器的建立、保持时间是否满足,指的是输入到FPGA中的D触发器的有效数据和时钟有效之间的偏差,是否满足根据时序模型分析给出的建立保持时间的范围。简单来说,就是数据不能来得太晚,走得太早。

建立和保持时间的约束一般可以通过静态时序分析的通用模型得出,我们可以通过该模型分析出建立、保持时间的公式,从而根据公式直观的给出结果。

在这里插入图片描述
上述模型的时序惯性系如下所示:
在这里插入图片描述
注:TCLK为时钟周期,Tskew为两个触发器时钟的skew偏差,Tdq为触发器输出的延迟,Tcomb为组合逻辑延迟。

从上图中可以看出,数据从D1传到D2所需的时间为Tdq+Tcomb,时钟从D1传到D2的时间为TCLK­+Tskew,根据建立时间的定义,对于D2而言,数据有效沿到达时间为TCLK­+Tskew,数据开始有效的时间为Tdq+Tcomb,所以Tsetup + Tdq +Tcomb≤ TCLK­+Tskew。而保持时间,从上图也可以看出,Thold ≤ Tdq+Tcomb。

当建立时间不满足时,即Tsetup值要大于实际的TCLK­+Tskew - Tdq-Tcomb,为了满足建立时间,可以通过换工艺更好的芯片减小Tsetup值,或者增加TCLK、Tskew、减小Tdq和Tcomb。

当保持时间不满足时,增加Tdq和Tcomb来解决。目前大部分芯片的Thold时间都可以做到0ns。所以当保持时间不满足时,通常采用的做法是在传输路径上插入buffer,不影响逻辑功能,只增加延迟。保持时间和时钟频率没有关系,故降低时钟速度不能解决保持时间不满足的问题,故答案选择B。

2. DFF的setup时间是根据DFF与DFF之间的时序分析路径分析出来的,把时钟变慢可以有效增加DFF的setup时间()
A 是 B 不是
解析
在上题,对建立时间和保持时间已经进行过解释。建立时间和保持时间对于某一款确定的FPGA芯片而言,都是一个确定的值,不随综合实现出的逻辑电路的变化而变化。故答案选B。

3. 数字电路设计中竞争和冒险会带来电路上的毛刺,需要加入RC滤波电容滤除()
A 是 B 不是
解析:
竞争:在组合逻辑电路中,某个输入变量通过两条或两条以上的途径传输到输出端,由于每条途径延迟时间不同,到达输出门的时间就有先有后,这种现象称为竞争。

冒险:多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑输出有先有后,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为“毛刺”。如果一个组合逻辑电路中有“毛刺”出现,就说明该电路存在冒险。

竞争冒险产生的原因:由于延迟时间的存在,当一个输入信号经过多条路径传送后又重新会合到某个门上,由于不同路径上门的级数不同,或者门电路延迟时间的差异,导致到达汇合点的时间有先有后,从而产生瞬间的错误输出。

解决竞争冒险通常有两种途径:
1)从根源上解决问题:竞争和冒险产生的根本原因是由于,同一时刻可能有多个信号发生变化。
a. 保证同一时刻只允许单个输入变量发生变化,即可避免产生毛刺。比如对数据进行格雷码编码,即可解决这个问题。
b. 通过对输出结果采样,当输出保持稳定时再将结果输出给后续模块。
2)避免竞争冒险引起的毛刺对后续电路造成影响
a. 在毛刺输入到下一个模块之前,通过滤波电路将毛刺滤除。毛刺一般是非常窄的脉冲,可以在输出端接一个几百微法的电容将其滤除掉。
b. 在下一级模块中,对输入信号进行采样,当信号保持稳定后,再进行操作。
综上,本题答案是A。

4. 异步reset信号因为和时钟是异步的,因此不需要加时序约束()
A 是 B 不是
解析:
异步复位信号存在着类似与建立、保持时间相似一个概念,即复位恢复时间和复位解除时间。
复位恢复时间(recovery time):即由复位状态恢复到非复位状态时,在下一个时钟有效沿来之前,复位信号要要提前保持为无效的时间,对应与数据的建立时间。
在这里插入图片描述
复位解除时间(removal time):即由非复位状态进入复位状态时,在有效时钟沿来临之后复位信号还需要保持的时间为复位解除时间,对应与数据的保持时间。
在这里插入图片描述
复位的异步问题我们可以通过异步复位同步释放来解决,也可以不适用异步复位,如果使用了异步复位u,在时序约束时要将其约束为Falth_path,否则时序分析工具会得出错误的分析,所以本题答案是B。

5. 时钟域A的多bit信号不一定要经过同步才能被时钟域B采用()
A 是 B 不是
解析:
不同的时钟域之间信号通信时需要进行进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。(所以本题答案为B

跨时钟域的传输可大致分为以下两大类:

单比特:当单比特信号跨时钟域时,有两种情况,一种是由快时钟域到慢时钟域,我们可以采用脉冲展宽法、反馈信号法、绳结法等;另一种是慢速时钟域到快速时钟域,我们直接采用两级触发器来同步,在加油站|单比特信号跨时钟域问题详解中有详细的举例和解析。

多比特:多比特信号(数据流或地址总线)跨时钟域时可以分两种情况,即慢到快和快到慢的情况,这里我们不分开列举,仅在括号中备注,其中有:DMUX法(慢到快)、保持寄存器加握手信号法(两种情况均可)、标志信号同步法(两种情况均可)、格雷码(数据需连续,两种情况均可)、异步FIFO(硬核FIFO和格雷码FIFO[RAM+格雷码],两种情况均可)、RAM(两种情况均可)等。

6. 电迁移通常是指在电场作用下使金属离子发生迁移的现象。如下影响电迁移率的因素有()
A 电流密度 B 温度
C 芯片面积 D 晶体结构
解析:
电流密度是一个由设计而定的参数,在恒定电场作用下,电流密度是恒定的**,所以不选A**;影响电迁移的重要物理因素主要有温度,温度通过影响互连引线中的原子扩散而对电迁移过程产生影响,所以选B;导线的长度和面积就是横截面积会影响电迁移率,但是根据芯片面积的大小很说导线宽度和长度状况,所以不选C;不同的晶体材料其电迁移率不同,所以选D

7、假设如下每个小方块铝薄片的电阻为1欧姆,请问如下图形的铝片的电阻为:( )
在这里插入图片描述
A 8 B 12
C10 D 6
解析:
R=Rs*L/W(Rs是1欧姆,L是块材长度,W为块材宽度)上图可以分解为3个串联的电阻,每个电阻均为2欧姆,所以最终结果就是6欧姆,答案选D。

8. 1Å表示( )
A 10^-10m          B10^-9mC 10/-11m           D 10^-8m
解析:
Å这个单位读做“埃”,为0.1nm。10的-8次方cm,德布罗意波长λ=1Å= 10^(-10)m,所以答案选A

9、有一个读端口和一个写端口的memory类型为:( )
A one port RAM B ROM
C dual port RAM D two port RAM
解析:
A选项one port RAM在Vivado中也叫Single Port RAM,从图中我们可以看到有一个写端口和一个读端口,但是都是由一个时钟控制的,符合题目要求,所以A选项正确。
在这里插入图片描述
B选ROM在Vivado中有两种,一种是SinglePort ROM,另一种是Dual Port ROM,我们可以看到它们都只有读端口,没有写端口。所以不符合题目要求。
在这里插入图片描述
在这里插入图片描述
C选项dual port RAM在Vivado中应该为True Port Ram,即真双端口RAM,从图中我们可以看出有2个独立的Single Port RAM构成,每个端口均可以进行读写操作。所以不符合题目要求。
D选项two port RAM在Vivado中应该为Simple Dual Port Ram,即简单真双口RAM,如下图所示我们可以看到只有一个读端口和一个写端口,A端口负责写,B端口负责读,符合题目要求,所以D选项正确
在这里插入图片描述
10. 如下会影响IC制造良率的是:( )
A 工艺 B 布局布线
C温度 D 芯片面积
**解析:**本题目主要考察了对IC制造良率
成熟的工艺良率高,布局布线太拥堵良率低,温度过高过低都不好,所以A、B、C选项都是正确的,而芯片面积的大小并不能说对IC的制造良率产生直接影响,最多只能说具有一定的相关性。

11.新的techonology node边长大约是之前的多少%来达到面积缩小一半?( )
A 60% B 70%
C 50% D 80%
**解析:**本题目主要考察了对techonology node的认识
techonology node:技术节点(也是工艺节点、工艺技术或简单节点)是指具体的半导体制造工艺及其设计规则。不同的节点往往意味着不同的电路代数和结构。一般来说,技术节点越小意味着特征尺寸越小,产生的晶体管越小,速度越快,功率效率越高。
过去,进程节点名称指的是晶体管的许多不同特性,包括栅极长度以及 m1半节距。
最近,由于各种各样的市场营销和铸造厂之间的差异,这个数字本身已经失去了它曾经拥有的确切含义。诸如22 nm,16 nm,14 nm和10 nm之类的最新技术节点纯粹是指采用特定技术制造的特定一代芯片。它不对应于任何栅极长度或半节距。
自2017年左右以来,一些领先的代工厂使用节点名称模棱两可地代表略微修改的流程,从而完全取代了节点名称。此外,代工厂之间晶体管的尺寸,密度和性能不再匹配。例如,英特尔的10纳米可与代工厂7纳米相媲美,而英特尔的7纳米可与5纳米代工厂相媲美。过程节点缩放背后的驱动力是摩尔定律。
为了使密度增加一倍,每个节点的接触多晶硅节距(CPP)和最小金属节距(MMP)需要按大约0.7倍的比例缩放。换句话说,缩放比例为(0.7x CPP) x(0.7x MMP) ≈ ½ area,所以答案选择B

12. 对电路的工作速度不是主要影响因素的是:( )
A 封装方式 B 制造工艺
C 温度 D 工作电压
解析:本题目主要考察了PVT对电路性能的影响
制造工艺(Process)、工作电压(Voltage)、温度(Temperature)对芯片运行的速度影响很大,这三个量也就是我们常说到的PVT,数字电路设计时会做静态时序分析(STA),分析在各种PVT条件下芯片的时序是否满足要求,也就是对芯片的工作速度进行分析。在分析建立时间是否满足时序要求时要使用慢速模型,即高温+低压+慢速模型;分析保持时间是否满足时序要求时要使用快速模型,即低温+高压+快速模型。而封装方式不是对电路工作速度的主要影响因素。然后注意题干为不是主要影响因素的是,所以答案选A。

13. 选出和如下表达式相等的项,()在这里插入图片描述
在这里插入图片描述
解析:本题目主要考察了对逻辑表达式的化简
我们使用卡诺图化简法
1)首先将Y化为最小项之和的形式:
在这里插入图片描述
2)画出标识该逻辑函数的卡诺图:
在这里插入图片描述
3)找出可以合并的最小项:
在这里插入图片描述
①合并结果为D,②合并结果为C,③合并结果为AB—
4)选取化简后的乘积项
Y=AB—+C+D
所以本题答案是C。

14. 如下哪种工作条件下,功耗最大( )
A 电压1.0V,温度85℃
B 电压0.9V,温度0℃
C 电压1.0V,温度0℃
D 电压0.9V,温度85℃
解析:
电压主要是对动态功耗的影响较大,从动态功耗的公式也可以看出供电电压越高功耗越大。温度主要影响静态功耗,静态功耗主要有两种漏电流,一种是亚阈值电流,一种是pn结反向漏电电流。温度升高静态功耗主要受到亚阈值电流增大,高温让亚阈值电流大幅度提高,几乎是指数级别的,从而导致功耗的增加,所以A选项正确。

15. 用以下哪个指令可以实现设置文件“test”以及其下面的所有文件权限为User自己可读可写可执行,Group和Other设定为仅仅可读( )
A chmod 755 test
B chmod -R 755 test
C chomd 744 test
D chmod -R 744 test
解析:
在Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。但是,对于目录文件来说,理解其权限设置来就不那么容易了。文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1来表示,文件所有者,所属组及其他用户权限之间无关联。文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可读、可写(4+2)。从下图可以找到本题所对应的值为:744,另外,在Linux中修改权限的命令用“chmod”,有这两个关键要素就可以知道D选项正确。
在这里插入图片描述
16. 以下说法错误的是:( )
A 4’b1111&&4’b00x0的结果为1
B 设计中不要使用“=”运算
C &4’b1011的运算结果为1-bit
D |运算的优先级别高于&
解析:
A选项是判断4’b1111和4’b00x0是否都为真,如果都为真则输出1bit的1,如果不都为真输出1bit的0。4’b1111显然为真,而4’b00x0中有x,所以不能准确判断是否为真**,所以A选项错误。**
B选项的三个等号的运算符我们很少见,没见过的以为是“
”多写了一个“=”号,其实“=”是合法的全等操作符,m === n是判断m和n全等吗,比较的结果为1bit,如果全等则为1,如果不全等则为0。另一个与之对应的全等操作符为“!”,m !== n是判断m和n不全等吗,比较的结果为1bit,如果不全等则为1,如果全等则为0,“===”可以使用,所以B选项错误。
C选项的区别&m是将m中所有比特相与,最后的结果为1bit,&4’b1011 = 1 & 0 &1 & 1 = 1’b0。所以C选项正确。
D选项考察了Verilog运算符优先级的问题,如下图所示一目了然,可以轻易判断出D选项错误。
在这里插入图片描述
17. 对于一个芯片而言,如下哪些参数的值越高越好:( )
A MTBF
B ATE pattern count
C Fault coverage
D Yield
解析:
MTBF(Mean Time Between Failure)为平均故障发生间隔时间,是衡量一个产品的可靠性指标,它反映了产品的时间质量,是体现产品在规定时间内保持功能的一种能力。具体来说,是指相邻两次故障之间的平均工作时间,也称为平均故障间隔,这个平均故障时间越久说明产品故障少的就是可靠性高,所以A选项正确。
ATE(Auto Test Equipment)pattern count为测试机台的测试pattern数量,pattern多意味着测试全面,所以B选项正确。
Fault coverage为故障覆盖率定义为在所有故障中检测到的故障的百分比,这个指标越高越好,100%是最好的效果,所以C选项正确。
Yield在IC中表示芯片的良率,即达到标称性能规格的器件或电路的百分比,这个指标是越高越好,所以D选项正确。

18. 在Verilog中,关于task和function描述正确的是( )
A task可以有时间延迟,function不可以
B function可以有时间延迟,task不可以
C task和function都不可以有时间延迟
D task和function都可以有时间延迟
解析:
关于Verilog中的任务(task)和函数(function)的共同点和不同点:函数一定不能包含任何延迟,事件或者时序控制声明语句;任务可以包含延迟,事件或者时序控制声明语句。所以只有A选项正确。

19. 如下电路的逻辑功能为:( )
在这里插入图片描述
A F=A+B B F=(A+B)’
C F=(A+B)’ D F=(A·B)’
解析:
上图是CMOS构成的门电路,电路由两部分组成,左边的是一个反相器结构(上面的是PMOS,下面的是NMOS),右边的是一个传输门结构(上面的是NMOS,下面的是PMOS),我们要求得的F刚好在两部分电路的中间。我们可以列出输出为A、B,输出为F的真值表,如下所示:
在这里插入图片描述
可以看出输出F实现了异或门的功能,所以答案选择A。

20. 对于有符号的4位二进制数运算0101+1000,其十进制结果为( )
A 12 B -3
C 13 D -4
解析
这题最关键的就是有符号二进制数1000对应的十进制数是多少,很多同学会误以为是0,而算不出正确的结果。学过数电的同学应该有印象,规定用1000作为-8的补码,而不用来表示-0,则1111就作为-8的反码,1000就作为-8的源码。这样上式就等价于5 + (-8) = -3,所以答案选择B。

21. 对于timing check,说法错误的是( )
A hold time可以是负数
B 用$setuphold可以检查setup和hold time
C setup time不可以是负数
D hold time表示时钟有效沿到来之前多久,数据data就需要保持稳定的时间
解析:
首先A选项说保持时间可以是负数,这是不对的,我们一定要注意区别“保持时间”和“保持时间余量”,保持时间不能为负数,在理想情况下为0;而保持时间余量是可以为负数,这时说明保持时间违例。C选项同理,所以A选项错误,C选项正确。
B选项正确
D选项是对建立时间的描述,保持时间的定义是时钟有效沿到来之后多久,数据data就需要保持稳定的时间。所以D选项错误。

22. 如下逻辑门可以表示任何的布尔表达式的是:( )
A XOR B NOR
C AND D NAND
解析:
首先我们应该知道用选项中的字母所代表的门电路的意思以及其对应的布尔表达式可以是怎样的。设A、B为输入,Y为输出。
XOR(异或门):Y = AB’ + A’B = ((A + B)’ +(A’ + B’)’)’ = (A’B’)’ (AB)’
NOR(或非门):Y = (A + B)’ = ((A’B’)’)’
AND(与门):Y = AB = ((AB)’)’ = (A’ + B’)’
NAND(与非门):Y = (AB)’ = ((A’ + B’)’)’
因为或非门和与非门都可以单独设计成非门,所以多余的非门都不用担心可以实现性,所以我们可以看出选项中的其他三个门都可以写成与非门或者或非门的形式,所以答案选择B、D。

23. 如下代码中,OUT的延迟为多少?( )
timescale 10ns/1ns assign #3.141 OUT=IN; A 3.141ns B 3.1ns C 31ns D 3ns’**解析:**timescale1ns/1ns //时间尺度预编译指令时间单位/时间精度
时间单位和时间精度由值1、10、和100以及单位s、ms、us、ns、ps和fs组成
时间单位:定义仿真过程所有与时间相关量的单位,仿真中使用 “#数字”表示延时相应时间单位的时间,例#10表示延时10个单位的时间,即10ns
时间精度:决定时间相关量的精度及仿真显示的最小刻度
`timescale1ns/10ps 精度0.01,#10.11表示延时10110ps

而下面这种写法就是错误的,因为时间单位不能比时间精度小
`timescale100ps/1ns
本题目设置的时间单位是10ns,时间精度是1ns,#3.141是延迟3.141个时间单位,也就是31.41ns,但是由于时间精度的控制,最终OUT的延迟为31ns**,所以C选项正确。**

24. 如下环形振荡器,假设每个反相器的传输延迟都为TPLH=0.05ns,TPHL=0.15ns,则振荡器的周期T为多少?( )
在这里插入图片描述
A 1ns B 0.25ns
C 0.75ns D 0.5ns
解析:
上图为一个简单的环形振荡器,由奇数个反相器输出端和输入端首尾相接构成,反相器的每一级都会进行一次取反。之所以使用奇数个反相器是因为偶数个(输入是什么输出就是什么)反相器会形成正反馈,会出现电路锁定问题,无法形成振荡。而奇数个(输出是输入的取反值)反相器形成负反馈,可以形成振荡。
环形振荡器的振荡周期(T) = 单个反相器延迟时间(Tpd) * 反相器个数(n) * 2,题目中给出值并不是Tpd,而是TPLH和TPHL,他们和Tpd之间的关系是:Tpd = (TPLH++TPHL)/2 = (0.05+0.15)/2ns= 0.1ns,图中的反相器个数为5,讲上面得数据带入公式得振荡周期T = (0.152)ns = 1ns,所以答案选A。

25. 一个RAM的大小为520*8bit,其地址需要多少位?( )
A 9 B 8
C11 D 10
解析:
因为512 = 2^9 < 520 <2^10 = 1024,所以地址最少需要10位,答案选择D。

26. 如下哪个是CMOS电路的动态功耗公式(其中CL表示输出负载,表示电路工作频率)( )
A Pd=1/2CLVDDf
B Pd=CL
VDDf
C Pd=CL
VDDVDDf
D Pd=1/2* CLVDDVDDf
解析:
动态功耗 = 开关功耗(也称为反转功耗、负载功耗)+ 短路功耗(也称为内部功耗)
开关功耗:电路在开关过程中对输出节点的负载电容充放电所消耗的功耗。有两种写法:P = 1/2
CLVDDVDDTr(Tr是输入信号翻转率)和P = CLVDDVDDf(f是时钟频率,一个周期反转2次);动态功耗与工作频率成正比,与负载电容成正比,与电压的平方成正比。所以答案选择C。
短路功耗:由于输入电压波形并不是理想的阶跃输入信号,有一定的上升时间和下降时间,在输入波形上升下降的过程中,在某个电压输入范围内,NMOS和PMOS管都导通,这时就会出现电源到地的直流导通电流,这就是开关过程中的短路功耗。

27. 以下总线中不是串行总线的是( )
A SDIO B SPI
C IIS D AHB
解析:
不能简单的将SDIO划分到并行总线或串行总线,要看它用的是哪种模式,所以这里暂时不选。
SPI(SerialPeripheral Interface)是摩托罗拉公司提出的同步串行总线方式。
IIS(Inter-IC Sound Bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。串行时钟SCLK,串行数据SDATA。
所以选择D选项。

28. 运算:
assign SUM=a[7:0]+b[7:0]+c[7:0]+d[7:0]+e[8:0],为了SUM没有溢出,SUM的位宽最小为多少( )

A 10 B 11
C 12 D13
解析:
a[7:0] + b[7:0]用9bit表示,c[7:0] +d[7:0]也用9bit表示,3个9bit数相加最小位宽应为11bit,所以本题答案是B。

29、芯片所讲的PPA是指:( )
A Patient,Pattern,Association
B Profession,Production,Activiation
C Performance,Power,Area
D Plenty,Pigs,Animal
解析:
PPA是Performance,Power,Area的简称,集成电路内部的微观概念所以答案选C。
PP是Application,Price,Property的简称,是集成电路宏观的概念。

30. 芯片测试一般包含:( )
A 工艺测试(线上参数测试)
B 晶圆测试(CP测试)
C 终测(FT测试)
D 功耗测试
解析:
芯片测试实际上是一个比较大的范畴,一般是从测试的对象上分为晶圆测试和最终测试,对象分别是尚未进行封装的芯片和已经封装好的芯片。为啥要分两段? 简单的说,因为封装也是有成本的,为了尽可能的节约成本,可能会在芯片封装前,先进行一部分的测试,以排除掉一些坏掉的芯片。而为了保证出厂的芯片都是没问题的。最终测试是芯片测试的最后一道拦截,也是必须的环节。所以答案选择B、C。

31. 请用Verilog RTL描述如下图设计:以clk为基准,设计一个秒计数器,在指定的计数值产生中断,实时输出当前的秒数计数值。
<1> clk是时钟输入,频率为32.768KHz。
<2> rst_n是异步复位输入,低电平有效,复位整个系统,为高则整个系统开始工作,其上升沿已经同步于clk。
<3> start是启动信号,一个clk时钟周期的正脉冲,同步于clk。alarm[7:0]是配置信息,单位为秒,同步于clk。
<4> 工作模式:收到start后,秒计数器sec_cnt从零开始以秒为单位来记述,计数到alarm[7:0]指定的数值时,产生一个int pluse(时钟周期的正脉冲),秒数计数器回零并停止。
在这里插入图片描述
第一步:题干中有效信息的获取与整理
(1)设计一个秒计数器,并实时输出当前的秒计数值。需要两个计数器:一个是用于技术1s时间的计数器,另一个是用于计数有多少个1s的计数器。
(2)32.768KHz比较容易产生分频以便于产生1s的时钟频率,因为32768刚好是2^15。
(3)异步复位,低电平有效
(4)start启动信号,alarm[7:0]输入信号配置信息
(5)工作模式,即收到start启动脉冲后,秒计数器sec_cnt从零开始以秒为单位来计数,计数到alarm[7:0]信号指定输入的数值时,产生一个int pluse(时钟周期的正脉冲),秒数计数器回零并停止。

第二步:详细的分析及波形图的绘制
我们使用Visio工具画波形图(绿色代表输入,黄色代表中间变量,红色代表输出)的方法来清晰的表达信号之间的相互关系,而真正笔试的时候我们完全可以在草稿纸上进行简易的手绘。首先根据框图画出四个输入信号,输入信号我们根据题目要求自己设定,时钟和复位我们很容易表达,start启动脉冲信号我们产生两次(之所以产生两次是因为第一次和第二次之间的连接部分的信号很容易出现问题,所以需要特别注意这些特殊位置各个信号的波形),对应的alarm输入信号我们一个设置为3,一个设置为4(设置为1、2数值太小表达效果不好,设置太大又会使整个波形图变得复杂),且当start启动脉冲信号有效时也要保证alarm输入信号是有效的,后面仿真我们也按照这个约定来产生输入激励对系统进行验证。所有的输入信号模拟的波形如下图所示:
在这里插入图片描述
根据从题目中获得的信息,我们需要先设计一个1s的计数器,且计数器当start启动脉冲信号有效时开始计数,计数器从0开始计数到32767的时间为1s,这个计数器一定是一个中间的寄存器变量,我们取名为cnt_1s。我们知道start启动脉冲信号仅仅是一个只存在一个时钟周期的脉冲信号,如果让它来作为cnt_1s秒计数器自加1的条件肯定是不可行的,因为那样cnt_1s秒计数器只会加一次,所以我们需要一个让cnt_1s秒计数器在start启动脉冲信号有效后一直计数的使能信号,我们将这个使能信号命名为cnt_en信号,这是整个题目继续做下去的一个关键点。使能信号的灵魂在于我们如何能够精准的控制它何时拉高、何时拉低。如下图所示,我们已经知道cnt_en使能信号拉高的条件是start启动脉冲信号有效,而拉低的具体条件现在还不能确定。cnt_en使能信号的起始和结束位置如下图所示
在这里插入图片描述
有了cnt_en使能信号我们就可以让cnt_1s秒计数器在start启动脉冲信号来到后开始计数,并且当start起始信号消失后cnt_1s秒计数器仍可继续进行计数,当cnt_en使能为低时或cnt_1s秒计数器计数到32767时cnt_1s秒计数器清零(计数满会自动溢出清零,代码中可不必关心)。计数器的灵魂就是在于我们如何能够精准的控制它何时计数、何时清零。
在这里插入图片描述
控制好cnt_1s秒计数器后接下来就该加上需要实时输出的sec_cnt秒个数计数器了,当start启动脉冲信号有效时sec_cnt计数器开始计数1s的个数,当cnt_1s秒计数器计数到32767时表示1s的计数已经完成同时sec_cnt计数器自加1,sec_cnt计数器计数到和alarm输入的值相等时清零,但是千万不要漏掉另外一个清零条件——cnt_1s秒计数器也要计数到32767,否则就会出现如下第一张图所示的错误,即在sec_int计数器计数最后一个秒的时间时根本不到1s的时间就清零了。同时我们也可以确定cnt_en使能信号拉低的条件了,即在cnt_1s秒计数器计数到32767且sec_cnt计数器计数到和alarm输入的值相等时拉低。第二张图是分析得出的正确结果。
在这里插入图片描述
在这里插入图片描述
还有最后一个int 输出脉冲信号没有产生,题目中给出的信息是sec_cnt计数器计数到和alarm输入的数值相等时产生脉冲,和上面分析sen_cnt信号时的情况一样我们还需要加上一个条件——cnt_1s秒计数器同时也需要计数到32767才能产生int脉冲,如下图所示,这样整个设计就是完全符合题目要求的了。
在这里插入图片描述
第三步:RTL代码的编写

module  sec_cnt_top
02#(
03parameter CNT_1S_WIDTH =4'd15
04)
05(
06input   wire           clk    ,  
07input   wire           rst_n  ,  
08input   wire           start  ,
09input   wire   [7:0] alarm  ,
10
11output  reg             int    ,
12output  reg   [31:0] sec_cnt   
13);
14
15reg                      cnt_en;
16reg     [CNT_1S_WIDTH:0]  cnt_1s;       //这里为了节省仿真时间我们设置成参数方便在仿真中直接修改而不影响综合时的RTL代码的结果,笔试的时候可以直接写15,同时省去2、3、4行的代码
17
18//cnt_en:计数器工作使能信号
19always@(posedge clk ornegedge rst_n)
20if(rst_n ==1'b0)   
21     cnt_en <=1'b0;
22else   if(start ==1'b1)
23     cnt_en <=1'b1;
24else   if(&cnt_1s ==1'b1&& sec_cnt == alarm)
25     cnt_en <=1'b0;
26               
27//cnt_1s:计数1s的计数器
28always@(posedge clk ornegedge rst_n)
29if(rst_n ==1'b0)
30     cnt_1s <=16'b0;
31else   if(cnt_en ==1'b1)
32     cnt_1s <= cnt_1s +1'b1;       
33    
34//sec_cnt:计数有多少个1s的计数器                   
35always@(posedge clk ornegedge rst_n)
36if(rst_n ==1'b0)
37     sec_cnt <=32'b0;
38else   if(&cnt_1s ==1'b1&& sec_cnt == alarm)
39     sec_cnt <=32'b0;
40else   if(&cnt_1s ==1'b1)
41     sec_cnt <= sec_cnt +1'b1;
42
43//int:计数到alarm指定的数值时,产生一个的脉冲标志信号
44always@(posedge clk ornegedge rst_n)
45if(rst_n ==1'b0)
46     int <=1'b0;
47else   if(&cnt_1s ==1'b1&& sec_cnt == alarm)  
48     int <=1'b1;
49else  
50     int <=1'b0;
51                      
52endmodule
//---------------------------------

第四步:Testbench代码的编写

01module  tb_sec_cnt_top();
02
03reg            clk;
04reg            rst_n;
05reg            start;
06reg     [7:0]  alarm;
07
08wire           int;
09wire    [31:0] sec_cnt;  
10
11//时钟、复位和信号的初始化
12initialbegin
13 clk    =1'b1;
14 rst_n <=1'b0;
15 start <=1'b0;
16 alarm <=8'd0;
17#20
18 rst_n  <=1'b1;
19end
20
21//输入信号的产生
22initialbegin
23#40
24//第一段
25 start <=1'b1;   
26 alarm <=8'd3;   
27#20
28 start <=1'b0;
29#1000
30//第二段
31 start <=1'b1;   
32 alarm <=8'd4;   
33#20
34 start <=1'b0;
35end
36
37//产生50MHz时钟,因为32.768KHz频率的时钟我们仿真不好产生,所以我们仿真的时候随便产生一个频率的时钟即可,因为计数的个数是确定的,所以不影响最终的仿真效果
38always#10 clk =~clk;      
39
40//实例化RTL模块
41 sec_cnt_top   
42#(
43.CNT_1S_WIDTH(4'd2)
44)
45 sec_cnt_top_inst(
46.clk   (clk   ),  //input           clk
47.rst_n(rst_n),  //input          rst_n
48.start(start),  //input          start
49.alarm(alarm),  //input    [7:0]  alarm
50                     
51.int   (int   ),  //output          int
52.sec_cnt(sec_cnt)//output   [31:0]sec_cnt
53);
54                  
55endmodule
//---------------------------------

第五步:ModelSim仿真验证
在这里插入图片描述
32. 锁存器(latch)和触发器(filp-flop)的概念和区别?为什么多用register。行为级描述中latch如何产生的?
解析:
1)锁存器是什么?
从概念上讲,锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值。简单而言,锁存器的输入有数据信号和使能信号,当处于使能状态时,输出随着输入变化而变化,当不处于使能状态时,输入信号怎么变化都不会影响输出。
2)触发器是什么?
触发器是对脉冲边沿敏感的器件,它的变化只会在时钟的上升沿或者下降沿到来的瞬间变化。
3)区别?
锁存器是电平触发的,触发器是边沿触发的。如果是电平触发的,当使能的时候,如果输入信号不稳定,那么输出就会出现毛刺。而触发器就不会出现这种情况,它的变化只会在边沿有效的时候触发。
4)register是什么?
register是寄存器,用来暂时存放参与运算的数据和运算结果。在实际的数字系统中,通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。由于触发器有记忆功能,因此利用触发器可以方便地构成寄存器。由于一个触发器能够存储一位二进制码,所以把n个触发器的时钟端口连接起来就能构成一个存储n位二进制码的寄存器。
5)为什么多用register?
换个角度讲,为什么少用latch呢?首先,latch是电平触发的,这样就容易产生毛刺;其次,latch将静态时序变得极其复杂;再者latch会浪费硬件资源(对FPGA而言)。因为FPGA当中,是没有latch单元的,要生成latch单元需要耗费其他资源。
以xilinx器件为例,如下图所示,是slice的结构,每个slice包含两列触发器,第一列只可以配置成触发器,第二列可以配置成锁存器和触发器,如果第二列的触发器被配置成锁存器,第一列触发器就不能用了。
在这里插入图片描述
6)latch是如何产生的?
网上大多数指出,由于if或者case语句的逻辑表达不完全产生的。其实就我个人而言,这样说并不完全正确。首先需要区分一点,我们定义一个类型的时候,单纯的定义reg或者wire其实并不代表它最终实现的真正类型,这得看我们写的代码,下面代码:
在这里插入图片描述
在这段代码里面,test1和test2都是定义为reg类型的,都放在了always语句块里面,除了触发条件不同,其他都相同,下面看看在Vivado综合之后的结果:
在这里插入图片描述
可以看到test2是综合成寄存器(触发器)的,而test1直接就“消失”了,被“安排”在了一个LUT“里面”,这也正说明,定义并不代表着最终的结果。在这里,always(*)里面的所谓“reg”,其实和wire没有区别,为了方便称呼,我把wire和这类“reg”统称作“类wire”。
前面铺垫了这个是为了什么呢?为了说明以下会产生latch的两种情况:
①类wire型的数据“自己等于自己”的情况下会产生latch;
②类wire型的数据,由于if或者case语句的逻辑表达不完全,会产生latch。

33. 设计一个电路,把A clock domain的一个单周期脉冲同步到B clockdomain,在B domain也为一个单周期脉冲(A、B是异步clock,且时钟周期关系不确定),画出电路图。
解析:
A(约300MHz)快B(100MHz)慢跨时钟域仿真波形图:
在这里插入图片描述
A(100MHz)慢B(约300MHz)快跨时钟域仿真波形图:
在这里插入图片描述
所以我们可以将如下所示的RTL代码综合出的电路图画出。
在这里插入图片描述
34. 图中电路共有三种器件:MUX,BUFFER,DFF,请分析并回答问题。
假设各电路的传出延时为:
TVIN:max delay:8ns;min delay:4ns
TBUF:max delay:2ns;min delay:1ns
TMUX:max delay:3ns;min delay:1ns
DFF:
Tclk-Q:max delay:4ns;min delay:1ns
TSETUP:4ns;THOLD:1.5ns
1)请问本电路是否存在hold time问题?如果有,请修改电路在不影响功能的前提下fixhold time问题。
2)请指出本电路setup time的关键路径,并求最高工作频率是多少?

在这里插入图片描述
1)题目中有两个寄存器F1和F2,和之前的时序分析模型不同,F1寄存器和F2寄存器之间有反馈回路且回路中还有逻辑电路,以及F2到F2自身也有反馈回路且回路中还有逻辑电路。所以我们要分别以F1和F2为对象来计算他们的保持时间余量。我们应该将快速模型参数代入保持时间余量公式:holdtime stack = ((Tco + Tdata) -△T) - Th中进行计算。
①当以F1为对象来分析F1到F2时,其保持时间余量holdtime stack(F1-F2) = ((Tco2 + Tdata) -△T) - Th= ((Tclk-Q + TMUX) - (TBUF - 0) - THOLD= ((1 + 1) - (2 - 0)) - 1.5ns = -1.5ns ≤ 0
②当以F2为对象来分析F2到F1时,其保持时间余量holdtime stack(F2-F1) = ((Tco1 + Tdata) -△T) - Th= ((Tclk-Q +( TBUF + TMUX)) - (0 - TBUF))- THOLD = ((1 + (1 + 1)) - (0 - 1)) - 1.5ns = 2.5ns ≥ 0
③当以F2为对象来分析F2到F2时,其保持时间余量holdtime stack(F2-F2) = ((Tco2 + Tdata) -△T) - Th= ((Tclk-Q +( TMUX + TBUF + TMUX))- (0 - 0)) - THOLD = ((1 + (1 + 1 + 1)) - (0 - 0)) - 1.5ns = 2.5ns ≥ 0
因为以F1为对象分析出的保持时间余量为负数,所以以F1为对象的保持时间违例,我们能做的就是在F2到F1之间的路径中加入两个BUF,既能满足以F1为对象的保持时间的时序要求又不影响电路的功能。
④另外题目中还给出了TVIN的值,所还要再计算相对于外部输入数据的保持时间余量holdtime stack(VIN) = ((Tdelay + Tdata) -△T) - Th= ((TVIN + TMUX) - (TBUF - 0) - THOLD= ((4 + 1) - (2 + 2 - 0)) - 1.5ns = -0.5ns ≤ 0,这样在不影响电路功能的情况下还需要在VIN到F1之间再加一个BUF。
综上两种加入BUF的情况,统一将BUF插入到MUX M1与寄存器F1之间的位置,就可以同时解决两处的保持时间违例了。
2)第二问是要指出setuptime关键路径(critical path),那什么是关键路径呢?关键路径简单的理解就是延迟最大的那条路径,所以我们要找出setup time中延迟最大的那条路径,这条路径决定了系统中时钟所能工作的最大频率。而关于建立时间相关问题的计算,我们应该将慢速模型参数代入建立时间余量公式:setuptime stack = (Tclk - (Tco + Tdata) + △T) -Tsu中进行计算。要求出频率,在理想情况下建立时间余量为0,但是往往要大于0,即(Tclk- (Tco + Tdata) + △T) -Tsu≥ 0,根据这个关系可以得出时钟的周期Tclk ≥ (Tco+ Tdata) - △T + Tsu
和第一问一样,同样有三条内部路径需要分析(因为题目中没有给外部时钟,所以不用考虑相对于外部输入数据的建立时间)。然后对比,找出延时最大的那条路径就是关键路径,并用此路径求出时钟的最高工作频率。
①当以F1为对象来分析F1到F2时,其路径如下所示,(Tco1+ Tdata) - △T + Tsu = ((Tclk-Q + (TBUF + TMUX))-(0 - TBUF) + TSETUP = ((4 + (2 + 3)) - (0 - 2)) + 4ns =15ns
在这里插入图片描述
②当以F2为对象来分析时F2到F1,其路径如下所示,(Tco2+ Tdata) - △T + Tsu = ((Tclk-Q + TMUX) - (TBUF- 0) + TSETUP = ((4 + 3) - (1 - 0)) + 4ns = 10ns
在这里插入图片描述
③当以F2为对象来分析F2到F2时,其路径如下所示,(Tco2+ Tdata) - △T + Tsu = ((Tclk-Q + (TMUX + TBUF +TMUX)) - (0 - 0) + TSETUP = ((4 + (3 + 2 + 3))- (0 - 0)) + 4ns = 16ns
在这里插入图片描述
综上所示,延时最长的为③,所以在理想情况下最高工作频率是Tclk ≥ 16ns = 62.5MHz

摘抄自达尔文说

猜你喜欢

转载自blog.csdn.net/gemengxia/article/details/108409881