FPGA杂记(二)

1、反相器
非门实现的是逻辑功能为 out = -in, 即将输入信号做一个反向,故也称为反相器。其门级示意图如下:FPGA杂记(二)_第1张图片
FPGA杂记(二)_第2张图片
相应的CMOS结构如下:由一个PMOS和NMOS组成,PMOS做上拉,与VDD相连;NMOS做下拉,与GND相连。FPGA杂记(二)_第3张图片
简单分析一下我们要实现的功能,无非就是当 in 为 0 (低电平)时,out输出为1(高电平),即out跟电源VDD相连;当 in 为 1(高电平)时,out输出为0(低电平),即out要跟GND(地)相连。故上面的非门CMOS电路的等效电路如下:当in 为0时开关k1闭合,k2打开,即out与VDD相连,输出为1;当in 为1时开关k1打开,k2闭合,即out与GND相连,输出为0。FPGA杂记(二)_第4张图片
故PMOS相当于一个开关,如下当G端为低电平时,D端与S端才连通;
FPGA杂记(二)_第5张图片

故NMOS相当于一个开关,如下当G端为高电平时,D端与S端才连通;
FPGA杂记(二)_第6张图片
拓展:现在常见的数字集成电路其底层的基本逻辑电路都是由CMOS结构构成。上拉逻辑部分由PMOS组成,下拉逻辑部分由NMOS组成。反相器就是一个最基本的CMOS逻辑电路,上拉部分只有一个PMOS,下拉部分只有一个NMOS。

2、或非门
只要有一个输入为1(高电平),那么下拉网络就导通,使得out与地相连,输出为0。根据这个要求,故下拉网络由两个NMOS管并联。NMOS管只有当G端为1时,D与S两端才导通,故两个NMOS管并联,有一个管子导通,那么out就跟地端相连了,符合要求。
FPGA杂记(二)_第7张图片
那么怎么由CMOS结构实现或门呢?
答:在或非门后面加个反相器。

为什么不能如下图所示,由NMOS做上拉网络,而PMOS做下拉网络实现或逻辑呢?
FPGA杂记(二)_第8张图片
答:因为NMOS做上拉网络会有阈值损失,PMOS做下拉网络也会有阈值损失

3、与非门
只要当两个输入都为1时(高电平),那么下拉网络才导通,使得out与地相连,输出为0。根据这个要求,故下拉网络由两个NMOS管串联。NMOS管只有当G端为1时,D与S两端才导通,故两个NMOS管串联,当两个NMOS管都导通,out才跟地端相连了,符合要求。
FPGA杂记(二)_第9张图片
4、 静态时序分析可以用于异步电路分析和跨时钟域信号的分析吗?不可以的话,原因是什么呢?
答:不可以。我们利用静态时序分析寄存器的建立、保持时间是否满足要求时,有一个重要前提是数据发射到数据采集的时间差是已知且固定的(不考虑时钟skew和抖动),即Tcycle(时钟周期)。但是对于异步电路或者跨时钟域的电路来说,数据发射寄存器与数据采集寄存器不在同一个时钟域,发射与采集沿时间关系不明确,故而对于目的时钟域的寄存器(数据采集寄存器)来说数据何时会在D端变化,无法判断,故而无法进行静态时序分析。

5、照上面一道问题的分析, 那么CDC电路,目的时钟域的寄存器怎么解决亚稳态问题呢?
答:亚稳态是没办法解决的,只能是说想办法解决亚稳态带来的影响。

6.、怎么消除CDC产生的亚稳态带来的问题呢?
答:我想大家都知道,那就是在目的时钟域打两拍,也就是在目的时钟域将跨时钟的信号,通过目的时钟域的寄存器打两拍,以消除亚稳态的传播。比如A为跨时钟域信号,送到clk_B时钟域(目的时钟域时钟),经过clk_B时钟域的两个寄存器之后,再将C作为最后的信号送到后面的组合逻辑电路里面。FPGA杂记(二)_第10张图片
7、 为什么打两拍就可以解决亚稳态的传播呢?是否跟工作时钟频率有关?
答:寄存器采样到无效电平后,实际电路中极小的噪声或者环境的变化都会使得寄存器脱离亚稳态,所以只要等待足够大小的时间就可以减小亚稳态的不良影响。而使用同步器就可以起到延时一个周期的作用。当然如果工作频率过高那么可能就需要多打几拍。

8、什么是控制交互信号?
答:控制交互信号用于作为控制指示信号,比如当某个电路模块有数据输入端口data,但是电路不可能每个时钟周期都对端口输入的数据做处理,那一般上一级电路会同时给出一个指示信号,比如in_valid,用于表示当前端口data输入的数据是有效的,电路需要对其进行采集或做运算处理。同样的对于电路模块输出数据时,也需要给出类似的信号,表明当前输出端口的数据是否有效,例如o_valid信号等。
还有就是比如像FIFO,RAM的读写使能信号,用于控制FIFO,RAM是否需要正常进行工作;读写控制信号用于指示是读还是写操作行为。以及总线的一系列控制信号等,CPU的指令等等,都可以说是控制信号。常用于作为控制模块产生控制信号的就是状态机。
总结一下,就是没有控制信号只有运算电路,电路就是块板砖,我行我素,无任何意义,当我们设计电路模块的时候,往往最先需要搞明白的就是本电路模块的交互控制接口的时序。

9、 跨时钟域时,控制信号从慢时钟域(时钟频率较小)到快时钟域(时钟频率较大)快递时会存在什么问题呢?
答:如下图所示,CLK1为慢时钟域的时钟,IN_VALID信号由慢时钟域电路生成,比如用于指示DATA(由CLK1时钟域电路生成)的有效,或者指示完成一次运算。原本IN_VALID在CLK1时钟域下只有一个脉冲宽度,表示完成一次运算。但是跨时钟域传递到CLK2(快时钟域下),CLK2由于频率较快,多个上升沿都采集到IN_VALID为高,在CLK1时钟域下就会误以为完成了多次运算(或者连续多个DATA为有效的)。FPGA杂记(二)_第11张图片
10、 上述问题怎么解决呢?
答:如果需要跨时钟域的控制信号不会出现多个脉冲连续为高的情况的话,则可以在快时钟域通过边沿检测电路解决。电路如下。将最后的IN_VALID_CLK2作为最后的控制信号。
FPGA杂记(二)_第12张图片
FPGA杂记(二)_第13张图片
11、如果IN_VALID有多个连续的为高电平的情况怎么办?
答:如果IN_VALID是用来传递数据的,用来指示DATA有效的,则可以采用一个异步FIFO将数据进行缓存,将IN_VALID作为FIFO的写使能信号。如若是其他的这种情况则需要按情况来定制电路。

12、上升沿检测:
FPGA杂记(二)_第14张图片

13、下降沿检测:
FPGA杂记(二)_第15张图片

14、边沿检测:FPGA杂记(二)_第16张图片
15、快时钟域到慢时钟域
跨时钟域的时候,如果IN_VALID(在CLK1时钟域下产生)信号的一个高脉冲需要从CLK1快时钟域传递到CLK2慢时钟域时,如果电路仅仅是通过同步器打两拍,如下图所示。IN_VALID由原始逻辑产生。FPGA杂记(二)_第17张图片
其出现的后果可能如下图所示。由于CLK1的一个周期太短,在CLK2时钟域的时钟有效沿(上升沿)根本采不到IN_VALID的高电平。从而出现信号丢失。FPGA杂记(二)_第18张图片
解决方法1:脉宽拓展
如果CLK1与CLK2的频率相差不大,并且IN_VALID两个连续的高脉冲间隔时间够长(两个有效脉冲间隔时间必须大于CLK2的时钟周期)。则可以通过脉冲拓宽电路解决。如下图所示。其中红色框框部分就是添加的脉冲拓宽电路。这里的示例由于CLK1没有比CLK2的频率大到两倍,故只需要拓宽一拍,将其脉冲宽度时间变成两个CLK1的周期即可。FPGA杂记(二)_第19张图片
如果需要传递的脉冲为低电平有效的,则将或门变成与门即可。
如果CLK1的频率比CLK2频率大于2倍,小于3倍,则需要多加一级寄存器,同时将或门变成三输入或门,使其脉宽拓展3倍。

解决方法2:握手交互
原始的逻辑电路不变,添加部分电路即可。如下图添加的红色框框部分电路为反馈保持电路,绿色部分为反馈信号在CLK1时钟域下的同步器。FPGA杂记(二)_第20张图片
其中的红色部分电路的思路就是:
1. 当IN_VALID_O(红色寄存器的输出)为低时,保持CG_CLK不关闭,使得IN_VALID信号一直处于被采样;
2. 一旦采集到IN_VALID的高电平之后,立即关闭CG_CLK,使得红色寄存器的输出不受组合逻辑的干扰;
3. 直到CLK2时钟域下的同步器正确采样到IN_VALID_O的高电平,并反馈回来的IN_VALID_FB为高时(此时完成一次信号握手传递)才再次打开CG_CLK,恢复对IN_VALID的采样。

你可能感兴趣的:(FPGA杂记(二))