笔试总结(三)

1、 Recovery check 和 Removal check的概念? 怎么保证不出现问题 ?(有关异步信号/异步复位)

对于一个异步复位寄存器来说,异步复位信号需要和时钟满足recovery time和removal time 才能有效进行复位和复位释放操作,防止输出亚稳态。

Recovery time:恢复时间
撤销复位时,恢复到非复位状态的电平必须在时钟有效沿来临之前的一段时间到来,才能保证有效地恢复到非复位状态,此段时间为recovery time。类似于同步时钟的setup time。在这里插入图片描述
如图所示,rst_n为0表示复位,clk上升沿触发,rst_n从0到1的上升沿与时钟上升沿之间地时间差必须不小于recovery time才能保证寄存器恢复到正常状态。

Removal time:去除时间
复位时,在时钟有效沿来临之后复位信号还需要保持的时间为去除时间removal time。类似同步时钟hold time。在这里插入图片描述
如图所示,rst_n为0表示复位有效,clk为上升沿触发,rst_n保持为0经过clk上升沿后仍需要保持一段时间,才能保证寄存器有效复位,防止亚稳态。

2、画出 Y=A+BC 的 COMS 电路?
在这里插入图片描述
在这里插入图片描述

3、画出 4 分频电路?在这里插入图片描述
4、画出 assign out = (a[3:0] != 4’b0001)的门电路?
a[3:0] == 4’b0001 -> out = 1’b0 ;
a[3:0] != 4’b0001 -> out = 1’b1 ;在这里插入图片描述
5、什么是virtual clock?
物理上不存在的Clock,用于设置input delay和output delay

6、STA有哪些缺点?
结果比较悲观,需要定义timing requirements和timing exceptions,很难处理异步电路

7、什么是removal time ?
对于异步信号释放时,其在上一个时钟边沿之后最少需要稳定的时间。

8、什么是recovery time ?
对于异步信号释放时,其在下一个时钟边沿之前最少需要稳定的时间。

9、为什么我们需要STA?
STA提供更加快速,更加简单的方式来检查设计中所有路径中的时序。

10、什么是Clock gating ?
clock gating是降低同步设计中动态功耗的技术。通过增加额外的逻辑来修剪clock tree.在这里插入图片描述
11、什么是uncertainty?
由于jitter和skew导致的时钟相对于理想位置的偏差

12、 什么是clock latency ?
从时钟源(clock source)到触发器clock pin的延时

13、 什么是slack ?
required time和arrival time之间的差

14、 什么是required time ?
在clock path上时钟到达的时间

15、 什么是arrival time ?
在 data path上数据到达的时间在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16、判断电路中会否存在竞争冒险的方法有哪些?(BCD)
A 观察法 B 实验法

C代数法 D 卡诺图法

如果某逻辑函数满足Y = AB + A’C,可以用代数法分析出当B = C = 1 时,Y = A + A’,会产生竞争-冒险现象。用卡诺图表示如下图所示,可以看出与逻辑函数相对应的卡诺图中存在相切的圈,而且相切圈所在的方格没有同时被一个圈包含,相切部分的公共值是B = C = 1,此时即使产生竞争-冒险现象的条件。这样我们就用卡诺图直观的把是否会产生竞争-冒险现象判断出来了。具体来说,利用卡诺图进行竞争-冒险现象判断的方法是:如果组合逻辑函数所对应的卡诺图中存在相切的圈,而且相切的方格又没有同时被另一个圈包含,则当变量组合在相切的方格之间变化时,存在竞争-冒险现象,所以D选项正确。在这里插入图片描述
17、以下哪些是典型FPGA器件内部的常用资源:(BCD )。(多选题)
A DRAM B LUT

C 时钟网络 D 寄存器

对FPGA稍有了解的朋友都知道FPGA内部有很多可供用户任意配置的资源,其中包括:可编程逻辑、可编程I/O、互连线、IP核等。我们以Intel(Altera)的EP4CE10F17C8芯片为例进行介绍。在这里插入图片描述
打开FPGA设计工程后,点击“Chip Planner”来查看这款FPGA芯片的版图模型在这里插入图片描述
打开后的版图模型如下所示,左边是未进行布局布线的图,因为资源未被使用所以都是浅色。右边是已经布局布线后的图,也就是已经将使用的资源映射到了版图模型上(只有全编译后才能看到映射效果),其中深色表示该资源已经被使用,而颜色越深的地方表示资源利用率越高。黑色区域为一些固定功能的资源或没有资源,用户不可对其进行任意配置。在这里插入图片描述
(1)逻辑阵列块(Logic Array Block,LAB):每个LAB由16个LE(Logic Element)组成,下图是两个已经映射资源后的LAB,资源利用率不同的LAB其颜色深浅也有所差异(左边使用的资源少,颜色就浅;右边使用的资源多,颜色就深)。在这里插入图片描述
放大后的LE如下图所示,每个LE主要由左边一个蓝色的查找表和右边一个红色的寄存器组成,所以B选项和D选项正确。整个芯片中共有10320个LE在这里插入图片描述
双击其中一个LE可以观察到其大致的内部结构(内部结构只有被使用才能够双击打开查看),我们可以看到主要的两个部分,一是左边的4输入查找表,另一个是可编程寄存器,还包括:数据选择器、进位链等。查找表和多路选择器完成组合逻辑功能,寄存器完成时序逻辑功能。(蓝色高亮的部分是已经使用的资源,未高亮灰色的部分是未被使用的资源)。在这里插入图片描述
这里的输入查找表类似于一个容量为16 bits 的 ROM(2^4 = 16)(工艺上是珍贵的 SRAM 资源,所以A选项错误),4表示地址输入位宽为4 bits,存储的内容作为输入对应的输出结果的逻辑运算,并在 FPGA 配置时载入。

上图红色①标注处为查找表:目前主流 FPGA 都采用了基于 SRAM 工艺的查找表结构。查找表本质上就是一个 RAM。当用户通过原理图或 HDL 语言描述了一个逻辑电路以后,FPGA 开发软件会自动计算逻辑电路的所有可能结果,列成一个真值表的形式,并把真值表(即输入对应的输出逻辑)事先写入RAM,这样每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。目前FPGA中多使用4输入的查找表,所以每一个查找表可以看成一个有4位地址线的RAM。

上图红色②标注处为寄存器:可以配置成多种工作方式,比如触发器或锁存器,同步复位或异步复位、复位高有效或低有效。

上图红色③标注处为进位链:超前进位加法器,方便加法器的实现,加快复杂加法的运算。

上图红色④标注处为数据选择器:数据选择器一般在 FPGA 配置后固定下来。

(2)用户可编程I/O(User I/Os,也被简称为IOE):可编程I/O资源分布在整个芯片的四周。该芯片共有256个管脚,除去一些固定功能的管脚,可供用户任意配置的管脚资源只有180个,下图是其中一个可编程I/O单元,里面又包含三个最小单元(每个可编程I/O单元中的最小单元个数不固定,有的包含两个,也有的包含四个)。在这里插入图片描述
下图为可编程I/O最小单元内部结构图,包括双向I/O缓冲器、OE寄存器、对齐寄存器、同步寄存器、DDR输出寄存器、三态门、延时模块等组成。在这里插入图片描述
为了便于管理和适应多种电器标准,FPGA 的 IOE 被划分为若干个组(Bank),每个 Bank 的接口标准由其接口电压 VCCO 决定,一个 Bank 只能有一种 VCCO,但不同 Bank 的 VCCO 可以不同。只有相同电气标准和物理特性的端口才能连接在一起,VCCO 电压相同是接口标准的基本条件。下图为我们开发板使用的EP4CE10F17C8芯片“Pin Planner”中用于管脚绑定的视图,我们可以看到整个图中被划分为8种不同的颜色,每种颜色代表不同的Bank。在这里插入图片描述
(3)互连线资源(Interconnect):布线资源连通 FPGA 内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA 芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为 4 类不同的类别:第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用于完成芯片 Bank 间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。下图中中蓝色高亮的连线为由LAB中的LE中的寄存器连接到IOE中的互连线。在这里插入图片描述
(4)嵌入式存储单元(Memory Bits,也被称为Block RAM或简称为BRAM):该部分资源主要用于生成RAM、ROM、FIFO以及移位寄存器等常用的存储模块,在存储较多数据或作跨时钟域处理时常用,BRAM 由一定数量固定大小的存储块构成的,使用 BRAM 资源不占用额外的逻辑资源,不过使用的时候消耗的 BRAM 资源只能是其块大小的整数倍,就算你只存了 1 bit 也要占用一个 BRAM。在这里插入图片描述
下图为一个M9K内部结构图。由输入输出寄存器和一个RAM块构成,该芯片共有423936bit存储单元,并以每9Kbit容量为一个块,共有46个,下图所示为一个M9K的RAM块。相对于LUT构成的分布式RAM(Distribute RAM,简称为DRAM),这种专门的存储单元并且速度快,容量更大,从而避免LUT资源的浪费,一般是 BRAM 资源不够用的情况下才使用分布式 RAM。在这里插入图片描述
(5)嵌入式乘法单元(Embedded multiPlier 9-bit elements,也简称为DSP块):该单元主要用于各种复杂的数学运算,乘法、除法以及常用的功能函数如:有限冲激响应滤波器(FIR),无限冲击响应滤波器(IIR),快速傅里叶变换(FFT),离散余弦变换(DCT)等时会消耗很多逻辑资源,而FPGA中的LUT和寄存器资源有限,这时候使用嵌入式乘法单元这部分资源就不会造成逻辑资源的浪费。该芯片共有46个DSP块,成列式分布在芯片的中间位置,下图为一对DSP块资源。在这里插入图片描述
下图为嵌入式乘法器单元DSP块的内部结构图。包含输入输出寄存器和一个乘数块。在这里插入图片描述
(6)锁相环(Phase Lock Loop,PLL):锁相环路是一种反馈控制电路,简称锁相环。锁相环的特点是利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。该芯片一共有两个锁相环,一个在右上角处附近,一个在左下角附近在这里插入图片描述
PLL的参考时钟输入都是由专用时钟管脚上的晶振进来的,用于时钟的倍频、分频,以及相位、占空比调制。PLL出来的时钟都会连接到全局时钟网络上,如下图所示就是通过全局时钟网络扇出到每个寄存器上的时钟线,全局时钟网络保证时钟的质量,减小时钟偏斜(Skew)和抖动(Jitter),所以C选项正确
在这里插入图片描述
18、以下关于Latch与Flip-Flop特性描述正确的是:(ACD)。(多选)

A Latch与Flip-Flop都属于时序逻辑

B Latch无时钟输入

C Filp-Flop只会在时钟触发沿采样当前输入产生输出

D Latch输出可能产生毛刺

Latch(锁存器):电平敏感的存储单元,数据存储的动作取决于输入时钟或者使能信号的电平值,仅当锁存器处于使能状态时,输出才会随数据输入发生变化,常用于异步电路系统中。因为Latch可以有时钟输入,但是用的是时钟的电平值而不是时钟的沿,所以B选项不正确。

Flip-Flop(触发器):边沿敏感的存储单元,数据存储的动作由时钟信号的上升沿或下降沿进行同步,常用于同步电路系统中,所以C选项正确

只有设计组合逻辑电路时才会产生Latch问题。但从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没有反馈电路,显然Latch不符合这些要求,所以A选项正确

Latch在同步时序电路设计中的就会有很多缺点:

1)Latch受所有的输入信号控制,只要输入信号变化,Latch就变化。也正因为如此,Latch很容易出现毛刺,所以D选项正确

2)Latch不能异步复位,上电后处于不定态;

3)还会让静态时序分析变得十分复杂;

4)在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用使用寄存器来组成锁存器所以会占用更多逻辑资源;

5)在ASIC设计中,锁存器也会带来额外的延时和DFT,并不利于提高系统的工作频率,所以要避免产生。

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 新华笔试题目C语言类试题主要包括以下几个题目: 1. 编写一个程序,输入一个整数n,输出从1到n之间的所有偶数。 解析:我们可以使用循环语句,每次迭代判断当前数字是否为偶数,并输出。代码如下: ```c #include <stdio.h> int main() { int n; printf("请输入一个整数n:"); scanf("%d", &n); printf("1到%d之间的所有偶数为:\n", n); for (int i = 1; i <= n; i++) { if(i % 2 == 0) { printf("%d ", i); } } return 0; } ``` 2. 编写一个程序,输入一个整数n,计算并输出前n个自然数的和。 解析:我们可以使用循环语句,在每次迭代中将当前数字累加到一个变量中,最后输出结果。代码如下: ```c #include <stdio.h> int main() { int n; printf("请输入一个整数n:"); scanf("%d", &n); int sum = 0; for (int i = 1; i <= n; i++) { sum += i; } printf("前%d个自然数的和为:%d\n", n, sum); return 0; } ``` 3. 编写一个程序,输入一个字符串,判断该字符串是否为回文串。 解析:我们可以使用两个指针,一个指向字符串的起始位置,另一个指向字符串的末尾位置,然后逐个比较字符是否相等。代码如下: ```c #include <stdio.h> #include <string.h> int main() { char str[100]; printf("请输入一个字符串:"); scanf("%s", str); int len = strlen(str); int i = 0; int j = len - 1; int isPalindrome = 1; while (i < j) { if (str[i] != str[j]) { isPalindrome = 0; break; } i++; j--; } if (isPalindrome) { printf("%s是一个回文串\n", str); } else { printf("%s不是一个回文串\n", str); } return 0; } ``` 以上是个常见的新华笔试题目C语言类试题的解答。根据题目要求,我们分别编写了相应的程序来实现功能,并给出了相应的输入输出示例。 ### 回答2: 新华是一家知名的IT企业,所以他们在招聘中一般都会包括C语言类试题来测试应聘者的编程技能。 C语言是一种广泛应用于系统开发和嵌入式系统的编程语言,掌握C语言对于程序员来说是非常重要的。下面是一道可能出现在新华笔试题目中的C语言类试题以及我给出的答案: 题目:编写一个C程序,实现计算并输出两个整数的和。 答案: ```c #include <stdio.h> int main() { int a, b, sum; printf("请输入第一个整数:"); scanf("%d", &a); printf("请输入第二个整数:"); scanf("%d", &b); sum = a + b; printf("两个整数的和为:%d\n", sum); return 0; } ``` 这段代码首先声明了个整型变量a、b和sum,分别用来存储两个整数和它们的和。然后通过printf函数向用户输出提示信息,并通过scanf函数接收用户输入的两个整数。接下来,将a和b相加的结果赋值给sum变量。最后,使用printf函数打印出两个整数的和。 这样,程序就能实现计算并输出两个整数的和的功能了。这道题旨在考察应聘者的基本的C语言编程能力和对输入输出的掌握程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值