关于亚稳态的知识可以参考硬件架构的艺术第一章
以及这篇整理的关于亚稳态的文章:亚稳态
上面的文章提到的一篇经典文章:
亚稳态的定义
亚稳态是指由于采样时间不足,触发器无法在某个规定时间段内达到一个可确认的状态。
来自高性能FPGA系统P18
- 同步时序电路和异步时序电路都可能产生亚稳态
- 异步时序电路更容易产生亚稳态
- 同步时序电路也可能产生亚稳态,原因是两个组合逻辑之间延时过大,导致建立时间不满足
进入亚稳态会有什么现象
当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
如何减少亚稳态的发生
- 打两拍
也就是同步的方式,引入同步机制,防止亚稳态的传播
- 降低系统时钟频率
- 用反应更快的触发器
- 改善时钟质量,用边沿变化快速的时钟信号
亚稳态的危害
- 如果不能在一个周期内返回到亚稳态,那么目的寄存器也会发生亚稳态
- 亚稳态的毛刺直接输出,可能导致系统错误(CPU中断错误响应)
- 采样到错误的电平,导致系统功能错误(独热码出现非法状态)
可以参考硬件架构的艺术第二章
同步复位和异步复位的区别
-
同步复位在时钟沿变化时,完成复位动作
-
异步复位不管时钟,只要复位信号满足条件,就完成复位动作
-
异步复位对复位信号要求比较高,不能有毛刺,如果其与时钟关系不确定,也可能出现亚稳态
注:要知道同步复位和异步复位的RTL电路图怎么画
同步复位
优点:
- 抗干扰强,可剔除复位信号中的毛刺
- 有利于静态时序分析工具进行分析
- 有利于仿真
缺点
- 占用更多的逻辑资源
- 复位信号宽度必须大于一个时钟周期,且很难保证复位信号到达各个寄存器的时序
- 复位信号依赖于时钟,如果时钟出现问题,则无法复位
异步复位
优点:
- 无需额外的逻辑资源,实现简单,可以保证复位引脚到各个寄存器的时钟偏斜最小
- 复位信号不依赖于时钟
缺点:
- 复位信号容易受外界干扰,且对电路内的毛刺敏感
- 复位信号释放的随机性,可能导致亚稳态
移除异步复位的问题
如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前使异步控制信号变无效,如果你想让某个时钟沿不起作用,那么你就应该在“去除时间”过后使控制信号变无效。如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的。
来自高性能FPGA系统P11
-
恢复时间
复位信号无效到时钟翻转的时间,也就是复位信号撤除,到时钟上升沿之间的时间。
是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
-
去除时间
时钟边沿之后复位信号任然保持有效的时间。
去除时间(Removal)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。
下面这个PPT总结了跨时钟常用处理方法:
以及根据PPT总结的文档:
不同的时钟域之间信号通信时需要进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。
-
单bit
打两拍,也就是采用两级触发器来同步
也叫电平同步器,相关同步器资料
- 低频向高频
- 高频向低频(需要展宽电路)
-
多bit
- 格雷码转换
- 异步FIFO
- 采用握手信号
它可以简单的定义为:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分析。分析的最终结果当然是要求系统时序满足设计者提出的要求。
因此,有些说法是错误的,不分什么情况就说时序不收敛,其实在不加约束的情况下谈时序约束是没有意义的。
-
静态时序分析
静态时序分析是采用穷尽分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。它不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中。
-
动态时序分析
动态时序模拟就是通常的仿真,因为不可能产生完备的测试向量,覆盖门级网表中的每一条路径。因此在动态时序分析中,无法暴露一些路径上可能存在的时序问题。
时序设计的实质
时序设计的实质就是满足每一个触发器的建立/保持时间的要求。
时序约束
通过附加时序约束可以综合布线工具调整映射和布局布线,使设计达到时序要求。
时序约束是指在逻辑综合、布局布线或者静态时序分析时,在综合工具、布局布线(P&R)工具或静态时序分析( STA)工具中指定信号的频率/周期、占空比、时延等约束条件, EDA 工具根据设定的约束条件来工作。
时序约束主要包括:
-
周期约束
-
偏移约束
-
静态时序路径
静态时序路径就是:那些时序路径的约束
一般来说,添加约束的原则为先附加全局约束,再补充局部约束,而且局部约束比较宽松。其目的是在可能的地方尽量放松约束,提高布线成功概率,减少ISE布局布线时间。
典型的全局约束包括周期约束和偏移约束。需要根据时钟频率划分不同的时钟域,添加各自的周期约束;然后对输入输出端口信号添加偏移约束。
-
全局约束
-
周期约束
周期约束是附加在时钟网络上的基本时序约束,以保证时钟区域内所有同步组件的时序满足要求
-
偏移约束
偏移约束是一类基本时序约束,规定了外部时钟和数据输入输出引脚之间的相对时序关系,只能用于端口信号,不能用于内部信号,包括
OFFSET_IN_BEFORE
,OFFSET_IN_AFTER
,OFFSET_OUT_BEFORE
,OFFSET_OUT_AFTER
等4类基本约束 -
分组约束
分组约束可有效管理大量的触发器、寄存器和存储器单元。将其分为不同的组,每组附加各自的约束,在大型设计中有着广泛的应用。
TNM/TNM_NET
约束用于选出可构成一个分组的元件,并对其重新命名,然后整体添加约束。除了IBUFG
和BUFG
外,所有的FPGA内部元件都可以用TNM
来命名。TIMEGRP
用于分组合并和拆分,将多个分组形成一个新的分组。
-
-
局部约束
局部约束包括
FROM_TO
约束、最大延时约束、最大偏移约束、虚假约束、系统时钟抖动约束、多周期路径和多时钟域约束等。在实际开发中,时序是设计出来的,而不是靠约束自动得到的。
时序路径:
- 从输入端口到触发器的数据D端 PAD_TO_SETUP
- 从触发器的时钟CLK端到触发器的数据D端 CLOCK_TO_SETUP
- 从触发器的时钟CLK端到输出端口 CLOCK_TO_PAD
- 从输入端口到输出端口 PAD_TO_PAD
基本策略
时序约束的一般策略是先附加全局约束,然后对快速和慢速例外路径附加专门约束。附加全局约束时,首先定义设计的所有时钟,对各时钟域内的同步元件进行分组,对分组附加周期约束、对全组合逻辑的PAD_TO_PAD路径附加约束。附加专门约束时,首先约束分组之间的路径,然后约束块、慢速例外路径和多周期路径,以及其他特殊路径。
时序分析
时序分析主要是通过查看软件生成的时序报告。里面包含了四个部分:
TIMING CONSTRAINTS能看到时序约束覆盖的全部路径,以及那些不满足的路径。
DATA SHEET REPORT可以查看到每个IO引脚的建立时间、保持时间和时钟输出时间。
TIMING SUMMARY也就是总结,里面给出了时序错误和时序分数。还能从中查看到时序分析的统计,比如总共分析了多少路径。有多少个时序错误。如果给0分,则代表没有错误,如果分数很小,说明离成功不远了,如果很大,则表示有很多时序错误。
TIMING REPORT DESCRIPTION给出了时序描述报告,里面没什么具体的内容。
时序报告会给出每个约束及其最长延迟路径。软件可以查看到不同时期的综合报告,比如综合后,或者布局布线后。最准确的是布局布线后的时序报告,除了逻辑延迟是准确的,布线延迟也是基于布局和扇出计算出来的。
观察时序报告的目的就是找到时序错误,找出原因,对症下药,找到对应的解决方法。时序约束是否满足要求主要就是看SLACK值,如果为正代表满足约束,如果为负代表时序错误。这时就需要重点关注了。
时序性能是FPGA设计最重要的指标之一。造成时序性能差的根本原因有很多,但其直接原因可分为三类:布局较差、逻辑级数过多以及信号扇出过高。下面通过时序分析实例来定位原因并给出相应的解决方案。
下面将三种情况的解决方法:
观察时序报告要注意逻辑延迟和布线延迟所占的百分比。
-
(布局较差)比如发现某根信号的延迟很大,但是扇出很小,这时候可以使用交叉探查查看布线情况,就能很清楚的看到走线的情况,了解为什么延迟这么大。这种情况可以:
- 改变布局的努力级别
- 使用SMARTXPLORER
- 使用PLANAHEAD工具进行区域约束
-
(信号扇出过高)又比如如果发现某个网络扇出特别大,造成布线延迟所占比例特别大,这个时候可以考虑用寄存器复制的方法。对高扇出造成的布线延迟过长问题最有效的解决办法就是寄存器复制。
-
(逻辑级数过多)如果发现数据路径的逻辑级太大了。实现工具在解决这个问题上起不到多大作用。这往往是由于不合适的代码造成。最简单的解决办法就是找到这个代码的位置,加入流水线以减少逻辑级数。
-
具体解决时序失败的方法还包括:
- 查看这个路径是否是多周期路径。什么是多周期路径?例如,A寄存器输出的数据要被B寄存器捕获,加入AB之间存在很多逻辑计算,导致一个周期内A的数据经过这很多的逻辑计算是完不成的,在下一个时钟的上升沿到来时,B还不能取这个数据,必须再等待一个或多个周期然后才去取数。多周期约束就是告诉还要再等布线器,你不必再尽心尽力的按照以前单周期(1个CLK)去布线,设计者在写程序已经考虑到了,这样布线器就不会提示布线不通过。当AB的时钟不一致时也是一个道理,我就不具体分析了。缺点是:相当于降低了时钟频率。
- 检查有没有使用if或者case的多层嵌套
- 保证综合的时候使用了合理的约束
时序性能差的根本原因
-
布局较差
如果布线延迟相比于逻辑延迟大了很多,那么失败的原因就是布局布线效果较差导致的,可以在ISE中调整布局的努力程度,或者重新对设计的区域进行区域约束,或者更换芯片(少发生)
-
逻辑级数过多
如果逻辑延迟占总延时的很大一部分时间,那么可能就是逻辑级数过高导致的。这种时候ISE实现工具是没有任何改善的,只能通过修改代码来提高性能。解决的方法有:a. 使用流水线技术,在组合逻辑中插入寄存器,简化原有的逻辑结构;b. 检查路径是否是多周期路径,如果是,添加相应的多周期约束;c. 养成良好的编码习惯,不要嵌套if语句或case语句,尽量用case语句代替if语句
-
信号扇出过高
如果发现某一个信号扇出很高,导致的布线延迟很大,解决方法有:通过逻辑复制的方法来降低信号的高扇出。可在HDL代码中手动复制或通过综合工具中设置达到目的(用genvar其实就是逻辑复制),可通过区域约束,将相关逻辑放置在一起
-
其他注意事项
不要使用同一信号的双沿触发电路,如果使用了双边沿,那么软件会自动改信号2倍频,然后使用第一个沿来处理上升沿,利用第二个沿来处理下降沿来处理下降沿,在时序分析时,约束会自动升级为ucf中约束值的两倍
FPGA最优时序解决方案,要充分利用FPGA内部自身的架构来进行约束,比如对于xilinx器件,进位链是垂直分布的,硬核单元基本都是按列分布的。因此,最优方案就是将控制信号的IO至于器件顶部或底部,垂直布置,数据总线的IO置于器件的左边或右边,且水平布置。因此数据流水平,控制流垂直可最大限度的利用芯片底层架构。
FPGA流水线
关于FPGA流水线的文章:FPGA流水线
流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存中间数据的方法。
目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小,所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)
FPGA逻辑级数
一级逻辑延迟包括一级LUT延迟和一级连接布线延迟
FPGA设计流程参考:高性能FPGA系统P1
SOC设计流程参考:SOC设计方法与实现_第3版.pdf
自顶向下
设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。
设计流程
-
需求分析
-
结构设计
-
实现
-
设计输入
原理图输入
硬件描述语言HDL
-
功能仿真
也称前仿真
此时仿真没有延迟信息,处于理想状态
-
逻辑综合
生成网表
将高级抽象层次的描述转化成较低层次的描述,即将设计输入编译成由与或非们,ram,触发器等基本逻辑单元组成的逻辑连接网表,而且真实的门级电路
-
综合后仿真
这一步骤不能估计线延迟,只能估计门电路延迟,和布线后的实际情况存在一定的差距
-
映射和布局布线
-
映射
将综合生成的逻辑网表对应到具体的FPGA芯片功能单元上
-
布局
将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上
-
布线
根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确的连接各个元件
-
-
时序仿真
也称后仿真
包括布局布线的延迟,时序仿真包含的延迟信息最全,也最精确,能较好的反映芯片的实际工作情况
-
静态时序分析STA
-
-
验证
-
可编程逻辑功能模块CLB(Configurable Logic Blocks)
-
可编程输入输出模块IOB(Input/Output Blocks)
-
可编程内部互连资源PI(Programmable Interconnection)
-
全局布线资源
用于芯片内部全局时钟,和全局复位、置位的布线
-
长线资源
用以完成芯片bank间的高速信号和第二全局时钟信号的布线
-
短线资源
完成基本逻辑单元之间的逻辑互联和连线
-
分布式的布线资源
用于专有时钟、复位等控制逻辑线
-
-
存储器资源(Block RAM 和 Select RAM)
-
数字时钟管理单元(分频/倍频、数字延迟)
-
I/O多电平标准兼容(Select I/O)
-
算数运算单元(乘法器、加法器)
-
特殊功能模块(MAC等硬IP核)
-
微处理器(PPC405等硬处理器)
参考:FPGA和ASIC的区别
-
FPGA
现场可编程门阵列
既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点
-
ASIC
特定应用集成电路
在集成电路界ASIC被认为是一种为专门目的而设计的集成电路。是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。
ASIC在批量生产时与通用集成电路相比具有体积更小、功耗更低、可靠性提高、保密性增强、成本降低等优点
正如其名称所表示的,这是因特定目的而创建的设备,一旦设计制造完成后电路就固定了,无法再改变。
可编程偏上系统(SOPC)是一种特殊的嵌入式系统,首先它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能;其次,它是可编程系统,具有灵活的设计方式,可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。
SOPC结合了SOC和FPGA各自的优点,一般具备以下基本特征:
- 至少包含一个嵌入式处理器内核
- 具有小容量片内高速RAM资源
- 丰富的IP Core资源可供选择
- 足够的片上可编程逻辑资源
- 处理器调试接口和FPGA编程接口
- 可能包含部分可编程模拟电路
- 单芯片、低功耗、微封装
最好的时钟方案
由专用的全局时钟输入引脚驱动单个全局时钟,并用后者去控制设计中的每一个触发器。这样能使时延和抖动都最小。
xilinx fpga中的全局时钟采用全铜工艺实现,并设计了专用时钟缓冲与驱动结构,可以到达芯片内部任何一个逻辑单元,包括CLB, IOB, BRAM, IP等模块,且时延和抖动都最小。
第二全局时钟资源和全局时钟资源的区别
使用全局时钟资源并不占用逻辑资源,也不会影响其他布线资源;
而第二全局时钟资源占用的是芯片内部的资源,需要占用部分逻辑资源,各个部分的布线会相互影响,因此建议在逻辑设计占用不超过百分之70的时候使用
使用方式,NET "S1" USELOWSKEWLINES;
全局时钟资源
IBUFG, IBUFGDS, BUFG, BUFGP, BUFGCE, BUFGMUX, BUFGDLL和DCM等
参考:全局时钟资源
时钟抖动、时钟偏斜
参考:高性能FPGA系统 P21
时钟抖动
抖动和相位噪声之间的区别
抖动和噪声是同一概念,即短期性偏移的两种定义方法。长期性偏移用漂移来定义。
抖动是时序的概念,抖动有两种:
-
确定性抖动
由可识别的干扰信号造成,幅度有限,不能进行统计分析
来源:
- 串扰
- EMI
- PCB中电源噪声
- 多个门电路同时转换为同一逻辑状态
-
随机性抖动
可能由温度,材料引起
相位噪声是频域的概念,指信号在fm频点附近1hz带宽内的功率与信号在f0频点附近1hz带宽内的功率的比值
时钟的抖动定义为一个时钟信号相对于理想时钟,上升沿与下降沿可能变换的前后范围,更通俗的说就是时钟周期在不同的周期上可能加长或缩短,他是一个平均值为0的平均变量。
降低时钟抖动的方法
参考:降低时钟抖动的方法
- 选择相位噪声特性好的晶体振荡器
- 采用合适的逻辑电平并以差分形式传输时钟信号
- PCB信号走线要注意
- 采用FPGA内部的锁相环对输入时钟进行锁项
时钟偏斜
时钟偏斜是一个时钟信号沿着同一个时钟网络到达源寄存器和目标寄存器的时间差
时钟偏斜分为负时钟偏斜和正时钟偏斜
降低时钟偏斜的方法:
采用时钟分布技术降低时钟偏斜,参考高性能FPGA系统P23
总之,时钟分布网络设计的基本要求就是使与时钟信号相连的功能子模块的互连线大致等长,从而保障时钟偏斜的最小化。
FPGA中时钟的使用
参考FPGA开发者联盟16
FPGA 芯片有固定的时钟路由,这些路由能有减少时钟抖动和偏差。 需要对时钟进行相位移动或变频的时候,一般不允许对时钟进行逻辑操作,这 样不仅会增加时钟的偏差和抖动,还会使时钟带上毛刺。 一般的处理方法是采用 FPGA 芯片自带的时钟管理器如 PLL,DLL 或 DCM,或者把逻辑转换到 触发器的 D 输入(这些也是对时钟逻辑操作的替代方案)
三种通讯协议的级别区别:
UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢。速度最慢。可以实现全双工。
I2C:一种串行传输方式,2线接口,网上可找到其通信协议和用法。速度居中。不可以实现全双工。
SPI:高速同步串行口。3线或4线接口,收发独立、可同步进行。速度最快。可以实现全双工。
-
SPI
Serial Peripheral Interface串行外围设备接口
分为四种模式:
CPOL:时钟极性 0:默认低电平 1:默认高电平
CPHA:时钟相位 0:第一个边沿采样 1:第二个边沿采样
- MODE 0:CPOL=0 CPHA=0,CLK限制状态为低电平,第一个边沿采样,所以是上升沿采样。
- MODE 1:CPOL=0 CPHA=1,CLK限制状态为低电平,第二个边沿采样,所以是下降沿采样。
- MODE 2:CPOL=1 CPHA=0,CLK限制状态为高电平,第一个边沿采样,所以是下降沿采样。
- MODE 3:CPOL=1 CPHA=1,CLK限制状态为高电平,第二个边沿采样,所以是上升沿采样。
高速同步串行口。3线或4线接口,收发独立、可同步进行。速度最快。可以实现全双工。
-
UART
Universal Asynchronous Receiver Transmitter:通用异步收发器。
通用异步串行口。按照标准波特率完成双向通讯,速度慢。速度最慢。可以实现全双工。
波特率:波特率可以被理解为单位时间内传输码元符号的个数
波特率计算:(1/波特率)=(1/时钟频率)*计数值
-
IIC
INTER IC BUS
一种串行传输方式,2线接口。速度居中,不可以实现全双工。
传输速率有限,标准模式下可达到100Kbps,快速模式下可达到400Kbps(我们开发板一般在130Kbps),高速模式下达到4Mbps,不能实现全双工,不适合传输很多的数据。
I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制。IIC总线是一个真正的多主机总线,总线上多个主机初始化传输,可以通过传输检测和仲裁来防止数据被破坏。
IIC总线仲裁
参考:高速电路设计实践P230
在多主的通信系统中。总线上有多个节点,他们都有自己的寻址地址,可以作为从节点被别的节点访问,同时他们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行冲裁的判决,这就是I2C总线上的仲裁。I2C总线上的仲裁分两部分:SCL线的同步和SDA线的冲裁。
-
SCL线的同步(时钟同步)
SCL同步是由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的统一的时钟信号,这就是SCL的同步原理。
-
SDA仲裁
SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,则继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。
IIC硬件结构,OC, OD门
集电极开路,是指三极管集电极什么都不接,所以叫做集电极开路
扩展:另一种输出结构是推挽输出。
推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起OC或者OD来说,这样的推挽结构高、低电平驱动能力都很强。
如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的OC或者OD输出则不会有这样的情况,因为上拉电阻提供的电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,AVR单片机的一些IO口就是这种结构。
IIC时序图
高速电路设计实践P230上面也有讲
I2C总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL
IIC总线上可以挂很多设备:多个主设备,多个从设备(外围设备)
多主机会产生总线仲裁问题。当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线。
上拉电阻一般在4.7k~10k之间
每个接到I2C总线上的器件都有唯一的地址。主机与其他器件间的数据传输可以是由主机发送数据到其他器件,这时主机即为发送器,总线上收数据的器件则为接收器。
I2C总线的数据传送
数据位的有效性规定:时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平器件,数据线上的数据才允许变化。
起始与终止信号:SCL为高期间,SDA:由高到低,起始信号;SDA:由低到高,终止信号
起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。
每当发送器传输完一个字节的数据之后,发送端会等待一点的时间,等待收方的应答信号。接收端通过拉低SDA数据线,给发送端发送一个应答信号,以提醒发送端这边数据已经接收完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。
-
-
LVDS
-
VGA
电路中的信号名总共有两类:VGA的场同步和行同步信号(VGA_VS, VGA_HS),控制VGA颜色的(R, G, B)
VGA驱动显示器的用的是扫描的方式,一般是逐行扫描。逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,每行结束时,用行同步信号进行同步;每场结束时,用场同步信号进行同步。
行扫描可分为以下几个阶段:同步、消隐后肩、显示期、消隐前肩再到下个周期同步为一个循环,对应的是屏幕上的一行。场同步类似,对应为屏幕显示的一帧。
行同步计数器,每来一个时钟就累加一次,当累加值在显示区域中是将RGB的值发送出去,其他时间均为0,也就是显示白色。
现在来看一下行同步信号和场同步信号是如何产生的。
assign vga_hsync = (cnt_h < H_SYNC_TIME) ? 1'b1 : 1'b0
;H_SYNC_TIME也是一个很小的值,差不多4左右,也就是在计数值在这个范围内的时候,把行同步信号拉高一下,剩余时间都是保持0的状态。场计数器在行同步计数器没扫描完一行累加一次,直到场计数器也在显示区域的范围内,才会将RGB的值送到显示器去,其他时间均为零。
assign vga_vsync = (cnt_v < V_SYNC_TIME) ? 1'b1 : 1'b0
;V_SYNC_TIME也是一个很小的值,也就是说在扫描前几行的时候,把场同步信号拉高一下,表示新的一帧数据要开始了,剩余时间都是保持0的状态。 -
SDRAM
注意前提:组合逻辑中
“组合逻辑电路中,同一信号经过不同的路径传输后,到达电路中某一汇合点的时间有先有后,这种现场称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险”
如何消除冒险
-
利用卡诺图发现静态冒险并消除
有连个相切的卡诺图圈并且相切处没有被其他卡诺圈包围,就有可能出现竞争冒险。
-
接入滤波电容
增加了输出电压波形的上升时间和下降时间。
尖峰脉冲一般都很窄,在输出接个很小的滤波电容,足以将其幅度削弱到门电路的阈值电压以下
-
引入选通脉冲
如何消除毛刺
- 输出信号使用专用寄存器消除毛刺
- 输出逻辑采用格雷码消除毛刺
- 卡诺图消除毛刺
阻塞(=)和非阻塞(<=)语句的最主要的区别在其后的引用它的语句的电路结构上:
- 对于阻塞语句,其综合出的组合逻辑的输出,被馈送到其后引用它的语句的组合逻辑的输入端,也即后面的语句引用其新值;
- 对于非阻塞语句,其综合出的触发器的输出,被馈送到其后引用它的语句的组合逻辑的输入端,也即后面的语句引用其旧值。
以上内容来自数字IC面试题
详细内容可以参考Clifford E. Cummings的两篇论文:
Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill
Verilog Nonblocking Assignments With Delays,Myths & Mysteries
- 组合逻辑只跟当前的状态有关系,例如一根导线+逻辑门的组合,输出取决于当前时刻的输入,考虑门延时的话另说。
- 时序逻辑的状态跟之前状态、边沿信号有关,边沿信号没来之前,输出保持之前的输入;边沿信号来时,输出状态跟随输入信号变化。
Moore状态机只和当前的状态有关
Mealy状态机不仅和当前状态有关还和输入有关
AXI
- 异步通讯
- 同步通讯
-
RAM
-
SRAM
SRAM存储单元要会画,要能讲出原理
优点:只要器件不掉电,存储内容就不丢失,无需刷新电路,工作速度快
缺点:集成度低,功耗大,价格高
从功能上区分:SRAM又有同步SRAM(SSRAM),和异步SRAM两种
异步SRAM的访问独立于时钟,数据输入和输出都由地址的变化控制。
同步SRAM的所有访问都在时钟的上升/下降 沿启动。地址、数据输入和其他控制信号均与时钟信号相关。
从晶体管类型区分:SRAM可以分为双极性与CMOS两种
-
DRAM
DRAM存储单元结构图要会画
DRAM可分为:
- SDRAM
- DDR SDRAM
- DDR2 SDRAM
- DDR3 SDRAM
优点:集成度高,功耗小,价格低
缺点:即便器件不掉电,存储器 也只能保持很短的时间,需不断被刷新
-
SRAM和SDRAM的区别
SRAM的速度高于SDRAM的原因:
- SRAM的地址可以一次性发送完,SDRAM的地址是行列复用的
- SDRAM不需要刷新,DRAM需要刷新
SRAM和SDRAM结构上的区别:
- 一个DRAM存储单元大约需要一个晶体管和一个电容
- 一个SRAM存储大约需要六个晶体管
-
-
ROM
一旦数据写入,则无法擦除改写的存储器,将ROM的定义做进一步扩展,定义为非易失性存储器,即器件掉电后,内容存储内容仍保留。
-
PROM
PROM是一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了。
-
EPROM
EPROM是通过紫外光的照射出原先的程序,是一种通用的存储器
-
EEPROM
EEPROM是通过电子擦除,价格很高,写入时间很长,写入很慢。
EEPROM用于单板信息的存储,如名称,厂家,版本号。
容量小,非易失,读取方便(IIC总线)
FLASH
一般采用FLASH存储大容量的底层驱动程序或软件程序
结合了ROM和RAM的有点,不仅具备电子可擦出可编程(EEPROM)的性能,还不会断点丢失数据同时可以快速读取数据
-
NOR FLASH
1988年,intel
NOR Flash的读取和我们常见的SDRAM的读取是一样的,用户可以直接运行装载在NOR FLASH里面的代码
NOR是现在市场上主要的非易失闪存技术。NOR一般只用来存储少量的代码;NOR主要应用在代码存储介质中。
一般小容量的用NOR FLASH,因为其读取速度快,多用来存储操作系统等重要信息,地址和数据引脚分开。
-
NAND FLASH
1989年,toshiba
NAND FLASH没有采用内存的随机读取技术,它的读取是一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的FLAH比较廉价。用户不能直接运行NAND FLASH上的代码,因此好多使用NAND FLASH的开发板出了使用NAND FLASH以外,还作上了一块小的NOR FLASH来运行启动代码。
而大容量的用NAND FLASH
地址和数据引脚复用
-
两者性能比较
NOR的读速度比NAND稍快一些
NAND的写入速度比NOR快很多
NAND的4ms擦除速度远比NOR的5s快
大多数写入操作需要先进行擦除操作
NAND的擦除单元更小,相应的擦除电路更少。
-
-
同步FIFO
工作方式:
复位后读写指针都归零。在读写指针相等时,FIFO要么空,要么满,所以需要对两种情况进行区分。
有两种方法能区分FIFO的空满:
-
在写操作时,下一个时钟两个指针相等时,则FIFO满。在读操作时,下一个时钟两个指针相等时,则FIFO空。
-
使用计数器来持续指示FIFO中空或满位置的个数。初始化为0,每写一个加1,每读一个减1,为空时就是0,为满时就是FIFO的容量。
此方法随着FIFO的深度增加,比较器的宽度也会增加,因此产生FIFO空满信号需要更高级的序列比较器,会降低FIFO操作的频率。
-
-
异步FIFO
异步FIFO用来在两个异步时钟域间传输数据。"fifo_full"和"fifo_empty"信号负责对上溢和下溢情况的监控。"fifo_full"信号指示上溢情况。在"fifo_full"置起是数据不应写入FIFO,否则会将FIFO内的数据覆盖掉。由"fifo_empty"信号指示下溢情况,如在"fifo_empty"时不应读取FIFO,否则会读出垃圾数据。
可以用与同步FIFO相同的原理设计异步FIFO,但是要特别注意当产生FIFO空和FIFO满信号时要避免出现亚稳态现象。