显示标签为“电路设计”的博文。显示所有博文
显示标签为“电路设计”的博文。显示所有博文

2009年1月11日

miniBfin板焊接中发现的问题

这两天焊接miniBfin板发现一些问题。
1。 电源部分元器件布局太密,比较拥挤。
2。下图中的C20由于使用封装是B,两个管脚间距很小,很容易造成短路,特别是在TopLayer短路时由于看不到很难发现。
3。贴片二极管封装上有横杠的一边是负极。
4。贴片发光二极管在器件反面有符号“-|”,“|”侧是正极。

2009年1月7日

miniBfin板靓照

今天拿到miniBfin板子,拍个照先。

2008年12月31日

减小DC/DC变换器中的接地反弹 — 一些接地要点

对接地分析的好文,转载于此,慢慢研读。减小DC/DC变换器中的接地反弹 — 一些接地要点

下载全文(PDF, 1,638 KB)

减小DC/DC变换器中的接地反弹 — 一些接地要点

By Jeff Barrow [jeff.barrow@analog.com]

电路接地1在电路原理图中看起来很简单;但是,电路的实际性能是由其印制电路板(PCB)布局决定的。而且,接地节点的分析很困难,特别是对于DC/DC变换器,例如降压型升压型变换器,这些电路的接地节点会聚快速变化的大电流。当接地节点移动时,系统性能会遭受影响并且该系统会辐射电磁干扰(EMI)。但是如果很好地理解“接地“引起的接地噪声的物理本质可提供一种减小接地噪声问题的直观认识。

接地反弹(Ground bounce)简称地弹会产生幅度为几伏的瞬态电压;最常见的是由磁通量变化引起的。传输电流的导线环路实际上构成了一个磁场,其磁场强度与电流成正比。磁通量与穿过环路面积和磁场强度乘 积成正比。

磁通量 ∝ 磁场强度 × 环路面积

更精确的表示是:

ΦB = BA cosφ

其中磁通量ΦB等于磁场强度B乘以穿过环路平面A和磁场方向与环路平面单位矢量夹角φ的余弦。

图1示出了磁通量与电流之间的关系。一个电压源驱动电流克服电阻沿导线环路流动。电流与环绕导线的磁通量相关联。为了将不同的物理量联系起来,可以考虑用你的右手握住导线(应用右手定则)。如果你的拇指指向电流的方向,那么你的其它手指将沿磁场磁力线方向环绕导线。因为那些磁力线穿过环路,所以形成了磁通量,在本例中磁通量方向为穿入页面。

Analog Devices :右手定则

图1. 右手定则

改变磁场强度或环路面积都会引起磁通量变化。当磁通量变化时,在导线中产生与磁通量变化率dΦB/d t成正比的电压。应该注意的是,当环路面积固定,电流变化;或者电流恒定,环路面积变化;或者两种情况同时变化——都会改变磁通量。

例如,假设图2中的开关突然断开。当电流停止流动时,磁通量消失,这会沿导线各处产生一个瞬态大电压。如果导线的一部分是一个接地返回引脚,那么以地电平为参考端的电压会产生一个尖峰,从而在任何使用该引脚为接地参考端的电路中都会产生错误信号。

Analog Devices :开启开关的作用

图2. 开启开关的作用

通常,PCB印制线电阻上的电压降不是接地反弹的主要来源。1盎司(oz)铜的电阻为500 微欧/方数(µΩ/⌈),因此1 A电流变化只能产生500 µV/⌈的反弹电压——问题只存在于采用细长印制线或菊花链式接地或精密电子电路。

寄生电容器的充电和放电为瞬态大电流返回到地提供了一条路径。由于电流变化引起的磁通量变化也引起接地反弹。

在DC/DC开关电源中减少接地反弹的最好方法就是控制磁通量变化——使电流环路面积和环路面积变化最小。

在某些情况下,例如图3所示,电流保持恒定,而开关切换引起环路面积变化,因此产生磁通量的变化。在开关状态1中,一个理想的电压源通过理想导线与一个理想电流源相连。电流在一个包含接地回路的环路中流动。

在开关状态2中,当开关改变位置时,同样的电流在不同的路径中流动。电流源为直流(DC),且并没有变化,但环路面子发生了变化。环路面积的变化意味着磁通量的变化,所以产生了电压。因为接地回路为变化环路的一部分,所以它会产生反弹电压。

Analog Devices

图 3

降压型变换器的接地反弹

为了讨论方便,将图3中的简单电路变换成与其类似的电路——图4中的降压型变换器。

Analog Devices

图4. 对于高频开关,大电容CVIN和大电感LBUCK可以看作一个电压源和电流源

在高频时,一个大电容器——例如降压型变换器输入电容器,CVIN——可以看作一个DC电压源。类似地,一个大电感器——例如降压型变换器输出电感器,LBUCK——也可以看作一个DC电流源。所做的这些近似有助于直观理解。

图5示出当开关在两个位置之间交替切换时磁通量如何变化。

Analog Devices: 开关对环路面积的影响

图5. 开关对环路面积的影响

大电感器LBUCK使输出电流大约保持恒定。类似地,大电容器CVIN保持电压大约等于VIN。由于输入引线电感两端的电压不变,所以输入电流也大约保持恒定。

尽管输入电流和输出电流基本不变,但当开关从位置1切换到位置2时,总环路面积会迅速变为原来的一半。环路面积的变化意味着磁通量的快速变化,从而沿着接地回路引起接地反弹。

实际上,降压型变换器由一对半导体开关构成,如图6所示。

虽然每个图中的复杂程度增加,但是通过磁通量变化引起接地反弹的分析方法仍然很简单和直观。

Analog Devices :采半导体开关对分析接地反弹的基本原理不变

图6. 采半导体开关对分析接地反弹的基本原理不变

事实上,磁通量的变化会沿着接地回路各处都产生电压,这就带来了一个有趣的问题:哪里是真正的地?因为接地反弹意味着,相对于称作的某个理想点(那一点需要定义),在接地返回印制线上产生一个反弹电压。

在电源稳压器电路中,真实的地应该连接在负载的低压端。毕竟,DC/DC变换器的目的是为负载提供稳定的电压和电流。电流回路上的其它所有点都不是真正的地,只是接地回路的一部份。

由于在负载的低压端接地并且环路面积的变化是接地反弹的原因,图7显示了如何精心地放置CVIN通过减小环路面积变化的比率降低接地反弹。

Analog Devices

图7. 精心放置CVIN可以大大减小接地反弹

电容器CVIN旁路PCB顶层的高端开关直接到达底层低端开关两端,因此减小了环路面积的变化,将其与接地回路隔离。当开关从一种状态切换到另一种状态时,从VIN的底部到负载的底部,无环路面积变化或开关电流变化。因此接地回路没有发生反弹。

Analog Devices :当开关从一种状态切换到另一种状态时不合理的布线会导致电流环路面积大幅变化

图8. 当开关从一种状态切换到另一种状态时不合理的布线会导致电流环路面积大幅变化

实际上,PCB布线本身决定了电路的性能。图8为图6中降压型变换器电路原理图的PCB布线图。当开关处于状态1所示的 位置,高端开关闭合,DC电流沿着外圈红色环路流动。当开关处于状态2所示的位置,低端开关闭合,DC电流沿着蓝色环路流动。注意由于环路面积变化引起磁 通量变化。因此产生电压和接地反弹。

为了清晰起见,在单层PCB上实现布线,但即使使用第二层整块接地平面也无法解决接地反弹问题。在展示改进布线图之前,图9给出了一个简单例子说明地平面无法解决问题。

Analog Devices :整体地平面并不总是一个好方法

图9. 整体地平面并不总是一个好方法

这里,我们采用双层PCB以便在与顶层电源线垂直处附加一个旁路电容。在左边的例子中,地平面是整体的并且未切割。顶层印制线电流通过电容器流过,穿过过孔,到达地平面。

因为交流(AC)电总是沿着最小阻抗路径流动,接地返回电流绕着其路径拐角返回电源。所以当电流的幅度或频率发生变化时,电流的磁场及其环路面积发生变化,从而改变磁通量。电流沿最小阻抗路径流动的规律意味着,即使采用整体地平面也会发生接地反弹——与其导通性无关。

在右边的例子中,一个经过合理规划切割的地平面会限制返回电流以使环路面积最小,从而大大减小接地反弹。在切割返回线路内产生的任何剩余接地反弹电压与通用地平面隔离。

图10中的PCB布线利用图9中示出的原理减小了接地反弹。采用双层PCB板以便将输入电容器和两个开关安排在地平面的孤岛上。

这种布线不必最好,但它工作很好,而且能够说明关键问题。应该注意红色电流(状态1)和蓝色电流(状态2)包围的环路面 积很大,但两个环路面积之差很小。环路面积变换很小意味着磁通量的变化小——即接地反弹小。(然而,一般情况下,也要保证环路面积小——图10只是为了说 明AC电流路径匹配的重要性。)

另外,在磁场和环路面积发生变化的接地回路孤岛内,沿着任何接地回路引起的接地反弹都受接地切割限制。

此外,可能第一眼看上去,输入电容器CVIN好像没有位于图7中所示的顶层高端开关和低层低端开关之间,但进一步观察才会发现是这样。尽管物理邻近可以很好,但真正起作用的是通过最小化环路面积实现的电子接近。

合理的降压型变换器布线可以使状态1和状态2之间的环路面积变化很小

图10. 合理的降压型变换器布线可以使状态1和状态2之间的环路面积变化很小

升压型变换器中的接地反弹

升压型变换器实际上是降压型变换器的反射,因此——如图11所示——它是输出电容器,输出电容器必须放在顶层高端开关和底层低端开关底端之间以使环路面积变化最小。

Analog Devices

图11. 按照降压型变换器将CVIN放在关键位置相同的方法,升压型变换器将CVOUT放在关键位置。
a)不合理设计,b)合理设计。

小结

接地反弹电压主要是由于磁通量变化引起的。在DC/DC开关电源中,磁通量变化是由于在不同的电流环路面积之间高速切换 DC电流引起的。但是精心放置降压型变换器的输入电容器和升压型变换器的输出电容器并且合理切割接地平面可以隔离接地反弹。然而,重要的是当切割地平面时 必须谨慎以避免增加电路中其它返回电流的环路面积。

另外,一个合理的布线应该将真正的地放在连接负载的底层,不会引起环路面积的变化或电流的变化。任何其它与导通相关的点都可以称为“地”,但它只是沿着返回路径的一点而已。

其它用于接地分析的有用概念

如果你牢记下述基本概念,你就会清楚地知道什么情况会产生接地反弹,什么情况不会产生接地反弹。图12示出了相互垂直的两个导体不会遭受磁场的互相影响。

相互垂直的两个导体不会遭受磁场的互相影响

图12. 相互垂直的两个导体不会遭受磁场的互相影响

沿着相同方向传输相等电流的两条平行导线周围产生的磁力线在两条导线之间处会相互抵消,所以两条导线总储存能量要比单独一条导线储存的能量少。因此,PCB宽印制线的电感要比窄印制线小。

电流沿着相同方向流动的两条平行导线

图13. 电流沿着相同方向流动的两条平行导线

沿着相反方向传输相等电流的两条平行导线周围产生的磁力线在两条导线的外部相互抵消,而在两条导线之间处增强。如果内部环路面积缩小,那么总磁通量,所以电感也随之变小。该现象可以解释为何AC地平面的返回电流总是沿顶层印制线导线下方流动。

电流沿着相反方向流动的两条平行导线

图14. 电流沿着相反方向流动的两条平行导线

图15示出了为何拐角增加电感。一条直导线只能看到它自己的磁场,但是在拐角处,还能看到垂直导线的磁场。因此,拐角储存了更多的磁场能量,其电感要大于直导线。

为何拐角增加电感

图15. 为何拐角增加电感

图16示出了在传输流的导线下面切割接地平面,由于转移回路电流可增加环路面积,从而增大环路尺寸并且助长接地反弹。

返回电流沿着最小阻抗路径流动

图16. 返回电流沿着最小阻抗路径流动

元件方向的作用,如图17所示。

元件方向的影响

图17. 元件方向的影响

总结

接地反弹一直是一个潜在的问题。对于监视器或电视,它意味着图像有噪声;对于音频设备则意味着噪声本底。在数字系统系统中,接地反弹可能会导致计算错误——甚至是系统崩溃。

对于预测接地反弹幅度来说,仔细估计寄生元素和细致的仿真是有效的方法。但对指导电路设计的直觉,理解背后的物理原理是很必要的。

首先,设计PCB时,应该将负载的低压端设置为真正的地。

然后,用电流源和电压源容替大电感器和电容器以简化电路动态特性。观察每种开关组合下的电流环路。应该使环路重叠;如果无法做到重叠,应该精心地在地平面上切割出一个小岛以确保只有DC流入和流出孤岛开口。

在大多数情况下,经过这些努力可以获得可以接受的接地性能。如果还是不能,应该首先考虑地平面的电阻,然后考虑所有开关和进入返回路径的寄生电容器两端流过的位移电流。

无论什么电路,基本接地原理都是相同的——应该使磁通量的变化最小或者对它隔离。

尾注

1Analog Dialogue杂志已经发表了许多关于“接地”问题的文章。这些文章可以在我们的综合在线存档文件中找到。Paul Brokaw和本文作 者合作撰写的一篇文章,见23-3 (1989) pp. 7-9。其中包括与接地和噪 声相关的早期参考文献索引。相关资料见11-2 (1977) pp. 10-15; 25-2(1991) pp. 24-25; 26-2 (1992) p. 27 (包含一系列很好的参考文献); 30-2 (1996) p. 11 (包括EMC/EMI/ESD方面的参考文献);39-3 (2005) pp. 3-8。研讨会教材《High Speed System Applications(高速系统应 用)》,Walt Kester和Hank Zumbahlen编著,ADI公司出版 (2006),书 中有大量章节介绍PCB布线和设计工具(pp. 4.1-4.90)。其它相关文章 还有“Reducing ground bounce in dc/dc-converter applications(减小 DC/DC变换器应用中的接地反弹)”,Jeff Barrow,EDN, 7/6/2006。

2008年12月28日

PCB板加工参数

今天去赛格电子市场,了解了一下4层PCB板加工的情况:
  • 最小线宽:4mil/0.1mm
  • 最小安全间距:4mil/0.1mm (线宽不能小于安全间距)
  • 最小过孔:8mil/0.2mm
  • 加工要求过孔外径不能小于0.15mm,如果外径减小则需要板厚加大

2008年12月22日

miniBfin最小系统板硬件设计完成啦!

BF532最小系统:
  • BF532
  • 32M SDRAM
  • 8M SFlash
  • UART
  • JTAG
  • GPIO Interface
  • Power
先睹为快!

2008年11月25日

看图学布线










2008年11月22日

Blackfin 处理器硬件设计注意事项

Blackfin 处理器硬件设计注意事项

概述:
为采用blackfin处理器设计产品的工程师避免犯一般错误。除了这个文档
之外,设计者应当读相关的规格书,硬件参考手册,以及所用处理器的堪误
表(可以从ADI网站中下载到)。

NMI极性:
所使用的处理器的双极性非屏蔽中断引脚。个别处理器(如ADSP-BF531/
BF532/BF533/BF535和BF561),NMI引脚激活为高。而其他处理器,NMI
引脚激活为低以便于同标准的外围设计连接。同样的,注意NMI引脚是否可
用以它的非激活状态。
注:不要让NMI悬空。

5V电压容许
直接将5V电压连接到引脚有可能使其损坏、产生故障。Blackfin处理器输
出连接到5V设备输入引脚可能左漂浮或可能被上拉到5V。大多数处理器引脚
不能容忍5V电压。除了两线接口(TWI)引脚。其他所有引脚电压变化应当
保证在规格书中规定的电压值或小于其许可范围的最大值,高电压中采用限
流电阻不能起到完全的保护作用。

不使用引脚处理:
看数据手册中的引脚描述列表。

信号完整性:
快速的信号上升时间和下降时间是引起信号完整性的主要问题。处理器的
每个引脚上升/下降斜率不一样。同样的,一些引脚对噪音和其他引脚的信
号反射具有更大的敏感性。采用简单的信号完整性处理方法防止线上传播反
射信号干扰时钟和同步信号,短的走线和连续终止对以下的信号很重要:
CLINK引脚应当有相应的驱动阻抗匹配。
SPORT口信号(TCLK,RCLK,RFS,TFS)应当采用终结。
PPI引脚,如PPI——CLK和同步信号也同样受益于标准的信号完整性技术。
SDRAM时钟,控制,地址和数据对连续的终于有益并减少不必要的EMI。
假如有多个信号源的信号,要保证走线短是很困难的,ADI网站上提供的
IBIS模块有助于对这些信号的处理。

测试点和信号提取:
对CLKOUT,SCLK,BANK选择,PPICLK和RESET信号设置测试点可以方便调
试。如果选择的如引导模式(BMODE)引脚直接连到电源或地,对于BGA封装
的处理器将没法做到。对于调试,使用上拉或下拉电阻比直接接电源或地更
好。

旁路电容:
对于更高速度的电路对内部供电端加上适当的旁路电容。电路中的有害感
应电容对高频电路具有很大的影响。有两件事需要考虑:当处理器运行速度
高于100MHz时,首先电容应当少,走线应当短以减小感应系数。0402的表贴
电容比更大尺寸的电容效果要明显。第二,小电容值将更容易引起LC电路的
自激。低于50MHZ的采用几个0.1uF的电容。高于500MHz的采用VDD——INT旁
0.1,0.01,0.001和100pF的组合电容。

复位:
Blackfin处理器的引脚没有滞后作用,因此,要求一个单调和上升或下降。
所以复位引脚不能直接连到R/C延时电路上,Blackfin处理器对这种电路噪
音比较敏感。所以复位引脚应当有一个复位芯片生产一个复位信号供给。

JTAG:
JTAG接口的完整应用,参考Analog Devices JTAG Emulation Technical
Reference (EE-68)[1]

PF引脚作为输出使用:
PF引脚作为输出应当接上拉或下拉以确定复位时的状态。

使用EZ-KIT Lite原理图
EZ-KIT Lite评估系统的原理图是一个很好的设计参考。因为EZ-KIT Lite
是一个评估和开发板,还提供一些例子

总线请求:
总线请求引脚(/BR)要求在所有的设计中加上拉电阻。如果不加上拉电阻
在没有任何外设驱动的情况下可能产生错误的总线请求。

2008年11月18日

BF532 176 Pin LQFP IBIS Model

估计是ADI把文件名字弄错了。

ADSP-BF531/BF532/BF533 2.5/3.3 V I/O Blackfin Processor IBIS Datafile 160-Ball CSP BGA Package (09/2005)

TMS320DM642 SDRAM PCB预仿真

最近在调试SDRAM电路正需要这样实用的文章,转载至此。TMS320DM642 SDRAM PCB预仿真

现在国内几乎所有的电子企业都不做PCB仿真,画完PCB直接投入生产,即使高频应用经验丰富的工程师也难免会出差错。因为很多情况下都要对一些方案进行折衷。就像这款JD642,体积较小,64位的SDRAM数据线如果加匹配处理的话需要很多空间,而如果不做匹配的话又怕信号质量不能满足要求。怎么折衷?不加匹配,等出现信号质量问题再改版吗?成本?开发周期?...即使调试过程中没有发现信号质量问题,以后产品投入市场能确保没有问题吗?下面就通过SDRAM数据线PCB信号仿真来看一下如何利用PCB仿真工具来协助完成原理图设计。

应用情景
  下面是一个DSP硬件电路部分元件位置关系(原理图和PCB使用PROTEL99SE设计),其中DRAM作为DSP的扩展Memory(64位宽度,低8bit还经过3245接到FLASH和其它芯片)DRAM时钟频率133M。因为频率较高,设计过程中我们需要考虑DRAM的数据、地址和控制线是否需加串阻。下面,我们以数据线D0仿真为例看是否需要加串阻。





模型建立
  首先需要在元件公司网站下载各器件IBIS模型。
  然后打开Hyperlynx,新建LineSim File(线路仿真主要用于PCB前仿真验证)



  新建好的线路仿真文件里可以看到一些虚线勾出的传输线、芯片脚、始端串阻和上下拉终端匹配电阻等。
  下面,我们开始导入主芯片DSP的数据线D0脚模型。
左键点芯片管脚处的标志,出现未知管脚,然后再按下图的红线所示线路选取芯片IBIS模型中的对应管脚。



  


OK后退到“ASSIGN Models”界面。选管脚为“Output”类型。
  这样,一样管脚的配置就完成了。同样将DRAM的数据线对应管脚和3245的对应管脚IBIS模型加上(DSP输出,3245高阻,DRAM输入)




  

下面我们开始建立传输线模型。
  左键点DSP芯片脚相连的传输线,增添传输线,然后右键编辑属性。因为我们使用四层板,在表层走线,所以要选用“Microstrip”,然后点“Value”进行属性编辑。这里,我们要编辑一些PCB的属性,布线长度、宽度和层间距等,属性编辑界面如下:




  

再将其它传输线也添加上。




  

这就是没有加阻抗匹配的仿真模型(PCB最远直线间距1.4inch,对线长为1.7inch)。现在模型就建立好了。

仿真及分析
  下面我们就要为各点加示波器探头了,按照下图红线所示路径为各测试点增加探头:




  

为发现更多的信息,我们使用眼图观察。因为时钟是133M,数据单沿采样,数据翻转最高频率为66.7M,对应位宽为7.58ns。所以设置参数如下:




  

之后按照芯片手册制作眼图模板。因为我们最关心的是接收端(DRAM)信号,所以模板也按照DRAM芯片HY57V283220手册的输入需求设计。

  芯片手册中要求输入高电平VIH高于2.0V,输入低电平VIL低于0.8VDRAM芯片的一个NOTE里指出,芯片可以承受最高5.6V,最低-2.0V信号(不长于3ns)




  

按下边红线路径配置眼图模板:





  

之后就可以进行仿真了,来看一下我们的眼图吧:)




  

可以看到三个测试点波形差异很大。波形最差的就是接收端的紫色波开形了,上冲到5.4V,下冲到-1.2V。但仍能满足DRAM芯片要求。从DRAM芯片方面来看,不加串阻是可以满足芯片要求的,而且接收端的信号虽然回冲很大,不过,还是高于2.0V,满足芯片高电平界定标准。整个眼图和模板没有交叠,所以可以接受。

  下面再看一下在DRAM侧距DSP引脚500mil的地方加33欧串阻的话信号是什么样子:




  

可以看到信号质量明显改善。上下冲和回冲都减小了。

  我们知道匹配分始端串联匹配和终端并联匹配。那看一下终端并75欧电阻波形是什么样子:




  

波形也明显改善很多^_^

  当然,始端串阻和终端并阻是不能同时使用的,如果同时使用,对终端实际上就形成了分压。最终电平不能满足高电平判别需求:




  

上图是在始端加33欧串阻,终端加75欧并阻的情况,可以看到DRAM接收到的高电平只有3*(75/(75+33))2V

  对于这样的数据总线,随着读和写的改变,始端和末端也发生变化,那样串阻就不好确定放在什么地方了,那我们看一下,把串阻放在靠近DRAM端的情况(DSP1.2inch,距DRAM0.5inch)





  

可见,效果仍然比不加串阻的情况要好很多,之所以串阻能起到这样的效果。从能量的角度可以简单的这样理解,因为整条线的各个芯片脚都是阻抗比较大,整条线上没有消耗能量的点,没有串阻的话,能量会在传输线上来回反射,相互叠加,造成很大的过冲和振铃。其中又因为DRAM输入阻抗较高,而且线又较长,所以信号问题比较严重。在这段线上加一个串阻能有效的消耗反射的能量,使过冲和振铃现象得到改善。

  下面我们再把DRAM设为输出端,DSP设为输入端,3245仍为高阻,看一下各点的测试波形。




  

看一下是否能满足DSP芯片要求

  在DSP芯片数据手册里有下面一段内容:





  

这段内容指出,下冲不低于-1.0V,上冲不超过4.3V就算合格的。这样看来DSP也可以接受不加串阻的情况。而3245数据手册没有给出芯片输入电平条件,但从芯片资料给出的内部结构上看,输入电平高于4V是没有问题的。

结论
  低8位数据线没有串阻可以满足设计要求,而其他的56位都是一对一,经过仿真没有串阻也能通过。于是数据线不加串阻可以满足设计要求,但有一点需注意,就是写数据时因为存在回冲,DRAM接收高电平在位中间会回冲到2V。因此会导致电平判决裕量较小,抗干扰能力差一些,如果调试过程中发现写RAM会出错,还需要改版加串阻(单板调试时SDRAM经超频测试到150M系统运行稳定,长时间通过CCS观察SDRAM内数据没有发现错误数据)。


  一些朋友怀疑软件仿真的可靠性,其实软件仿真不管是原理图仿真还是PCB仿真,关键是模型提取和建立。只要模型建立正确,仿真结果还是很可靠的(以前用250M信号验证过CADENCEHyperlynx的仿真结果,示波器观察到的波形和仿真结果还是很一致的)。至于人们说的误差确实也是存在的,比如PCB板阻抗由于材质差异及厚度差异、温度变化、信号频率差异等可能存在20%左右的误差。即使这些差异存在,但仿真结果仍然具有极高的参考意义,掌握一定的高频应用知识和材料知识可以帮我们更好的利用仿真结果做出最佳的决策。

2008年11月13日

Verilog HDL语法备忘

1。符号常量(Parameter)
parameter 参数1=表达式,..., 参数n=表达式;
在每个赋值语句的右边必须是一个常数表达式。
改变参数型常数的方法:
1)创建实例时用 #(参数, ..., 参数n) 改变实例的参数值
module Decode(A,B);
Parameter p1=1, p2=1;
....
endmodule
module Top;
wire A1;
wire B1;
wire A2;
wire B2;
Decode #(2,0) D1(A1, B1);
Decode #(3) D2(A2, B2);
endmodule
在上例中#(3)改变了p1值,p2保持不变。
2)在一个模块中改变另一个模块参数值使用defparam命令
module Test;
wire w;
Top T();
endmodule
module Top;
Block B1();
Block B2();
endmodule
module Block;
Parameter p=0;
endmodule
module Annotate;
defparam
Test.T.B1.p=2,
Test.T.B2.p=3;
endmodule

2。变量类型
Verilog模块中输入输出信号类型缺省默认类型是wire型。
reg型数据常用于表示"always"模块内的指定信号,常代表触发器。
"always"模块内被赋值的每一个信号都必须定义成reg型。reg型只
表示被定义的信号将用在"always"模块内。
reg类型数据的缺省值为不定值x。
assign A=B;
always #1 Count=C+1;
以上类型: A(wire) B(wire/reg) Count(reg) C(wire/reg)

3。阻塞和非阻塞赋值方式
1)Nonblocking b<=a;
2)Blocking b=a;

4。块语句
1)顺序块 begin 语句;语句;end 或 begin:块名 语句;语句;end
2)并行块 fork 语句;语句;join 或 fork:块名 语句;语句;join
在Verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯
一的存储地址,因此进入和跳出块不影响存储在变量内的值。

5== !==== !==的区别
===比较两个操作数必需完全一致,其结果才是1,否则为0
真值表:
===
0)0->1
1)1->1
X)X->1
Z)Z->1
other->0
==
0)0->1; 1->0;
1)0->0; 1->1;
X)any->X
Z)any->X

6case casez casex的真值表
case采用===比较方式
casez中0,1,x采用===比较方式, z和any比较为1
casex中0,1采用===比较方式, x,z和any比较为1
注意以上语句的所有表达式的值位宽必须相等。
例如:
A=0;
B=0;
ADDRESS=5'b0X000;
casex(ADDRESS)
5'b00???: A=1;
5'b01???: B=1;
.....
endcase

结果:A=1 B=0

7。避免生成多余的锁存器
例如
always @(al or d)
begin
if(al) q<= d;
end
当al为0时q没有赋值即默认保持原值,这就会自动生成锁存器。
避免生成多余的锁存器的原则:
a)如果用到if语句,最好写上else项。
b)如果用到case语句,最好写上default项。

8。避免X阻塞事件
reg[7:0] Count;
initial
begin
Count=1;
B=x;
end
always
begin
@(A) Count=Count+1;
@(B) Count=Count+1;
end

结果:Count=1,因为@(B)阻塞了进程。

9。注意变量位宽
例如:
reg[2:0] A;
reg[7:0] B;
A=-1; //3'b111
B=A; //8'b00000111 B!=-1

2008年11月10日

BF532芯片SDRAM连接方式和初始化

今天在网上看到一片介绍SDRAM工作原理和时序的好文章,可以不知道如何放到我的博客上,只给一个链接吧:《SDRAM的原理和时序.pdf》

BF532芯片SDRAM连接框图:
SDRAM Controller (SDC)特点:
1。支持64Mbit~512Mbit x4、x8、x16芯片。
2。支持SDRAM pagesize of 512bytes, 1Kbyte, 2Kbyte, 4Kbyte
3。SA10使能SDC对SDRAM预充电
4。只支持Burst Length = 1
5。CAS Latency (CL)可以设置为2 or 3
6。将EBIU_SDGCTL寄存器PSSE位置1将触发SDC设置SDRAM的Mode register
7。16bit SDRAM banks: page size = 2^(CAW+1), CAW是SDRAM列地址的宽度
我们使用的是Micron芯片MT48LC16M16A2P-75,它的主要性能指标是:
下面我们来看看bf532是如何初始化SDRAM,代码是uboot/cpu/bf533/init_sdram.S。

#define ASSEMBLY

#include
#include
#include
#include
.global init_sdram;

。。。。。。

init_sdram: =>init_sdram函数,先保存一些函数中会使用到的寄存器的值
[--SP] = ASTAT;
[--SP] = RETS;
[--SP] = (R7:0);
[--SP] = (P5:0);

。。。。。。

/*
* PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
*/
=>#define PLL_LOCKCNT 0xFFC00010 /* PLL Lock Count register (16-bit) */
=>将PLL Lock Count register地址赋给地址寄存器p0
p0.h = hi(PLL_LOCKCNT);
p0.l = lo(PLL_LOCKCNT);
=>Z的意思是将立即数高位用0扩充 =>W (16-bit word) designator is used to preface the load or store.
=> 0x300=768个时钟周期的延时 => ssync是使配置真正写到寄存器中
r0 = 0x300(Z);
w[p0] = r0.l;
ssync;

/*
* Put SDRAM in self-refresh, incase anything is running
*/
P2.H = hi(EBIU_SDGCTL);
P2.L = lo(EBIU_SDGCTL);
=> EBUIU_SDGCTL寄存器第24bit为1时Enable self-refresh during inactivity,等于0 - Disable self-refresh,默认是0 =>下面的操作是先读出再置bit24=1然后写回去
R0 = [P2];
BITSET (R0, 24);
[P2] = R0;
SSYNC;

=>下面这段是设置时钟频率
=>
=> If (!MSEL) VCO = CLKIN / (DF+1) * MSEL
=> Else VCO = CLKIN / (DF+1)
=> CCLK = VCO / (2^CSEL)
=> SCLK = VCO / SSEL

/*

* Set PLL_CTL with the value that we calculate in R0
* - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
* - [8] = BYPASS : BYPASS the PLL, run CLKIN into CCLK/SCLK
* - [7] = output delay (add 200ps of delay to mem signals)
* - [6] = input delay (add 200ps of input delay to mem signals)
* - [5] = PDWN : 1=All Clocks off
* - [3] = STOPCK : 1=Core Clock off
* - [1] = PLL_OFF : 1=Disable Power to PLL
* - [0] = DF : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
* all other bits set to zero
*/
=>我的设置是CONFIG_VCO_MULTI=40,CLKIN=10M,所以VCO=400M
=>CONFIG_CLKIN_HALF=0

r0 = CONFIG_VCO_MULT & 63; /* Load the VCO multiplier */
r0 = r0 << 9; /* Shift it over, */
r1 = CONFIG_CLKIN_HALF; /* Do we need to divide CLKIN by 2?*/
r0 = r1 | r0;
r1 = CONFIG_PLL_BYPASS; /* Bypass the PLL? */
r1 = r1 << 8; /* Shift it over */
r0 = r1 | r0; /* add them all together */

p0.h = hi(PLL_CTL);
p0.l = lo(PLL_CTL); /* Load the address */
cli r2; /* Disable interrupts */
ssync;
w[p0] = r0.l; /* Set the value */
idle; /* Wait for the PLL to stablize */
sti r2; /* Enable interrupts */
=>PLL_STAT寄存器bit5=1表示PLL LOCKED
check_again:
p0.h = hi(PLL_STAT);
p0.l = lo(PLL_STAT);
R0 = W[P0](Z);
CC = BITTST(R0,5);
if ! CC jump check_again;

=>我们设置CONFIG_SCLK_DIV=3,即系统时钟频率是133M
/* Configure SCLK & CCLK Dividers */
r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
p0.h = hi(PLL_DIV);
p0.l = lo(PLL_DIV);
w[p0] = r0.l;
ssync;

。。。。。。

/*
* Now, Initialize the SDRAM,
* start with the SDRAM Refresh Rate Control Register
*/
=>#define mem_SDRRC ((( CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) - (SDRAM_tRAS_num + SDRAM_tRP_num)
=>上面定义使用的公式是:RDIV = ((fSCLK × tREF) / NRA) – (tRAS + tRP)
=> Where:
=> • fSCLK = SDRAM clock frequency (system clock frequency),也就是133MHz
=> • tREF = SDRAM refresh period
=> • NRA = Number of row addresses in SDRAM (refresh cycles to refresh whole SDRAM)
=> • tRAS = Active to Precharge time (TRAS in the SDRAM Memory Global Control register) in number of clock cycles
=> • tRP = RAS to Precharge time (TRP in the SDRAM Memory Global Control register) in number of clock cycles
=> 对于我们这颗芯片:
=> /*SDRAM INFORMATION: */
=> #define SDRAM_Tref 64 /* Refresh period in milliseconds */
=> #define SDRAM_NRA 8192 /* Number of row addresses in SDRAM */
=> #define SDRAM_CL CL_3
=> #define SDRAM_tRP TRP_2
=> #define SDRAM_tRAS TRAS_7
=> #define SDRAM_tRCD TRCD_2
=> #define SDRAM_tWR TWR_2

p0.l = lo(EBIU_SDRRC);
p0.h = hi(EBIU_SDRRC);
r0 = mem_SDRRC;
w[p0] = r0.l;
ssync;

/*
* SDRAM Memory Bank Control Register - bank specific parameters
*/
=>#define mem_SDBCTL SDRAM_WIDTH | SDRAM_SIZE | EBE
=>对于MT48LC16M16A2P-75,SDRAM_WIDTH=0x00000010 (9bit)
=>SDRAM_SIZE=0x00000002 (32MB)
=>EBE = 0x00000001 /* Enable SDRAM external bank */

p0.l = (EBIU_SDBCTL & 0xFFFF);
p0.h = (EBIU_SDBCTL >> 16);
r0 = mem_SDBCTL;
w[p0] = r0.l;
ssync;

/*
* SDRAM Global Control Register - global programmable parameters
* Disable self-refresh
*/
P2.H = hi(EBIU_SDGCTL);
P2.L = lo(EBIU_SDGCTL);
R0 = [P2];
BITCLR (R0, 24); => disable self-refresh

/*
* Check if SDRAM is already powered up, if it is, enable self-refresh
*/
p0.h = hi(EBIU_SDSTAT);
p0.l = lo(EBIU_SDSTAT);
r2.l = w[p0];
cc = bittst(r2,3);
if !cc jump skip; => 如果是0表示SDRAM already powered up,跳转到skip,这时是不是要disable self-refresh呢?
NOP;
BITSET (R0, 23); => 1: Enable SDRAM powerup sequence on next SDRAM access
skip:
[P2] = R0; => 如果不是跳转到这里倒是对的,????
SSYNC;

/* Write in the new value in the register */
=> #define SCTLE 0x00000001 /* Enable SCLK[0], /SRAS, /SCAS, /SWE, SDQM[3:0] */
=> #define PSS 0x00800000 /* enable SDRAM power-up sequence on next SDRAM access */
=> #define mem_SDGCTL ( SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS )

R0.L = lo(mem_SDGCTL);
R0.H = hi(mem_SDGCTL);
[P2] = R0;
SSYNC;
nop;

=>恢复前面的保存值
(P5:0) = [SP++];
(R7:0) = [SP++];
RETS = [SP++];
ASTAT = [SP++];
RTS;