数字ic笔试题分类整理

一.数字电路基础

1.1题目: bit,byte,word,dword,qword的区别

1 byte = 8 bit
1 word = 2 byte = 16 bit
1 dword = 2 word = 32 bit
1 qword = 2 dword = 64 bit

1.2题目:什么是原码,反码,以8bit为例,给出各自表示的数值范围

原码:符号位+真值,最高位表示符号位,以8bit为例
[+3]原 = 0000_0011
[-3]原 = 1000_0011
表示范围 -127~+127
原码中0000_0000和1000_0000都表示0

反码:正数的反码是他本身,负数的反码将其原码除符号位逐位取反。以8bit为例。
[+3]原 = [0000_0011]原 = [0000_0011]反
[-3]原 = [1000_0011]原 = [1111_1100]反
表示范围 -127~+127
原码中0000_0000和1111_1111都表示0

补码:正数的补码是他本身,负数的补码将其原码除符号位逐位取反再加1.以8bit为例。
[+3]原 = [0000_0011]原 = [0000_0011]反 = [0000_0011]补
[-3]原 = [1000_0011]原 = [1111_1100]反 = [1111_1101]补
表示范围 -128~+127
补码中0的表示只有一种形式,即0000_0000,1000_0000表示-128
(补码的最高位其实在运算中可以当做数值位,即权值为-2^7,最高位为0时,0与其相乘为0,1与其相乘为-128,所以1000_0000表示-128.这也是计算机运算均采用补码的原因)

1.3什么是冒险和竞争,如何消除?

下面这个电路,使用了两个逻辑门,一个非门和一个与门,本来在理想情况下F的输出应该是一直稳定的0输出,但是实际上每个门电路从输入到输出是一定会有时间延迟的,这个时间通常叫做电路的开关延迟。而且制作工艺、门的种类甚至制造时微小的工艺偏差,都会引起这个开关延迟时间的变化。
在这里插入图片描述
实际上如果算上逻辑门的延迟的话,那么F最后就会产生毛刺。信号由于经由不同路径传输到达某一汇合点的时间有先有后的现象,就称之为竞争,由于竞争现象所引起的电路输出发生瞬间错误的现象,就称之为冒险,FPGA设计中最简单的避免方法是尽量使用时序逻辑同步输入输出。

加滤波电容,消除毛刺的影响
加选通信号,避开毛刺
增加冗余项,消除逻辑冒险

1.4题目:锁存器(latch)和触发器(flip-flop)的区别?

电平敏感的存储器件称为锁存器。可分为高电平锁存器和低电平锁存器,用于不同时钟之间的信号同步。
有交叉耦合的门构成的双稳态的存储原件称为触发器。分为上升沿触发和下降沿触发,可以认为两个不同电平敏感的锁存器串联而成。前一个锁存器觉定了触发器的建立时间,后一个锁存器则决定了保持时间。
锁存器,触发器,寄存器的区别

1.5题目:MOORE与MEELEY状态机的特征?

Moore状态机的输出仅与当前状态值有关,且只在时钟边沿到来时才会有状态变化。
Mealy状态机的输出不仅与当前状态有关,而且与当前输入值有关。

1.6题目:半加器,全加器,行波进位加法器,超前进位加法器区别:

半加器:两个1bit数据相加,不包含进位。
在这里插入图片描述
全加器:包含进位,相当于三个1bit数据相加。
在这里插入图片描述
至于为啥或和异或一样的解释:因为AB为00,01,10时异或和或结果一样,但是11时或为1,异或为0,但是只影响到了后半部分的结果,AB的结果为1,最后的结果为1都一样,所以或和异或都行。

行波进位加法器:
以4bit的行波进位加法器为例,需要使用4个1bit加法器实现,如下图所示。在进行加法运算时,首先准备好的是1号全加器的3个input。而2、3、4号全加器的Cin全部来自前一个全加器的Cout,只有等到1号全加器运算完毕,2、3、4号全加器才能依次进行进位运算,最终得到结果。 这样进位输出,像波浪一样,依次从低位到高位传递, 最终产生结果的加法器,也因此得名为行波进位加法器(Ripple-Carry Adder,RCA)。
在这里插入图片描述

在这里插入图片描述
超前进位加法器:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.7题目:基本逻辑门

在这里插入图片描述

1.7 题目:逻辑电平

在这里插入图片描述

1.8题目:CMOS电平与TTL电平的区别:

在这里插入图片描述
在这里插入图片描述

1.9题目:低电平噪声容限

在这里插入图片描述

1.10题目:关于锁存器的使用,正确的说法是:

在这里插入图片描述
在这里插入图片描述

二.FPGA&ASIC常识及基本开发流程

2.1题目:简述ASIC设计流程,并列举各部分用到的工具

在这里插入图片描述
芯片架构:考虑芯片定义、工艺、封装。
RTL设计:使用verilog、system verilog、vhdl进行描述。
功能仿真:理想情况下的仿真
验证:UVM验证方法学,FPGA原型验证
综合:逻辑综合,将描述的RTL代码映射到基本逻辑单元门、触发器上
DFT技术:插入扫描链
等价性检查:使用形式验证技术。
STA:静态时序分析。
布局规划:保证没有太多的内部交互,避免布线上的拥堵和困扰。
时钟树综合:均匀的分配时钟,减少设计中不同部分的时钟偏移。
DRC:设计规则检查。
LVS:布线图和原理图进行比较。
生成GDSII

这整个流程称为RTL TO GDSII,利用GDSII来生成芯片的过程称作流片(Tapeout),以上是Fabless公司的简易设计流程,最后将GDSII送至Foundry生成芯片。

2.2题目:简述FPGA的开发流程

在这里插入图片描述
系统规划:系统功能,功能模块划分
RTL设计:使用verilog、system verilog、vhdl进行描述
功能仿真:理想情况下的仿真
综合、编译、布局布线:FPGA产商的自带工具完成
时序仿真:时序分析约束
板级验证

2.3题目:各种存储元件的名词解释

ROM:Read Only Memory,只读存储器,手机,计算机等设备的存储器,但现在得所说的ROM不只是Read Only,也是可以写入的。
RAM:Random Access Memory,随机存取存储器,手机,计算机的运行内存。
SRAM:Static Random-Access Memory,静态随机存储存储器,只要供电数据就会保持,但断电数据就会消失,也被称为Volatile Memory
DRAM:Dynamic Random Access Memry,动态随机存储器,主要原理是利用电容存储电荷的多少来代表一个bit是0还是1,由于晶体管的漏电电流现象,电容会放电,所以要周期性的给电容充电,叫刷新。SRAM不需要刷新也会保持数据,但是两者断电后数据都会消失,称为Volatile Memory
SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器,同步写入和读出数据的DRAM.
EEPROM:Electrically Erasable Programmable Read Only Memory ,电可擦除可编程只读存储器。
DDR:Double Data Synchronous Dynamic Access Memory,双倍速率同步动态随机存储器,双倍速率传输的SDRAM,在时钟的上升沿和下降沿都可以进行数据传输。我们电脑的内存条都是DDR芯片。
FLASH:Flash Memory,闪存,非易失性固态存储,如制成内存卡或U盘。

2.4题目:FPGA和CPLD的区别?

CPLDFPGA
内部结构Product term(基于乘积项)Look up Table(基于查找表)
程序存储内部EEPROM/FLASHSRAM,外挂EEPROM
资源类型组合逻辑资源丰富时序逻辑资源丰富
集成度
使用场合完成控制逻辑能完成比较复杂的算法
速度
其他资源PLL,RAM和乘法器
保密性可加密一般不可加密

2.5题目:FPGA中,LUT,CLB,BRAM,DRAM,Slice名词解释:

LUT叫做查找表,LUT的本质就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成有4位地址线的16*1的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容然后输出即可。

Slice是基本逻辑单位,实现加、乘等算术逻辑以及进位逻辑等。每个slice包含有4个6输入查找表(LUT)、三个多路复用器、8bit进位链、8个DFF。

CLB是FPGA基本逻辑单元,CLB由多个(一般4个或者2个)相同的Slice和附加逻辑构成。每个CLB模块不仅实现组合逻辑、时序逻辑、还可以配置成分布式RAM和分布式ROM。
DRAM(Distributed RAM)叫做分布式RAM,用LUT实现,用于实现少量数据的存储和缓存,存储速度高于块RAM(BRAM),DRAM可以使用纯组合逻辑,即给出地址马上出数据,也可以加上register变成有时钟的RAM,而BRAM一定是有时钟的。

BRAM(block ram)叫做块RAM,是内嵌于FPGA的,容量较大,18K为一块,有若干块,可以实现双口RAM,常用于大量数据存储,也用于不同数据宽度的转换,也可以配置成FIFO使用。

2.6题目:CMOS逻辑门设计

见这篇文章cmos知识

2.7题目:FIFO最小深度计算

这个博文讲的特别详细fifo最小深度计算

2.8题目:PN结

这个博客讲的很好

PN结加正向电压时,其正向电流为?a 多子扩散
a.多子扩散
b.少子扩散
c.少子飘移
d.多子飘移

首先要知道扩散和飘移的区别:
扩散是载流子在浓度差的作用下的运动称之为扩散运动,物质有从高浓度地方从低浓度地方流动的趋势。
飘移是载流子在电场作用下的运动称之为漂移运动。

pn结的形成是首先多子扩散形成内部电场,而内部电场的方向为pn结反方向从而抑制多子扩散,接下来,少子在内电场作用下,发生漂移运动,又使得空间电荷区缩短。但是在最后,多子和少子的数目达到动态的平衡,也就形成了PN结。而外部正向电压就是外加正向电场从而打破内部电场的抑制。

2.9题目:一下哪些活动是属于DFT的内容:

在这里插入图片描述
在这里插入图片描述

2.10 Xilinx 7系列FPGA中,关于Slice说法错误的是?

在这里插入图片描述

在这里插入图片描述

2.11题目:下列关于可编程I/O说法错误的是?

在这里插入图片描述
在这里插入图片描述

2.12题目:假如两个寄存器间的组合逻辑的延迟大于时钟周期该如何解决?

在这里插入图片描述

2.13题目:简述ASIC flow中综合工具的作用是什么?综合的结果主要关注什么指标?

ASIC流程中综合使用到的工具为 Design Compiler,
综合(Synthesis)=转换(translation)+映射(mapping)+优化(optimization)
转换:将RTL电路转换为与工艺无关的通用门级网表GTECH,例如布尔逻辑,与或非门;
映射:将转换后的门电路映射到特定工艺库上,例如TSMC48nm工艺;
优化:添加时序、面积、功耗等方面约束,生成理想中的电路。

指标主要包括面积,时序和功耗等。

三.时序逻辑电路基础

3.1题目:什么是同步逻辑和异步逻辑?

同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。
在电路中同一个时钟源的时钟分频出来的不同频率的时钟作用于两部分电路,这两部分电路也是同步的。反之,不同时钟源的电路就是异步电路。
同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来时,电路状态才能改变。改变后的状态将一直保持到下一时钟脉冲的到来,此时无论外部输入有无变化,状态表中的每个状态都是稳定的。
异步时序逻辑电路的特点:电路中除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储文件,电路中没有统一的时钟,电路状态的改变由外部输入的变化直接引起。

3.2题目:同步电路和异步电路的区别:

同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。
异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,只有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。

3.3题目:时序设计的实质:

时序设计的实质就是满足每一个触发器的建立/b保持时间的要求。

3.4题目:建立时间和保持时间的概念?

建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。
保持时间:触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。

3.5题目:为什么触发器要满足建立时间和保持时间?

因为触发器内部数据的形成是需要一定的时间的,如果不满足建立时间和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能稳定。

3.6题目:什么是亚稳态?为什么两级触发器可以防止亚稳态传播?

这是个异步电路同步化的问题。亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。使用两级触发器来使异步电路同化的电路其实叫做‘一位同步器’,他只能用来对一位异步信号进行同步。两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立保持时间,他在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间,同步器有效的条件:第一级触发器进入亚稳态后的恢复时间+第二级触发器的建立时间<=时间周期。

解决亚稳态的方法有:
降低系统时钟
用更快的FF
引入同步机制
改善时钟质量

3.7系统最高速度计算(最快时钟频率)和流水线设计思想:

同步电路的速度是指同步系统时钟的速度,同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间内处理的数据量就越大。假设Tco是触发器的输入数据被时钟打入到触发器到数据到达触发器输出端的延时时间,Tdelay是组合逻辑的延时,Tsetup是触发器的建立时间。假设数据已被时钟打入D触发器,那么数据到达第一个触发器的Q输出端需要的延时时间是Tco,经过组合逻辑的延时时间为Tdelay,然后到达第二个触发器的D端,要希望时钟能在第二个触发器再次稳定地打入触发器,则时钟的延迟必须大于Tco + Tdelay + Tsetup,也就是说最小的时钟周期Tmin = Tco + Tdelay + Tsetup ,即最快的时钟频率Fmax = 1/Tmin。FPGA开发软件也是通过这种方法来计算系统最高运行速度Fmax。因为Tco和Tsetup是由具体的器件工艺设计决定的。故设计电路时只能改变组合逻辑的延时时间Tdelay,所以说缩短触发器间组合逻辑的延时时间是提高同步电路速度的关键所在。由于一般同步电路都大于一级锁存,而要使电路稳定工作,时钟周期必须满足最大延时要求。故只有缩短最长延时路劲,才能提高电路的工作频率。可以将较大的组合逻辑分解为较小的N块,通过适当的方法平均分配组合逻辑,然后在中间插入触发器,并和原触发器使用相同的时钟,就可以在避免两个触发器之间出现过大的延时,消除速度瓶颈,这样可以提高电路的工作频率,这就是所谓的“流水线”技术的基本设计思想,注意,流水线设计会在原数据通路上加入延时,;另外硬件面积也会增加。

3.8题目:对于多位的异步信号如何进行同步?

对于一位的异步信号可以使用“一位同步器”(使用两级触发器),而对于多位的异步信号,可以采用如下方法:1.可以采用保持寄存器加握手信号的方法(多数据,控制,地址);2:特殊的具体应用电路结构,根据应用的不同而不同;3;异步FIFO.

3.9题目:静态、动态时序模拟的优缺点?

静态时序分析是采用穷尽方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。它不需要输入向量就能穷尽所以的路径,且运行速度很快,占用内存较小,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多的背用在数字集成电路的验证中。
动态时序模拟就是通常的仿真,因为不可能产生完备的测试向量,覆盖门级网表中的每一条路径,因此在动态时序分析中,无法暴露一些路径上的存在的时序问题

3.10题目:transition time,propagation delay等参数的定义

Transition Time(转换时间):输入和输出信号,上升时间:从10%Vdd上升到90%Vdd的时间,下降时间:从90%Vdd下降到10%Vdd的时间。上升时间和下降时间统称为Transition Time。
在这里插入图片描述
Propagation Delay(传播延时):在输入信号变化到超过50%Vdd到输出信号变化到超过50%Vdd之间的时间。
在这里插入图片描述
Setuo Time:在时钟沿来临前,输入信号的变化超过50%Vdd的时间到时钟变化超过50%Vdd的时间中,输入信号保持稳定的最小时间。
在这里插入图片描述
Hold Time:在时钟沿来临后,输入信号的变化超过50%Vdd的时间到时钟变化超过50%Vdd的时间中,输入信号保持稳定的最小时间。
在这里插入图片描述
Recovery Time:复位或者置位信号变化超过50%Vdd的时间到时钟变化超过50%Vdd的时间中,时钟沿来临的前最小时间,保证复位或置位完成。
在这里插入图片描述
Removal Time:复位或者置位信号变化超过50%Vdd的时间到时钟变化超过50%Vdd的时间中,时钟沿来临的后最小时间,保证置位或复位完成。
在这里插入图片描述
Minimum Pulse Width:最小脉冲宽度就是信号上升沿超过50%Vdd到下降沿变化低于50%Vdd时,测量高电平的最小脉冲宽度,低电平最小宽度同理。
在这里插入图片描述

3.11题目:最小周期计算:

在这里插入图片描述

3.12题目:什么是Clock Jitter和Clock Skew,这两者有什么区别?

时钟抖动(Clock Jitter):指芯片的某一个给定点上时钟周期发生暂时性变化,是的时钟周期在不同的周期上可能加长或缩短。
时钟偏移(Clock Skew):是由于布线长度及负载不同引起的,导致同一个时钟信号到达相邻两个时序单元的时间不一致。
区别:Jitter 是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。Skew是由不同布线长度导致的不同路径的时钟上升沿到来的延时不同。

3.13题目:什么事高阻态?

高阻态:电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级的话,对下一级电路无任何影响,可以理解为断路,不被任何东西所驱动,也不驱动任何东西。

3.14题目:编写状态机时采用二进制码,独热码,格雷码的优缺点:

在这里插入图片描述

3.15题目:伪路径:False_Path

在这里插入图片描述

3.16题目:对解决亚稳态问题有效果的方法是

在这里插入图片描述

四.verilog代码相关

4.1题目:HDL语言的层次概念:

HDL语言是分层次的、类型的。最常用的层次概念有系统与标准级,功能模块级,行为级,寄存器传输和门级。系统级,算法级,RTL级(行为级),门级,开关级。

4.2题目:reg和wire的区别

reg是寄存器类型可以存储数据,wire是线网型
reg型在always块和initial块中赋值,wire型用assign赋值
reg型可用于时序和组合逻辑赋值,wire型只能用于组合逻辑赋值
wire表示直通,即只要输入有变化,输出马上出现结果,reg表示一定要有触发,输出才会反映输入。

4.3题目:localparam、parameter、和define的区别?

在这里插入图片描述

4.4三段式状态机的写法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


module fsm_3(input clk,
             input rst,
             input din,
             output reg detect

    );
    
    parameter S0 = 2'd0;
    parameter S1 = 2'd1;
    parameter S2 = 2'd2;
    
    reg [1:0] cur_state;//当前状态
    reg [1:0] nxt_state;//下一状态
    
    //第一段,为时序逻辑,该段功能为用寄存器寄存当前状态机状态
    always@(posedge clk or posedge rst)begin
        if(rst)
            cur_state <= S0;
        else
            cur_state <= nxt_state;
    end
    
    //第二段,为组合逻辑,该段功能描述状态是如何转换的
    always@(*)begin
        case(cur_state)
            S0:begin
                if(din)
                    nxt_state = S1;
                else
                    nxt_state = S0;
                end
            S1:begin
                if(din)
                    nxt_state = S2;
                else
                    nxt_state = S0;  
                end
            S2:begin
                if(din)
                     nxt_state = S2;
                else
                     nxt_state = S0; 
                end       
            default:
                nxt_state = S0;
        endcase
        end     
        
        //第三段,一般为时序逻辑,根据状态机的状态输出结果
        always@(posedge clk or posedge rst)begin
            if(rst)
                detect <= 1'b0;
            else if(nxt_state == S2)
                detect <= 1'b1;
            else
                detect <= 1'b0;
        end
          
               
    
endmodule

在这里插入图片描述
仿真波形:
在这里插入图片描述
当第三段的判断条件改为cur_state == s2时,仿真波形如下:
在这里插入图片描述
可以看到一个是一检测到第二个1时detect直接升高,一个是在检测到第二个1时在下一个时钟周期detect升高。

关于第三段是使用时序逻辑还是组合逻辑应该都行。

4.5单bit信号亚稳态降低(两级触发器)

module example(input clk,
               input rst,
               input data_in);

    reg data_d1;
    reg data_d2;

    always@(posedge clk or negedge rst)begin
        if(rst)begin
            data_d1<=0;
            data_d2<=0;
        end
        else begin
            data_d1<=data_in;
            data_d2<=data_d1;
        end
    end
endmodule

4.5题目:编写Verilog代码描述跨时钟域信号传输,慢时钟域到快时钟域

在慢时钟域内的一个脉冲信号,持续一个时钟周期,将其传输到快时钟域内:

这个问题,直接使用一个单比特同步器即可,因为快时钟一定能采样到慢时钟域内的信号,我们用两级寄存器进行同步的目的在于消除亚稳态问题,也就是说如果慢时钟域内的脉冲恰好在快时钟域的亚稳态窗口内,快时钟采样时刻(上升沿)采样得到的信号有可能出现亚稳态,再用触发器寄存一拍,可以大大降低最终输出出现亚稳态的概率。

最后如果也需要得到一个周期的脉冲,做一次时钟上升沿检测即可。

module slow2fast_cdc(
	input clka,
	input clkb,
	input rst_n,
	input pulse_ina,
	output pulse_outb
    );
	
	reg pulse_midb_r1, pulse_midb_r2;
	always@(posedge clkb or negedge rst_n) begin
		if(~rst_n) begin
			pulse_midb_r1 <= 0;
			pulse_midb_r2 <= 0;
		end
		else begin
			pulse_midb_r1 <= pulse_ina;
			pulse_midb_r2 <= pulse_midb_r1;
		end
	
	end
	
	assign pulse_outb = ~pulse_midb_r2 & pulse_midb_r1;
	
	
endmodule
    

在这里插入图片描述

4.6题目:编写Verilog代码描述跨时钟域信号传输,快时钟域到慢时钟域

从快时钟域clka到慢时钟域clkb,如果快时钟域内的一个脉冲信号持续一个时钟周期,如何同步到慢时钟域内呢?

这里存在一个问题是快时钟采样不到慢时钟域内输入脉冲的一个情况,对于这种问题,我们的通用方法为:

简单说来,就是在快时钟域内先进行脉冲展宽,展宽到快时钟内能采样到为止;展宽之后的信号在快时钟域clkb下用两级寄存器同步下就好了,再用上升沿检测检测到同步后的信号得到一个时钟clkb周期的脉冲,表示同步完成。

module Sync_Pulse(
    input           clka,
    input           clkb,
    input           rst_n,
    input           pulse_ina,
    output          pulse_outb,
    output          signal_outb
);
//-------------------------------------------------------
reg             signal_a;
reg             signal_b;
reg             signal_b_r;
reg             signal_b_rr;
reg             signal_a_r;
reg             signal_a_rr;
//-------------------------------------------------------
//在clka下,生成展宽信号signal_a
always @(posedge clka or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_a <= 1'b0;
    end
    else if(pulse_ina == 1'b1)begin
        signal_a <= 1'b1;
    end
    else if(signal_a_rr == 1'b1)
        signal_a <= 1'b0;
    else 
        signal_a <= signal_a;
end
//-------------------------------------------------------
//在clkb下同步signal_a
always @(posedge clkb or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_b <= 1'b0;
    end
    else begin
        signal_b <= signal_a;
    end
end
//-------------------------------------------------------
//在clkb下生成脉冲信号和输出信号
always @(posedge clkb or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_b_r <= 'b0;
        signal_b_rr <= 'b0;
    end
    else begin
        signal_b_rr <= signal_b_r;
        signal_b_r <= signal_b;
    end
end
assign    pulse_outb = ~signal_b_rr & signal_b_r;
assign    signal_outb = signal_b_rr;
//-------------------------------------------------------
//在clka下采集signal_b_rr,生成signal_a_rr用于反馈拉低signal_a
always @(posedge clka or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_a_r <= 'b0;
        signal_a_rr <= 'b0;
    end
    else begin
        signal_a_rr <= signal_a_r;
        signal_a_r <= signal_b_rr;
    end
end
endmodule

在这里插入图片描述

另一种编写方式:
单bit信号跨时钟域传输

4.8题目:用verilog实现1bit信号边沿检测功能,输出一个周期的脉冲信号。

module  edge_detect(input clk,
                    input rst_n,
                    input data,
                    output pos_edge,
                    output neg_edge,
                    output data_edge);
    reg [1:0] data_r;
    
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            data_r <= 2'b00;
        end
        else begin
            data_r <= {data_r[0],data};
        end
     end
     assign pos_edge = ~data_r[1]&data_r[0];
     assign neg_edge = data_r[1]&(~data_r[0]);
     assign data_edge = pos_edge | neg_edge;
     
 endmodule
`timescale 1ns / 1ps

 
 
module sim_s2f_cdc(
 
    );
	
	reg clk;
	reg rst_n;
	reg data;
	wire pos_edge;
	wire neg_edge;
	wire data_edge;
	
	initial begin
		clk = 0;
		forever
		#2 clk = ~ clk;
	end
	

	
	initial begin
		rst_n = 0;
		data = 0;
		
		#10
		rst_n = 1;
		
		#10
		@(posedge clk)
		data = 1;
		@(posedge clk)
		data = 0;
 
	end
	
	edge_detect inst_slow2fast(
	.clk(clk),
	.rst_n(rst_n),
	.data(data),
	.pos_edge(pos_edge),
	.neg_edge(neg_edge),
	.data_edge(data_edge)
	
	);
	
	
	
	
endmodule

在这里插入图片描述

4.9题目:用verilog实现glitch free时钟切换电路,输入sel,clk0,clk1,sel为1时输出clk0,sel为0时输出clk1。

1.首先看下有毛刺的写法:

assign outclk = (clk1 & select) | (~select & clk0);

电路:
在这里插入图片描述
在这里插入图片描述
2.下图针对的是两个时钟源频率成倍数关系。在每个时钟源的选择路径中插入一个下降沿触发的D触发器,这样可以保证上面的情况被避免,确保在切换时钟源时,即使任意时钟处于高电平,也不会引起输出的变换,时钟源切换时,这个反馈能保证一个时钟被完全取消选择后,输出传播另一个时钟,从而避免产生任何毛刺.

reg     out1;
 reg     out0;
 always @(negedge clk1 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out1 <= 0;
     end
     else begin
         out1 <= ~out0 & select;
     end
 end

 always @(negedge clk0 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out0 <= 0;
     end
     else begin
         out0 <= ~select & ~out1;
     end
 end
 
 assign outclk = (out1 & clk1) | (out0 & clk0);

在这里插入图片描述

当SELECT为0时,明显CLK1的那部分通路到输出无效,仅仅看下半部分电路即可,在CLK0的下降沿采样SELECT(取反后)信号,与CLK0相与之后输出;

当SELECT为1时,同理上半部分电路有效;

以后都不是问题,需要重点分析的是当SELECT在任意时刻切换的时候,输出会不会出现毛刺?
当SELECT由0转换为1时,在CLK0的下降沿来临之前,DFF0的输出依然为1保持不变,此时输出仍为CLK0,当CLK0的下降沿到来时,DFF0的输出为0,此时下半部分电路无效,上半部分电路的输入为1,但在CLK1的下降沿来临前,DFF1的输出依旧为0,保持不变,此时outclock输出为0,当CLK1的下降沿来临时,此时outclock的输出为clk1。
在这里插入图片描述
3.针对两个异步时钟源的切换,这个方法是在第二种方法的基础上,在选择路径上再插入一个上升沿触发D触发器,这是为了针对对两个异步时钟源产生的反馈信号以及异步信号SELECT,对选择信号进行同步处理,这样即使是两个异步的时钟源进行切换,也可以避免亚稳态的产生。
在这里插入图片描述

reg     out_r1;
 reg     out1;
 reg     out_r0;
 reg     out0;
 
 always @(posedge clk1 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out_r1 <= 0;
     end
     else begin
         out_r1 <= ~out0 & select;
     end
 end
 
 always @(negedge clk1 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out1 <= 0;
     end
     else begin
         out1 <= out_r1;
     end
 end
 
 always @(posedge clk0 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out_r0 <= 0;
     end
     else begin
         out_r0 <= ~select & ~out1;
     end
 end
 
 always @(negedge clk0 or negedge rst_n)begin
     if(rst_n == 1'b0)begin
         out0 <= 0;
     end
     else begin
         out0 <= out_r0;
     end
 end
 
 assign outclk = (out1 & clk1) | (out0 & clk0);

4.10题目:verilog实现串并转换

串转并:我这个实现为每输入四位串行数据,输出一个并行数据

module c2b(input clk,
           input rst_n,
           input data_i,
           output reg[3:0] data_o);
           
           reg [2:0] cnt;
           always@(posedge clk or negedge rst_n)begin
                if(!rst_n)begin
                    data_o <= 4'b0000;
                    cnt <= 3'b000;
                end
                else begin
                    if(cnt < 4)begin
                        data_o <= {data_o[2:0],data_i};
                        cnt <= cnt + 1;
                    end
                    else begin
                        data_o <= {3'b000,data_i};
                        cnt <= 3'b001;
                    end
                end

            end


endmodule
`timescale 1ns / 1ps

 
 
module sim_s2f_cdc(
 
    );
	
	reg clk;
	reg rst_n;
	reg data_i;
	wire [3:0]data_o;

	
	initial begin
		clk = 0;
		forever
		#2 clk = ~ clk;
	end
	

	
	initial begin
		rst_n = 0;
		data_i = 0;
		
		#10
		rst_n = 1;
		
		#14
		@(posedge clk)
		data_i = 1;
		@(posedge clk)
		data_i = 0;
		@(posedge clk)
        data_i = 1;
        @(posedge clk)
        data_i = 0;
        @(posedge clk)
        data_i = 1;
        @(posedge clk)
        data_i = 1;
         @(posedge clk)
        data_i = 1;
        @(posedge clk)
        data_i = 0;
         @(posedge clk)
        data_i = 1;
        @(posedge clk)
        data_i = 0;
        @(posedge clk)
        data_i = 1;
        @(posedge clk)
        data_i = 1;       
	end
	
	c2b inst_slow2fast(
	.clk(clk),
	.rst_n(rst_n),
	.data_i(data_i),
    .data_o(data_o)	
	);
	
	
	
	
endmodule

在这里插入图片描述
串行输入1010,1110,1011仿真结果正确

并串转换:

module b2c(input clk,
           input rst_n,
           input [3:0] data_i,
           output reg data_o);
           

           reg [2:0] cnt;
           
           

           always@(posedge clk or negedge rst_n)begin
                if(!rst_n)begin
                    data_o <= 0;
                    cnt <= 3'b000;
                end
                else begin
                    if(cnt < 4)begin
                        data_o <= data_i[3-cnt];
                        cnt <= cnt + 1;
                    end
                    else begin
                        data_o <= data_i[3];
                        cnt <= 3'b001;
                    end
                end

            end


endmodule
`timescale 1ns / 1ps

 
 
module sim_s2f_cdc(
 
    );
	
	reg clk;
	reg rst_n;
	reg [3:0]data_i;
	wire data_o;

	
	initial begin
		clk = 0;
		forever
		#2 clk = ~ clk;
	end
	

	
	initial begin
		rst_n = 0;
		data_i = 0;
		
		#10
		rst_n = 1;
		
		#14
		@(posedge clk)
		data_i = 4'b1010;
		
		#14
		@(posedge clk)
		data_i = 4'b1110;
		
		#14
		@(posedge clk)
        data_i = 4'b1011;
    
	end
	
	b2c inst_slow2fast(
	.clk(clk),
	.rst_n(rst_n),
	.data_i(data_i),
    .data_o(data_o)	
	);
	
	

在这里插入图片描述

4.13题目:verilog实现约翰逊(Johnson)计数器

约翰逊计数器简介:
约翰逊(扭环形)计数器是基于移位寄存器的计数器,用N个寄存器表示2N个状态,请设计一个4位约翰逊计数器,和格雷码有点类似,相邻两个状态之间只有1bit是不同的。

在这里插入图片描述

module johnson_cnt(
	input wire clk,
	input wire rst_n,
	output reg [3:0] out
	);

	always_ff @(posedge clk or negedge rst_n) begin : proc_out
		if(~rst_n) begin
			out <= 'd0;
		end else begin
			out <= {~out[0], out[3:1]} ;
		end
	end

endmodule

4.14题目:异步复位同步撤离:

在这里插入图片描述


always @ (posedge clk, negedge rst_async_n)  
if (!rst_async_n) begin   
rst_s1 <= 1'b0;  
rst_s2 <= 1'b0;  
end  
else begin  
rst_s1 <= 1'b1;  
rst_s2 <= rst_s1;  
end  
 
assign rst_sync_n = rst_s2;   

在这里插入图片描述

4.15题目:fifo的设计:

fifo设计主要是看满信号与读信号产生,异步fifo还有二进制码与格雷码的转换
同步fifo同步fifo

同步fifo的满空信号可以有两种方法:
1.设计一个额外的计数器,这会要求额外的硬件:
在这里插入图片描述
2.直接通过读写地址比较:
在这里插入图片描述
在这里插入图片描述

异步fifo异步fifo

异步fifo满空信号主要通过设置额外的一位地址位,且转换为格雷码进行比较,当完全相同时为空,前两位不同,后两位相同为满。

4.16题目:verilog实现奇数分频

偶数分频我们只需要借助原时钟的上升沿或者下降沿进行计数分频,但是要实现奇数分频我们就要同时利用原时钟的上升沿和下降沿。可以通过原时钟的上升沿和下降沿计数产生clk1和clk2,再通过clk1和clk2的关系实现奇数分频。这种关系可以是或、与、异或,详细如下所述。

clk1和clk2特征:
3分频:高电平:低电平 = 1:2。
2N+1分频:高电平:低电平 = N:N+1
这个代码为3分频

module div_three
(
	input		clk,
	input		rst_n,
	
	output		clk_div3

);

reg	[3:0]	cnt_1;//上升沿计数
reg	[3:0]	cnt_2;//下降沿计数
reg			clk_1;
reg			clk_2;

assign		clk_div3 = clk_1 | clk_2;

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	begin
		cnt_1 		<= 4'd0;
		clk_1		<= 1'b0;
	end
	else
	begin
		cnt_1		<= (cnt_1 == 4'd2)?4'd0:cnt_1+4'd1;
		clk_1		<= (cnt_1 == 4'd1)?1'b1:1'b0;
	end
end

always@(negedge clk or negedge rst_n)
begin
	if(!rst_n)
	begin
		cnt_2 		<= 4'd0;
		clk_2		<= 1'b0;
	end
	else
	begin
		cnt_2		<= (cnt_2 == 4'd2)?4'd0:cnt_2+4'd1;
		clk_2		<= (cnt_2 == 4'd1)?1'b1:1'b0;
	end
end

endmodule

在这里插入图片描述

详细可见博客奇数分频

4.16题目:generate…for语句:

在这里插入图片描述

在这里插入图片描述bit_reberse为模块名字

4.17题目:函数和任务

function的使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
任务和函数的区别:
在这里插入图片描述
在这里插入图片描述

4.18题目:以下Verilog运算符优先级由高到低正确

在这里插入图片描述

4.19题目:多bit信号跨时钟域传输

在这里插入图片描述在这里插入图片描述

总体思路是先将数据有效信号先同步(这里就是单bit信号跨时钟域同步问题,由慢时钟到快时钟打两拍,由快时钟到慢时钟先延长信号再同步),同步完数据有效信号后,再在同步的时钟域判断数据有效信号是否有效(是否为1),若有效就同步数据信号

五.计算机组成原理

5.1题目:下列微处理器哪个是16位处理器

在这里插入图片描述

5.2题目: 主机与设备传输数据时,采用哪种方式CPU效率最高:

在这里插入图片描述

5.3题目:典型的5级流水线RSIC结构中,5级流水线的功能分别是:

在这里插入图片描述

六.模电

6.1想要去除信号的50Hz干扰,可以选择哪种滤波器?

在这里插入图片描述

6.2题目:稳压管:

在这里插入图片描述

七.信号

7.1题目:信号无失真传输条件

在这里插入图片描述

八.验证相关

8.1题目:下面哪种不属于验证覆盖率

在这里插入图片描述

8.2题目:netlist一般通过什么手段进行验证其正确性?

在这里插入图片描述

九.低功耗

9.1题目:下列功耗措施哪个可以降低峰值功耗?

在这里插入图片描述

9.2题目:CMOS反相器的功耗主要包括哪几部分?分别与哪些因素相关?

Ptotal = Pdynamic + Pshort + Pleakage

Pdynamic是电路翻转产生的动态功耗。
Pshort是P管和N管同时导通时产生的短路功耗
Pleakage是由扩散区和衬底之间的反向偏置漏电电流引起的静态功耗。
静态功耗:CMOS反相器在静态时,P、N管只有一个导通。由于没有Vdd到Gnd的直流通路,所以CMOS的静态功耗应该等于零。但实际上,由于扩散区和衬底的PN结存在反向漏电电流,所以会产生静态功耗。
短路功耗:CMOS电路在‘0’和‘1’的转换过程中,P、N管会同时导通,产生一个由Vdd到Vss窄脉冲电流,由此引起功耗。
动态功耗:C_L这个CMOS反相器的输出负载电容,由NOMS和PMOS晶体管的漏扩散电容、连线电容和扇出门的输入电容组成。

9.3题目:FPGA低功耗策略:

1.门控时钟。
2.划分时钟区域
在这里插入图片描述
在这里插入图片描述
3.RAM的时钟使能
在这里插入图片描述
4.使用双沿触发器:
在这里插入图片描述

5.CMOS的导通电流:
在这里插入图片描述
在这里插入图片描述
6.减少供电电压
在这里插入图片描述
7.改变I/O的终端方式
在这里插入图片描述

9.4 题目:逻辑电路低功耗设计中,无效的方法是

0

9.5题目:如下哪个是CMOS电路的动态功耗公式?

在这里插入图片描述

  • 16
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 海思数字IC是华为公司旗下的半导体芯片品牌,也是国内领先的芯片设计制造商之一。海思数字IC的笔试题目涵盖了计算机体系结构、数字电路设计、信号处理等多个方面的知识。 在笔试题中,可能会涉及到数字逻辑设计的基本理论和实践,例如布尔代数、逻辑门、时序电路等内容。此外,还可能会考察与芯片设计相关的数据结构与算法知识,如树、图、排序算法等。 另外,海思数字IC的笔试题还会关注到计算机体系结构方面的知识,例如指令集、流水线、缓存等内容。此外,由于海思数字IC主要用于通信领域,可能还会考察与信号处理相关的知识,包括滤波器设计、时频分析、数字信号处理等。 总之,海思数字IC的笔试题目涵盖了芯片设计中的多个方面,考察了应聘者对数字电路设计、计算机体系结构和信号处理等知识的掌握程度。准备参加海思数字IC的笔试,需要对这些知识有深入的理解,并能够灵活运用到实际的问题中。 ### 回答2: 海思数字IC试题通常涉及数字电路设计、逻辑设计、计算机体系结构、信号处理等方面的内容。以下是一个例子题目: 题目:设计一个4位计数器,要求每1秒顺序计数0、1、2、3、0、1、2、3……,并使用Verilog语言实现。 解答: Verilog代码如下: module counter ( input clk, output reg [3:0] count ); always @ (posedge clk) begin if (count == 3) count <= 0; else count <= count + 1; end endmodule 该代码定义了一个模块counter,它有一个时钟输入clk和一个4位输出count。使用always块来描述计数器的行为,当时钟上升沿到来时,计数器递增。当count等于3时,归零重新开始计数。 这样,每1秒钟,count会循环计数0、1、2、3,然后重新从0开始计数。 以上是一个对海思数字IC试题的回答,具体题目可能有所不同,但一般都和数字电路设计、逻辑设计等相关,需要结合具体题目进行回答。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值