关于作者

姓名:

性别:男

出生日期:1978-12-02

地区:北京

联系电话:

QQ:45152652婚否:未婚
用户名:badcup
笔名:badcup
地区: 北京
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:19
评论个数:2
留言条数:0




Powered by BlogDriver 2.1

badcup的博客

 

欢迎访问badcup的博客

文章

透析回调函数

“先泛后精,先浅后深”的道理可是知易行难,所以常常会给技术上的小细节纠缠着,搞得晕晕乎,其中“回调函数”就是其中之一了,虽然回用,但是老是不明白其中的含义,众多的书本也说得隐晦不清。直到不久前看到一篇文章才总算比较清晰了解。

概括起来,回调机制包括两部分:服务执行者和服务方式制定者。
1. 服务执行者先制定服务规范;
2.服务方式制定者然后按照规范制定服务方式;
3.然后执行者按照这个方式提供服务。
回调函数的方式是把函数指针的作为参数传递进,所以规范就是约定函数的参数类型,个数。

这篇文章如下:
        调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。 CPU为此准备了现成的调用指令,调用时可以压栈保护现场,调用结束后从堆栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使调用者和被调者可以互不相识,于是才有了后来的函数和构件,使吾辈编程者如此轻松愉快。若评选对人类影响最大之发明,在火与车轮之后,笔者当推压栈调用。
       话虽这样说,此调用机制并非完美。回调函数就是一例。函数之类本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较的是何类数据--整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback)。
        回调函数使程序结构乱了许多。Windows API 函数集中有不少回调函数,尽管有详尽说明,仍使初学者一头雾水。恐怕这也是无奈之举。无论何种事物,能以树形结构单向描述毕竟让人舒服些。如果某家族中孙辈又是某祖辈的祖辈,恐怕无人能理清其中的头绪。但数据处理之复杂往往需要构成网状结构,非简单的客户/服务器关系能穷尽。
       Windows 系统还包含着另一种更为广泛的回调机制,即消息机制。消息本是 Windows 的基本控制手段,乍看与函数调用无关,其实是一种变相的函数调用。发送消息的目的是通知收方运行一段预先准备好的代码,相当于调用一个函数。消息所附带的 WParam 和 LParam 相当于函数的参数,只不过比普通参数更通用一些。应用程序可以主动发送消息,更多情况下是坐等 Windows 发送消息。一旦消息进入所属消息队列,便检感兴趣的那些,跳转去执行相应的消息处理代码。操作系统本是为应用程序服务,由应用程序来调用。而应用程序一旦启动,却要反过来等待操作系统的调用。这分明也是一种回调,或者说是一种广义回调。其实,应用程序之间也可以形成这种回调。假如进程 B 收到进程 A 发来的消息,启动了一段代码,其中又向进程 A 发送消息,这就形成了回调。这种回调比较隐蔽,弄不好会搞成递归调用,若缺少终止条件,将会循环不已,直至把程序搞垮。若是故意编写成此递归调用,并设好终止条件,倒是很有意思。但这种程序结构太隐蔽,除非十分必要,还是不用为好。
       利用消息也可以构成狭义回调。上面所举排序函数一例,可以把回调函数地址换成窗口handle。如此,当需要比较数据大小时,不是去调用回调函数,而是借 API 函数 SendMessage 向指定窗口发送消息。收到消息方负责比较数据大小,把比较结果通过消息本身的返回值传给消息发送方。所实现的功能与回调函数并无不同。当然,此例中改为消息纯属画蛇添脚,反倒把程序搞得很慢。但其他情况下并非总是如此,特别是需要异步调用时,发送消息是一种不错的选择。假如回调函数中包含文件处理之类的低速处理,调用方等不得,需要把同步调用改为异步调用,去启动一个单独的线程,然后马上执行后续代码,其余的事让线程慢慢去做。一个替代办法是借 API 函数 PostMessage发送一个异步消息,然后立即执行后续代码。这要比自己搞个线程省事许多,而且更安全。
       如今我们是活在一个 object 时代。只要与编程有关,无论何事都离不开 object。但 object 并未消除回调,反而把它发扬光大,弄得到处都是,只不过大都以事件(event)的身份出现,镶嵌在某个结构之中,显得更正统,更容易被人接受。应用程序要使用某个构件,总要先弄清构件的属性、方法和事件,然后给构件属性赋值,在适当的时候调用适当的构件方法,还要给事件编写处理例程,以备构件代码来调用。何谓事件?它不过是一个指向事件例程的地址,与回调函数地址没什么区别。
    不过,此种回调方式比传统回调函数要高明许多。首先,它把让人不太舒服的回调函数变成一种自然而然的处理例程,使编程者顿觉气顺。再者,地址是一个危险的东西,用好了可使程序加速,用不好处处是陷阱,程序随时都会崩溃。现代编程方式总是想法把地址隐藏起来(隐藏比较彻底的如 VB 和 Java),其代价是降低了程序效率。事件例程使编程者无需直接操作地址,但并不会使程序减速。更妙的是,此一改变,本是有损程序结构之奇技怪巧变成一种崭新设计理念,不仅免去被人抨击,而且逼得吾等凡人净手更衣,细细研读,仰慕至今。只是偶然静心思虑,发觉不过一瓶旧酒而已,故引得此番议论,让诸君见笑了。 事件驱动程序设计是围绕着消息基础形成的,发生一个事件,伴随着一大堆的消息。
       我理解“回调机制”是window 在执行某个API函数的过程中,调用指定的一个函数。我们可以模拟一下:
假设 ms 提供一个函数叫做  EnumFont ,该函数是得到所有的字体,假设它的实现是
EnumFont()
{
  while ( (f =FindNextFont()) !=NULL)
  {
       printf("fontname: " + f.name);
  }
}
这样就循环显示出所有的字体名称。但是,开发者可能对字体信息另有用处,那么如何才能让开发者能使用这些信息呢,于是做改进:
EnumFont( void*  userFunc )
{
  while ( (f =FindNextFont()) !=NULL)
  {
       printf("fontname: " + f.name);
       if ( userFunc!=NULL)  userFunc( f) ;
  }
}
假设userFunc 是一个函数 void f( FontObject font).这样使用者只需要定义一个函数:
  void myfunc( FontObject font)
             {
                 listCtrl.Addstring ( font.name);
              }
通过使用 EnumFont ( myfunc) 就可以将所有额字体信息添加到一个列表框中。那么我们称 myfunc是一个回调函数,即让某个系统函数调用的函数。因此可以得出结论:
1 回调函数是由开发者按照一定的原型进行定义的函数
2 回调函数并不由发者直接调用执行
3 回调函数通常作为参数传递给系统API,由该API来调用。
4 回调函数可能被系统API调用一次,也可能被循环调用多次。
比如 函数int EnumFontFamilies(
  HDC hdc,             // handle to device control
  LPCTSTR lpszFamily,  // pointer to family-name string
  FONTENUMPROC lpEnumFontFamProc,
                       // pointer to callback function
  LPARAM lParam        // pointer to application-supplied data
);
其中的   FONTENUMPROC lpEnumFontFamProc就是一个回调函数,该函数遵照格式
int CALLBACK EnumFontFamProc( ENUMLOGFONT FAR *lpelf,  NEWTEXTMETRIC FAR *lpntm, int FontType,  LPARAM lParam )进行定义。
如同mutant所说,回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.前者的例子如WriteFileEx,ReadFileEx等,函数的最后一个参数是一个回调函数的指针,程序中调用WriteFileEx以后,就直接返回了,可以继续进行其他工作,系统在读写操作完成后通知程序作善后处理.后者的例子就是windows的事件机制回调函数的另一个用途,是用于一些枚举函数,如EnumDisplayModes等,每找到一种支持的显示模式,就通知回调函数,由回调函数具体处理,这是因为 EnumDisplayModes本身并不知道用户要如何处理.能,用户提供回调函数,定制系统的功能,这样,不同的用户提供不同的回调函数,可以使系统具有不同的功能.这就是所谓的plugin.使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。

- 作者: badcup 2006年07月19日, 星期三 15:20  回复(1) |  引用(0) 加入博采

关于回调函数

- 作者: badcup 2006年07月19日, 星期三 15:19  回复(0) |  引用(0) 加入博采

List box的右侧滚动条始终处于最低下的方法

如何使List box的右侧滚动条始终处于最低下,以便能显示List box的最后一项的方法

方法1:

CListCtrl.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_BOTTOM, 0), NULL);

方法2:

CListCtrl.SetCaretIndex(CListCtrl.GetCount()-1);

- 作者: badcup 2006年07月18日, 星期二 10:09  回复(1) |  引用(0) 加入博采

堆和栈的区别

堆(heap)和栈(stack)有什么区别??

简单的可以理解为:
heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。

预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (chr *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}


二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度, 也最灵活
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指edx中,在根据edx读取字符,显然慢了。


2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了。
还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因针值读

来自 http://my.opera.com/javen/blog/show.dml/265058

- 作者: badcup 2006年06月19日, 星期一 12:03  回复(0) |  引用(0) 加入博采

PCB设计技巧百问
                                                               PCB设计技巧百问
1、如何选择PCB板材?
选择PCB板材必须在满足设计需求和可量产性及成本中间取得平衡点。设计需求包含电气和机构这两部分。通常在设计非常高速的PCB板子(大于GHz的频率)时这材质问题会比较重要。例如,现在常用的FR-4材质,在几个GHz的频率时的介质损(dielectric loss)会对信号衰减有很大的影响,可能就不合用。就电气而言,要注意介电常数(dielectric constant)和介质损在所设计的频率是否合用。
2、如何避免高频干扰?
避免高频干扰的基本思路是尽量降低高频信号电磁场的干扰,也就是所谓的串扰(Crosstalk)。可用拉大高速信号和模拟信号之间的距离,或加ground guard/shunt traces在模拟信号旁边。还要注意数字地对模拟地的噪声干扰。
3、在高速设计中,如何解决信号的完整性问题?
信号完整性基本上是阻抗匹配的问题。而影响阻抗匹配的因素有信号源的架构和输出阻抗(output impedance),走线的特性阻抗,负载端的特性,走线的拓朴(topology)架构等。解决的方式是靠端接(termination)与调整走线的拓朴。
4、差分布线方式是如何实现的?
差分对的布线有两点要注意,一是两条线的长度要尽量一样长,另一是两线的间距(此间距由差分阻抗决定)要一直保持不变,也就是要保持平行。平行的方式有两种,一为两条线走在同一走线层(side-by-side),一为两条线走在上下相邻两层(over-under)。一般以前者side-by-side实现的方式较多。
5、对于只有一个输出端的时钟信号线,如何实现差分布线?
要用差分布线一定是信号源和接收端也都是差分信号才有意义。所以对只有一个输出端的时钟信号是无法使用差分布线的。
6、接收端差分线对之间可否加一匹配电阻?
接收端差分线对间的匹配电阻通常会加, 其值应等于差分阻抗的值。这样信号品质会好些。
7、为何差分对的布线要靠近且平行?
对差分对的布线方式应该要适当的靠近且平行。所谓适当的靠近是因为这间距会影响到差分阻抗(differential impedance)的值, 此值是设计差分对的重要参数。需要平行也是因为要保持差分阻抗的一致性。若两线忽远忽近, 差分阻抗就会不一致, 就会影响信号完整性(signal integrity)及时间延迟(timing delay)。
8、如何处理实际布线中的一些理论冲突的问题
1. 基本上, 将模/数地分割隔离是对的。 要注意的是信号走线尽量不要跨过有分割的地方(moat), 还有不要让电源和信号的回流电流路径(returning current path)变太大。 2. 晶振是模拟的正反馈振荡电路, 要有稳定的振荡信号, 必须满足loop gain与phase的规范, 而这模拟信号的振规范很容易受到干扰, 即使加ground guard traces可能也无法完全隔离干扰。 而且离的太远, 地平面上的噪声也会影响正反馈振荡电路。 所以, 一定要将晶振和芯片的距离进可能靠近。 3. 确实高速布线与EMI的要求有很多冲突。 但基本原则是因EMI所加的电阻电容或ferrite bead, 不能造成信号的一些电气特性不符合规范。 所以, 最好先用安排走线和PCB叠层的技巧来解决或减少EMI的问题, 如高速信号走内层。 最后才用电阻电容或ferrite bead的方式, 以降低对信号的伤害。 
9、如何解决高速信号的手工布线和自动布线之间的矛盾?
现在较强的布线软件的自动布线器大部分都有设定约束条件来控制绕线方式及过孔数目。 各家EDA公司的绕线引擎能力和约束条件的设定项目有时相差甚远。 例如, 是否有足够的约束条件控制蛇行线(serpentine)蜿蜒的方式, 能否控制差分对的走线间距等。 这会影响到自动布线出来的走线方式是否能符合设计者的想法。 另外, 手动调整布线的难易也与绕线引擎的能力有绝对的关系。 例如, 走线的推挤能力, 过孔的推挤能力, 甚至走线对敷铜的推挤能力等等。 所以, 选择一个绕线引擎能力强的布线器, 才是解决之道。
10、关于test coupon。
test coupon是用来以TDR (Time Domain Reflectometer) 测量所生产的PCB板的特性阻抗是否满足设计需求。 一般要控制的阻抗有单根线和差分对两种情况。 所以, test coupon上的走线线宽和线距(有差分对时)要与所要控制的线一样。 最重要的是测量时接地点的位置。 为了减少接地引线(ground lead)的电感值, TDR探棒(probe)接地的地方通常非常接近量信号的地方(probe tip), 所以, test coupon上量测信号的点跟接地点的距离和方式要符合所用的探棒。详情参考如下链接1. http://developer.intel.com/design/chipsets/applnots/pcd_pres399.pdf2. http://www.Polarinstruments.com/index.html (点选Application notes)
11、在高速PCB设计中,信号层的空白区域可以敷铜,而多个信号层的敷铜在接地和接电源上应如何分配?
一般在空白区域的敷铜绝大部分情况是接地。 只是在高速信号线旁敷铜时要注意敷铜与信号线的距离, 因为所敷的铜会降低一点走线的特性阻抗。 也要注意不要影响到它层的特性阻抗, 例如在dual stripline的结构时。
12、是否可以把电源平面上面的信号线使用微带线模型计算特性阻抗?电源和地平面之间的信号是否可以使用带状线模型计算?
是的, 在计算特性阻抗时电源平面跟地平面都必须视为参考平面。 例如四层板: 顶层-电源层-地层-底层, 这时顶层走线特性阻抗的模型是以电源平面为参考平面的微带线模型。
13、在高密度印制板上通过软件自动产生测试点一般情况下能满足大批量生产的测试要求吗?
一般软件自动产生测试点是否满足测试需求必须看对加测试点的规范是否符合测试机具的要求。另外,如果走线太密且加测试点的规范比较严,则有可能没办法自动对每段线都加上测试点,当然,需要手动补齐所要测试的地方。
14、添加测试点会不会影响高速信号的质量?
至于会不会影响信号质量就要看加测试点的方式和信号到底多快而定。基本上外加的测试点(不用线上既有的穿孔(via or DIP pin)当测试点)可能加在线上或是从线上拉一小段线出来。前者相当于是加上一个很小的电容在线上,后者则是多了一段分支。这两个情况都会对高速信号多多少少会有点影响,影响的程度就跟信号的频率速度和信号缘变化率(edge rate)有关。影响大小可透过仿真得知。原则上测试点越小越好(当然还要满足测试机具的要求)分支越短越好。
15、若干PCB组成系统,各板之间的地线应如何连接?
各个PCB板子相互连接之间的信号或电源在动作时,例如A板子有电源或信号送到B板子,一定会有等量的电流从地层流回到A板子 (此为Kirchoff current law)。这地层上的电流会找阻抗最小的地方流回去。所以,在各个不管是电源或信号相互连接的接口处,分配给地层的管脚数不能太少,以降低阻抗,这样可以降低地层上的噪声。另外,也可以分析整个电流环路,尤其是电流较大的部分,调整地层或地线的接法,来控制电流的走法(例如,在某处制造低阻抗,让大部分的电流从这个地方走),降低对其它较敏感信号的影响。
16、能介绍一些国外关于高速PCB设计的技术书籍和资料吗?
现在高速数字电路的应用有通信网路和计算机等相关领域。在通信网路方面,PCB板的工作频率已达GHz上下,迭层数就我所知有到40层之多。计算机相关应用也因为芯片的进步,无论是一般的PC或服务器(Server),板子上的最高工作频率也已经达到400MHz (如Rambus) 以上。因应这高速高密度走线需求,盲埋孔(blind/buried vias)、mircrovias及build-up制程工艺的需求也渐渐越来越多。 这些设计需求都有厂商可大量生产。 以下提供几本不错的技术书籍: 1.Howard W. Johnson,“High-Speed Digital Design – A Handbook of Black Magic”; 2.Stephen H. Hall,“High-Speed Digital System Design”; 3.Brian Yang,“Digital Signal Integrity”;4.Dooglas Brook,“Integrity Issues and printed Circuit Board Design”。
17、两个常被参考的特性阻抗公式:
a.微带线(microstrip) Z={87/[sqrt(Er+1.41)]}ln[5.98H/(0.8W+T)] 其中,W为线宽,T为走线的铜皮厚度,H为走线到参考平面的距离,Er是PCB板材质的介电常数(dielectric constant)。此公式必须在0.1<(W/H)<2.0及1<(Er)<15的情况才能应用。 b.带状线(stripline) Z=[60/sqrt(Er)]ln{4H/[0.67π(T+0.8W)]} 其中,H为两参考平面的距离,并且走线位于两参考平面的中间。此公式必须在W/H<0.35及T/H<0.25的情况才能应用。
18、差分信号线中间可否加地线?
差分信号中间一般是不能加地线。因为差分信号的应用原理最重要的一点便是利用差分信号间相互耦合(coupling)所带来的好处,如flux cancellation,抗噪声(noise immunity)能力等。若在中间加地线,便会破坏耦合效应。
19、刚柔板设计是否需要专用设计软件与规范?国内何处可以承接该类电路板加工?
可以用一般设计PCB的软件来设计柔性电路板(Flexible Printed Circuit)。一样用Gerber格式给FPC厂商生产。由于制造的工艺和一般PCB不同,各个厂商会依据他们的制造能力会对最小线宽、最小线距、最小孔径(via)有其限制。除此之外,可在柔性电路板的转折处铺些铜皮加以补强。至于生产的厂商可上网“FPC”当关键词查询应该可以找到。
20、适当选择PCB与外壳接地的点的原则是什么?
选择PCB与外壳接地点选择的原则是利用chassis ground提供低阻抗的路径给回流电流(returning current)及控制此回流电流的路径。例如,通常在高频器件或时钟产生器附近可以借固定用的螺丝将PCB的地层与chassis ground做连接,以尽量缩小整个电流回路面积,也就减少电磁辐射。
21、电路板DEBUG应从那几个方面着手?
就数字电路而言,首先先依序确定三件事情: 1. 确认所有电源值的大小均达到设计所需。有些多重电源的系统可能会要求某些电源之间起来的顺序与快慢有某种规范。 2. 确认所有时钟信号频率都工作正常且信号边缘上没有非单调(non-monotonic)的问题。3. 确认reset信号是否达到规范要求。 这些都正常的话,芯片应该要发出第一个周期(cycle)的信号。接下来依照系统运作原理与bus protocol来debug。 
22、在电路板尺寸固定的情况下,如果设计中需要容纳更多的功能,就往往需要提高PCB的走线密度,但是这样有可能导致走线的相互干扰增强,同时走线过细也使阻抗无法降低,请专家介绍在高速(>100MHz)高密度PCB设计中的技巧?
在设计高速高密度PCB时,串扰(crosstalk interference)确实是要特别注意的,因为它对时序(timing)与信号完整性(signal integrity)有很大的影响。以下提供几个注意的地方: 1.控制走线特性阻抗的连续与匹配。 2.走线间距的大小。一般常看到的间距为两倍线宽。可以透过仿真来知道走线间距对时序及信号完整性的影响,找出可容忍的最小间距。不同芯片信号的结果可能不同。 3.选择适当的端接方式。 4.避免上下相邻两层的走线方向相同,甚至有走线正好上下重迭在一起,因为这种串扰比同层相邻走线的情形还大。 5.利用盲埋孔(blind/buried via)来增加走线面积。但是PCB板的制作成本会增加。 在实际执行时确实很难达到完全平行与等长,不过还是要尽量做到。除此以外,可以预留差分端接和共模端接,以缓和对时序与信号完整性的影响。
23、模拟电源处的滤波经常是用LC电路。但是为什么有时LC比RC滤波效果差? 
LC与RC滤波效果的比较必须考虑所要滤掉的频带与电感值的选择是否恰当。 因为电感的感抗(reactance)大小与电感值和频率有关。如果电源的噪声频率较低,而电感值又不够大,这时滤波效果可能不如RC。但是,使用RC滤波要付出的代价是电阻本身会耗能,效率较差,且要注意所选电阻能承受的功率。 
24、滤波时选用电感,电容值的方法是什么?
电感值的选用除了考虑所想滤掉的噪声频率外,还要考虑瞬时电流的反应能力。如果LC的输出端会有机会需要瞬间输出大电流,则电感值太大会阻碍此大电流流经此电感的速度,增加纹波噪声(ripple noise)。 电容值则和所能容忍的纹波噪声规范值的大小有关。纹波噪声值要求越小,电容值会较大。而电容的SR/ESL也会有影响。 另外,如果这LC是放在开关式电源(switching regulation power)的输出端时,还要注意此LC所产生的极点零点(pole/zero)对负反馈控制(negative feedback control)回路稳定度的影响。 
25、如何尽可能的达到EMC要求,又不致造成太大的成本压力?
PCB板上会因EMC而增加的成本通常是因增加地层数目以增强屏蔽效应及增加了ferrite bead、choke等抑制高频谐波器件的缘故。除此之外,通常还是需搭配其它机构上的屏蔽结构才能使整个系统通过EMC的要求。以下仅就PCB板的设计技巧提供几个降低电路产生的电磁辐射效应。 1、尽可能选用信号斜率(slew rate)较慢的器件,以降低信号所产生的高频成分。 2、注意高频器件摆放的位置,不要太靠近对外的连接器。 3、注意高速信号的阻抗匹配,走线层及其回流电流路径(return current path), 以减少高频的反射与辐射。 4、在各器件的电源管脚放置足够与适当的去耦合电容以缓和电源层和地层上的噪声。特别注意电容的频率响应与温度的特性是否符合设计所需。 5、对外的连接器附近的地可与地层做适当分割,并将连接器的地就近接到chassis ground。 6、可适当运用ground guard/shunt traces在一些特别高速的信号旁。但要注意guard/shunt traces对走线特性阻抗的影响。 7、电源层比地层内缩20H,H为电源层与地层之间的距离。
26、当一块PCB板中有多个数/模功能块时,常规做法是要将数/模地分开,原因何在?
将数/模地分开的原因是因为数字电路在高低电位切换时会在电源和地产生噪声,噪声的大小跟信号的速度及电流大小有关。如果地平面上不分割且由数字区域电路所产生的噪声较大而模拟区域的电路又非常接近,则即使数模信号不交叉, 模拟的信号依然会被地噪声干扰。也就是说数模地不分割的方式只能在模拟电路区域距产生大噪声的数字电路区域较远时使用。
27、另一种作法是在确保数/模分开布局,且数/模信号走线相互不交叉的情况下,整个PCB板地不做分割,数/模地都连到这个地平面上。道理何在?
数模信号走线不能交叉的要求是因为速度稍快的数字信号其返回电流路径(return current path)会尽量沿着走线的下方附近的地流回数字信号的源头,若数模信号走线交叉,则返回电流所产生的噪声便会出现在模拟电路区域内。
28、在高速PCB设计原理图设计时,如何考虑阻抗匹配问题?
在设计高速PCB电路时,阻抗匹配是设计的要素之一。而阻抗值跟走线方式有绝对的关系, 例如是走在表面层(microstrip)或内层(stripline/double stripline),与参考层(电源层或地层)的距离,走线宽度,PCB材质等均会影响走线的特性阻抗值。也就是说要在布线后才能确定阻抗值。一般仿真软件会因线路模型或所使用的数学算法的限制而无法考虑到一些阻抗不连续的布线情况,这时候在原理图上只能预留一些terminators(端接),如串联电阻等,来缓和走线阻抗不连续的效应。真正根本解决问题的方法还是布线时尽量注意避免阻抗不连续的发生。
29、哪里能提供比较准确的IBIS模型库?
IBIS模型的准确性直接影响到仿真的结果。基本上IBIS可看成是实际芯片I/O buffer等效电路的电气特性资料,一般可由SPICE模型转换而得 (亦可采用测量, 但限制较多),而SPICE的资料与芯片制造有绝对的关系,所以同样一个器件不同芯片厂商提供,其SPICE的资料是不同的,进而转换后的IBIS模型内之资料也会随之而异。也就是说,如果用了A厂商的器件,只有他们有能力提供他们器件准确模型资料,因为没有其它人会比他们更清楚他们的器件是由何种工艺做出来的。如果厂商所提供的IBIS不准确, 只能不断要求该厂商改进才是根本解决之道。
30、在高速PCB设计时,设计者应该从那些方面去考虑EMC、EMI的规则呢?
一般EMI/EMC设计时需要同时考虑辐射(radiated)与传导(conducted)两个方面. 前者归属于频率较高的部分(>30MHz)后者则是较低频的部分(<30MHz). 所以不能只注意高频而忽略低频的部分.一个好的EMI/EMC设计必须一开始布局时就要考虑到器件的位置, PCB迭层的安排, 重要联机的走法, 器件的选择等, 如果这些没有事前有较佳的安排, 事后解决则会事倍功半, 增加成本. 例如时钟产生器的位置尽量不要靠近对外的连接器, 高速信号尽量走内层并注意特性阻抗匹配与参考层的连续以减少反射, 器件所推的信号之斜率(slew rate)尽量小以减低高频成分, 选择去耦合(decoupling/bypass)电容时注意其频率响应是否符合需求以降低电源层噪声. 另外, 注意高频信号电流之回流路径使其回路面积尽量小(也就是回路阻抗loop impedance尽量小)以减少辐射. 还可以用分割地层的方式以控制高频噪声的范围. 最后, 适当的选择PCB与外壳的接地点(chassis ground)。
31、如何选择EDA工具?
目前的pcb设计软件中,热分析都不是强项,所以并不建议选用,其它的功能1.3.4可以选择PADS或Cadence性能价格比都不错。 PLD的设计的初学者可以采用PLD芯片厂家提供的集成环境,在做到百万门以上的设计时可以选用单点工具。
32、请推荐一种适合于高速信号处理和传输的EDA软件。
常规的电路设计,INNOVEDA 的 PADS 就非常不错,且有配合用的仿真软件,而这类设计往往占据了70%的应用场合。在做高速电路设计,模拟和数字混合电路,采用Cadence的解决方案应该属于性能价格比较好的软件,当然Mentor的性能还是非常不错的,特别是它的设计流程管理方面应该是最为优秀的。(大唐电信技术专家 王升)
33、对PCB板各层含义的解释 
Topoverlay ----顶层器件名称, 也叫 top silkscreen 或者 top component legend, 比如 R1 C5, IC10.bottomoverlay----同理multilayer-----如果你设计一个4层板,你放置一个 free pad or via, 定义它作为multilay 那么它的pad就会自动出现在4个层 上,如果你只定义它是top layer, 那么它的pad就会只出现在顶层上。
34、2G以上高频PCB设计,走线,排版,应重点注意哪些方面?
2G以上高频PCB属于射频电路设计,不在高速数字电路设计讨论范围内。而射频电路的布局(layout)和布线(routing)应该和原理图一起考虑的,因为布局布线都会造成分布效应。而且,射频电路设计一些无源器件是通过参数化定义,特殊形状铜箔实现,因此要求EDA工具能够提供参数化器件,能够编辑特殊形状铜箔。Mentor公司的boardstation中有专门的RF设计模块,能够满足这些要求。而且,一般射频设计要求有专门射频电路分析工具,业界最著名的是agilent的eesoft,和Mentor的工具有很好的接口。
35、2G以上高频PCB设计,微带的设计应遵循哪些规则?
射频微带线设计,需要用三维场分析工具提取传输线参数。所有的规则应该在这个场提取工具中规定。
36、对于全数字信号的PCB,板上有一个80MHz的钟源。除了采用丝网(接地)外,为了保证有足够的驱动能力,还应该采用什么样的电路进行保护?
确保时钟的驱动能力,不应该通过保护实现,一般采用时钟驱动芯片。一般担心时钟驱动能力,是因为多个时钟负载造成。采用时钟驱动芯片,将一个时钟信号变成几个,采用点到点的连接。选择驱动芯片,除了保证与负载基本匹配,信号沿满足要求(一般时钟为沿有效信号),在计算系统时序时,要算上时钟在驱动芯片内时延。
37、如果用单独的时钟信号板,一般采用什么样的接口,来保证时钟信号的传输受到的影响小?
时钟信号越短,传输线效应越小。采用单独的时钟信号板,会增加信号布线长度。而且单板的接地供电也是问题。如果要长距离传输,建议采用差分信号。LVDS信号可以满足驱动能力要求,不过您的时钟不是太快,没有必要。
38、27M,SDRAM时钟线(80M-90M),这些时钟线二三次谐波刚好在VHF波段,从接收端高频窜入后干扰很大。除了缩短线长以外,还有那些好办法?
如果是三次谐波大,二次谐波小,可能因为信号占空比为50%,因为这种情况下,信号没有偶次谐波。这时需要修改一下信号占空比。此外,对于如果是单向的时钟信号,一般采用源端串联匹配。这样可以抑制二次反射,但不会影响时钟沿速率。源端匹配值,可以采用下图公式得到。 
39、什么是走线的拓扑架构?
Topology,有的也叫routing order.对于多端口连接的网络的布线次序。
40、怎样调整走线的拓扑架构来提高信号的完整性?
这种网络信号方向比较复杂,因为对单向,双向信号,不同电平种类信号,拓朴影响都不一样,很难说哪种拓朴对信号质量有利。而且作前仿真时,采用何种拓朴对工程师要求很高,要求对电路原理,信号类型,甚至布线难度等都要了解。
41、怎样通过安排迭层来减少EMI问题?
首先,EMI要从系统考虑,单凭PCB无法解决问题。层叠对EMI来讲,我认为主要是提供信号最短回流路径,减小耦合面积,抑制差模干扰。另外地层与电源层紧耦合,适当比电源层外延,对抑制共模干扰有好处。
42、为何要铺铜?
一般铺铜有几个方面原因。1,EMC.对于大面积的地或电源铺铜,会起到屏蔽作用,有些特殊地,如PGND起到防护作用。2,PCB工艺要求。一般为了保证电镀效果,或者层压不变形,对于布线较少的PCB板层铺铜。3,信号完整性要求,给高频数字信号一个完整的回流路径,并减少直流网络的布线。当然还有散热,特殊器件安装要求铺铜等等原因。
43、在一个系统中,包含了dsp和pld,请问布线时要注意哪些问题呢?
看你的信号速率和布线长度的比值。如果信号在传输线上的时延和信号变化沿时间可比的话,就要考虑信号完整性问题。另外对于多个DSP,时钟,数据信号走线拓普也会影响信号质量和时序,需要关注。
44、除protel工具布线外,还有其他好的工具吗?
至于工具,除了PROTEL,还有很多布线工具,如MENTOR的WG2000EN2000系列和powerpcb,Cadence的allegro,zuken的cadstar,cr5000等,各有所长。
45、什么是“信号回流路径”? 
信号回流路径,即return current。高速数字信号在传输时,信号的流向是从驱动器沿PCB传输线到负载,再由负载沿着地或电源通过最短路径返回驱动器端。这个在地或电源上的返回信号就称信号回流路径。Dr.Johson在他的书中解释,高频信号传输,实际上是对传输线与直流层之间包夹的介质电容充电的过程。SI分析的就是这个围场的电磁特性,以及他们之间的耦合。
46、如何对接插件进行SI分析?
在IBIS3.2规范中,有关于接插件模型的描述。一般使用EBD模型。如果是特殊板,如背板,需要SPICE模型。也可以使用多板仿真软件(HYPERLYNX或IS_multiboard),建立多板系统时,输入接插件的分布参数,一般从接插件手册中得到。当然这种方式会不够精确,但只要在可接受范围内即可。
47、请问端接的方式有哪些?
端接(terminal),也称匹配。一般按照匹配位置分有源端匹配和终端匹配。其中源端匹配一般为电阻串联匹配,终端匹配一般为并联匹配,方式比较多,有电阻上拉,电阻下拉,戴维南匹配,AC匹配,肖特基二极管匹配。
48、采用端接(匹配)的方式是由什么因素决定的?
匹配采用方式一般由BUFFER特性,拓普情况,电平种类和判决方式来决定,也要考虑信号占空比,系统功耗等。
49、采用端接(匹配)的方式有什么规则?
数字电路最关键的是时序问题,加匹配的目的是改善信号质量,在判决时刻得到可以确定的信号。对于电平有效信号,在保证建立、保持时间的前提下,信号质量稳定;对延有效信号,在保证信号延单调性前提下,信号变化延速度满足要求。Mentor ICX产品教材中有关于匹配的一些资料。另外《High Speed Digital design a hand book of blackmagic》有一章专门对terminal的讲述,从电磁波原理上讲述匹配对信号完整性的作用,可供参考。
50、能否利用器件的IBIS模型对器件的逻辑功能进行仿真?如果不能,那么如何进行电路的板级和系统级仿真?
IBIS模型是行为级模型,不能用于功能仿真。功能仿真,需要用SPICE模型,或者其他结构级模型。
51、在数字和模拟并存的系统中,有2种处理方法,一个是数字地和模拟地分开,比如在地层,数字地是独立地一块,模拟地独立一块,单点用铜皮或FB磁珠连接,而电源不分开;另一种是模拟电源和数字电源分开用FB连接,而地是统一地地。请问李先生,这两种方法效果是否一样? 
应该说从原理上讲是一样的。因为电源和地对高频信号是等效的。区分模拟和数字部分的目的是为了抗干扰,主要是数字电路对模拟电路的干扰。但是,分割可能造成信号回流路径不完整,影响数字信号的信号质量,影响系统EMC质量。因此,无论分割哪个平面,要看这样作,信号回流路径是否被增大,回流信号对正常工作信号干扰有多大。现在也有一些混合设计,不分电源和地,在布局时,按照数字部分、模拟部分分开布局布线,避免出现跨区信号。
52、安规问题:FCC、EMC的具体含义是什么?
FCC: federal communication commission 美国通信委员会EMC: electro megnetic compatibility 电磁兼容FCC是个标准组织,EMC是一个标准。标准颁布都有相应的原因,标准和测试方法。
53、何谓差分布线?
差分信号,有些也称差动信号,用两根完全一样,极性相反的信号传输一路数据,依靠两根信号电平差进行判决。为了保证两根信号完全一致,在布线时要保持并行,线宽、线间距保持不变。
54、PCB仿真软件有哪些?
仿真的种类很多,高速数字电路信号完整性分析仿真分析(SI)常用软件有icx,signalvision,hyperlynx,XTK,speectraquest等。有些也用Hspice。
55、PCB仿真软件是如何进行LAYOUT仿真的?
高速数字电路中,为了提高信号质量,降低布线难度,一般采用多层板,分配专门的电源层,地层。
56、在布局、布线中如何处理才能保证50M以上信号的稳定性
高速数字信号布线,关键是减小传输线对信号质量的影响。因此,100M以上的高速信号布局时要求信号走线尽量短。数字电路中,高速信号是用信号上升延时间来界定的。而且,不同种类的信号(如TTL,GTL,LVTTL),确保信号质量的方法不一样。
57、室外单元的射频部分,中频部分,乃至对室外单元进行监控的低频电路部分往往采用部署在同一PCB上,请问对这样的PCB在材质上有何要求?如何防止射频,中频乃至低频电路互相之间的干扰? 
混合电路设计是一个很大的问题。很难有一个完美的解决方案。一般射频电路在系统中都作为一个独立的单板进行布局布线,甚至会有专门的屏蔽腔体。而且射频电路一般为单面或双面板,电路较为简单,所有这些都是为了减少对射频电路分布参数的影响,提高射频系统的一致性。相对于一般的FR4材质,射频电路板倾向与采用高Q值的基材,这种材料的介电常数比较小,传输线分布电容较小,阻抗高,信号传输时延小。在混合电路设计中,虽然射频,数字电路做在同一块PCB上,但一般都分成射频电路区和数字电路区,分别布局布线。之间用接地过孔带和屏蔽盒屏蔽。
58、对于射频部分,中频部分和低频电路部分部署在同一PCB上,mentor有什么解决方案?
Mentor的板级系统设计软件,除了基本的电路设计功能外,还有专门的RF设计模块。在RF原理图设计模块中,提供参数化的器件模型,并且提供和EESOFT等射频电路分析仿真工具的双向接口;在RF LAYOUT模块中,提供专门用于射频电路布局布线的图案编辑功能,也有和EESOFT等射频电路分析仿真工具的双向接口,对于分析仿真后的结果可以反标回原理图和PCB。同时,利用Mentor软件的设计管理功能,可以方便的实现设计复用,设计派生,和协同设计。大大加速混合电路设计进程。手机板是典型的混合电路设计,很多大型手机设计制造商都利用Mentor加安杰伦的eesoft作为设计平台。
59、mentor的产品结构如何?
Mentor Graphics的PCB工具有WG(原veribest)系列和Enterprise(boardstation)系列。详细信息,请登录http://www.mentor.com/。
60、Mentor的PCB设计软件对BGA、PGA、COB等封装是如何支持的?
Mentor的autoactive RE由收购得来的veribest发展而来,是业界第一个无网格,任意角度布线器。众所周知,对于球栅阵列,COB器件,无网格,任意角度布线器是解决布通率的关键。在最新的autoactive RE中,新增添了推挤过孔,铜箔,REROUTE等功能,使它应用更方便。另外,他支持高速布线,包括有时延要求信号布线和差分对布线。
61、Mentor的PCB设计软件对差分线队的处理又如何?
Mentor软件在定义好差分对属性后,两根差分对可以一起走线,严格保证差分对线宽,间距和长度差,遇到障碍可以自动分开,在换层时可以选择过孔方式。
62、在一块12层PCb板上,有三个电源层2.2v,3.3v,5v,将三个电源各作在一层,地线该如何处理?
一般说来,三个电源分别做在三层,对信号质量比较好。因为不大可能出现信号跨平面层分割现象。跨分割是影响信号质量很关键的一个因素,而仿真软件一般都忽略了它。对于电源层和地层,对高频信号来说都是等效的。在实际中,除了考虑信号质量外,电源平面耦合(利用相邻地平面降低电源平面交流阻抗),层叠对称,都是需要考虑的因素。
63、PCB在出厂时如何检查是否达到了设计工艺要求?
很多PCB厂家在PCB加工完成出厂前,都要经过加电的网络通断测试,以确保所有联线正确。同时,越来越多的厂家也采用x光测试,检查蚀刻或层压时的一些故障。对于贴片加工后的成品板,一般采用ICT测试检查,这需要在PCB设计时添加ICT测试点。如果出现问题,也可以通过一种特殊的X光检查设备排除是否加工原因造成故障。
64、“机构的防护”是不是机壳的防护?
是的。机壳要尽量严密,少用或不用导电材料,尽可能接地。  
65、在芯片选择的时候是否也需要考虑芯片本身的esd问题?  
不论是双层板还是多层板,都应尽量增大地的面积。在选择芯片时要考虑芯片本身的ESD特性,这些在芯片说明中一般都有提到,而且即使不同厂家的同一种芯片性能也会有所不同。设计时多加注意,考虑的全面一点,做出电路板的性能也会得到一定的保证。但ESD的问题仍然可能出现,因此机构的防护对ESD的防护也是相当重要的。 
66、在做pcb板的时候,为了减小干扰,地线是否应该构成闭和形式?
在做PCB板的时候,一般来讲都要减小回路面积,以便减少干扰,布地线的时候,也不 应布成闭合形式,而是布成树枝状较好,还有就是要尽可能增大地的面积。
67、如果仿真器用一个电源,pcb板用一个电源,这两个电源的地是否应该连在一起?
如果可以采用分离电源当然较好,因为如此电源间不易产生干扰,但大部分设备是有具体要求的。既然仿真器和PCB板用的是两个电源,按我的想法是不该将其共地的。
68、一个电路由几块pcb板构成,他们是否应该共地?
一个电路由几块PCB构成,多半是要求共地的,因为在一个电路中用几个电源毕竟是不太实际的。但如果你有具体的条件,可以用不同电源当然干扰会小些。
69、设计一个手持产品,带LCD,外壳为金属。测试ESD时,无法通过ICE-1000-4-2的测试,CONTACT只能通过1100V,AIR可以通过6000V。ESD耦合测试时,水平只能可以通过3000V,垂直可以通过4000V测试。CPU主频为33MHZ。有什么方法可以通过ESD测试?
手持产品又是金属外壳,ESD的问题一定比较明显,LCD也恐怕会出现较多的不良现象。如果没办法改变现有的金属材质,则建议在机构内部加上防电材料,加强PCB的地,同时想办法让LCD接地。当然,如何操作要看具体情况。
70、设计一个含有DSP,PLD的系统,该从那些方面考虑ESD?
就一般的系统来讲,主要应考虑人体直接接触的部分,在电路上以及机构上进行适当的保护。至于ESD会对系统造成多大的影响,那还要依不同情况而定。干燥的环境下,ESD现象会比较严重,较敏感精细的系统,ESD的影响也会相对明显。虽然大系统有时ESD影响并不明显,但设计时还是要多加注意,尽量防患于未然。
71、PCB设计中,如何避免串扰?
变化的信号(例如阶跃信号)沿传输线由A到B传播,传输线C-D上会产生耦合信号,变化的信号一旦结束也就是信号恢复到稳定的直流电平时,耦合信号也就不存在了,因此串扰仅发生在信号跳变的过程当中,并且信号沿的变化(转换率)越快,产生的串扰也就越大。空间中耦合的电磁场可以提取为无数耦合电容和耦合电感的集合,其中由耦合电容产生的串扰信号在受害网络上可以分成前向串扰和反向串扰Sc,这个两个信号极性相同;由耦合电感产生的串扰信号也分成前向串扰和反向串扰SL,这两个信号极性相反。耦合电感电容产生的前向串扰和反向串扰同时存在,并且大小几乎相等,这样,在受害网络上的前向串扰信号由于极性相反,相互抵消,反向串扰极性相同,叠加增强。串扰分析的模式通常包括默认模式,三态模式和最坏情况模式分析。默认模式类似我们实际对串扰测试的方式,即侵害网络驱动器由翻转信号驱动,受害网络驱动器保持初始状态(高电平或低电平),然后计算串扰值。这种方式对于单向信号的串扰分析比较有效。三态模式是指侵害网络驱动器由翻转信号驱动,受害的网络的三态终端置为高阻状态,来检测串扰大小。这种方式对双向或复杂拓朴网络比较有效。最坏情况分析是指将受害网络的驱动器保持初始状态,仿真器计算所有默认侵害网络对每一个受害网络的串扰的总和。这种方式一般只对个别关键网络进行分析,因为要计算的组合太多,仿真速度比较慢。
72、导带,即微带线的地平面的铺铜面积有规定吗?
对于微波电路设计,地平面的面积对传输线的参数有影响。具体算法比较复杂(请参阅安杰伦的EESOFT有关资料)。而一般PCB数字电路的传输线仿真计算而言,地平面面积对传输线参数没有影响,或者说忽略影响。
73、在EMC测试中发现时钟信号的谐波超标十分严重,只是在电源引脚上连接去耦电容。在PCB设计中需要注意哪些方面以抑止电磁辐射呢? 
EMC的三要素为辐射源,传播途径和受害体。传播途径分为空间辐射传播和电缆传导。所以要抑制谐波,首先看看它传播的途径。电源去耦是解决传导方式传播,此外,必要的匹配和屏蔽也是需要的。
74、采用4层板设计的产品中,为什么有些是双面铺地的,有些不是?
铺地的作用有几个方面的考虑:1,屏蔽;2,散热;3,加固;4,PCB工艺加工需要。所以不管几层板铺地,首先要看它的主要原因。 这里我们主要讨论高速问题,所以主要说屏蔽作用。表面铺地对EMC有好处,但是铺铜要尽量完整,避免出现孤岛。一般如果表层器件布线较多, 很难保证铜箔完整,还会带来内层信号跨分割问题。所以建议表层器件或走线多的板子,不铺铜。
75、对于一组总线(地址,数据,命令)驱动多个(多达4,5个)设备(FLASH,SDRAM,其他外设...)的情况,在PCB布线时,采用那种方式?
布线拓扑对信号完整性的影响,主要反映在各个节点上信号到达时刻不一致,反射信号同样到达某节点的时刻不一致,所以造成信号质量恶化。一般来讲,星型拓扑结构,可以通过控制同样长的几个stub,使信号传输和反射时延一致,达到比较好的信号质量。 在使用拓扑之间,要考虑到信号拓扑节点情况、实际工作原理和布线难度。不同的buffer,对于信号的反射影响也不一致,所以星型拓扑并不能很好解决上述数据地址总线连接到flash和sdram的时延,进而无法确保信号的质量;另一方面,高速的信号一般在dsp和sdram之间通信,flash加载时的速率并不高,所以在高速仿真时只要确保实际高速信号有效工作的节点处的波形,而无需关注flash处波形;星型拓扑比较菊花链等拓扑来讲,布线难度较大,尤其大量数据地址信号都采用星型拓扑时。附图是使用Hyperlynx仿真数据信号在DDR——DSP——FLASH拓扑连接,和DDR——FLASH——DSP连接时在150MHz时的仿真波形。 可以看到,第二种情形,DSP处信号质量更好,而FLASH处波形较差,而实际工作信号时DSP和DDR处的波形。    
76、频率30M以上的PCB,布线时使用自动布线还是手动布线;布线的软件功能都一样吗?
是否高速信号是依据信号上升沿而不是绝对频率或速度。自动或手动布线要看软件布线功能的支持,有些布线手工可能会优于自动布线,但有些布线,例如查分布线,总线时延补偿布线,自动布线的效果和效率会远高于手工布线。一般 PCB基材主要由树脂和玻璃丝布混合构成,由于比例不同,介电常数和厚度都不同。一般树脂含量高的,介电常数越小,可以更薄。具体参数,可以向PCB生产厂家咨询。另外,随着新工艺出现,还有一些特殊材质的PCB板提供给诸如超厚背板或低损耗射频板需要。  
77、在PCB设计中,通常将地线又分为保护地和信号地;电源地又分为数字地和模拟地,为什么要对地线进行划分? 
划分地的目的主要是出于EMC的考虑,担心数字部分电源和地上的噪声会对其他信号,特别是模拟信号通过传导途径有干扰。至于信号的和保护地的划分,是因为EMC中ESD静放电的考虑,类似于我们生活中避雷针接地的作用。无论怎样分,最终的大地只有一个。只是噪声泻放途径不同而已。
78、在布时钟时,有必要两边加地线屏蔽吗? 
是否加屏蔽地线要根据板上的串扰/EMI情况来决定,而且如对屏蔽地线的处理不好,有可能反而会使情况更糟。
79、布不同频率的时钟线时有什么相应的对策? 
对时钟线的布线,最好是进行信号完整性分析,制定相应的布线规则,并根据这些规则来进行布线。
80、PCB单层板手工布线时,是放在顶层还是底层? 
如果是顶层放器件,底层布线。
81、PCB单层板手工布线时,跳线要如何表示?
跳线是PCB设计中特别的器件,只有两个焊盘,距离可以定长的,也可以是可变长度的。手工布线时可根据需要添加。板上会有直连线表示,料单中也会出现。
82、假设一片4层板,中间两层是VCC和GND,走线从top到bottom,从BOTTOM SIDE流到TOP SIDE的回流路径是经这个信号的VIA还是POWER?
过孔上信号的回流路径现在还没有一个明确的说法,一般认为回流信号会从周围最近的接地或接电源的过孔处回流。一般EDA工具在仿真时都把过孔当作一个固定集总参数的RLC网络处理,事实上是取一个最坏情况的估计。
83、“进行信号完整性分析,制定相应的布线规则,并根据这些规则来进行布线”,此句如何理解?
前仿真分析,可以得到一系列实现信号完整性的布局、布线策略。通常这些策略会转化成一些物理规则,约束PCB的布局和布线。通常的规则有拓扑规则,长度规则,阻抗规则,并行间距和并行长度规则等等。PCB工具可以在这些约束下,完成布线。当然,完成的效果如何,还需要经过后仿真验证才知道。 此外,Mentor提供的ICX支持互联综合,一边布线,一边仿真,实现一次通过。
84、怎样选择PCB的软件? 
选择PCB的软件,根据自己的需求。市面提供的高级软件很多,关键看看是否适合您设计能力,设计规模和设计约束的要求。刀快了好上手,太快会伤手。找个EDA厂商,请过去做个产品介绍,大家坐下来聊聊,不管买不买,都会有收获。
85、关于碎铜、浮铜的概念该怎么理解呢? 
从PCB加工角度,一般将面积小于某个单位面积的铜箔叫碎铜,这些太小面积的铜箔会在加工时,由于蚀刻误差导致问题。从电气角度来讲,将没有合任何直流网络连结的铜箔叫浮铜,浮铜会由于周围信号影响,产生天线效应。浮铜可能会是碎铜,也可能是大面积的铜箔。
86、近端串扰和远端串扰与信号的频率和信号的上升时间是否有关系?是否会随着它们变化而变化?如果有关系,能否有公式说明它们之间的关系? 
应该说侵害网络对受害网络造成的串扰与信号变化沿有关,变化越快,引起的串扰越大,(V=L*di/dt)。串扰对受害网络上数字信号的判决影响则与信号频率有关,频率越快,影响越大。详情请参阅相关链接:http://www.eetchina.com/ARTICLES/2004MAY/1/2004MAY10_BD_NTFORUM01.HTMhttp://www.eetchina.com/ART_8800305640_617681,617683.HTM.b8400e4b
87、在PROTEL中如何画绑定IC?http://www.eetchina.com/DG/eec_dg_free_reply.php?disc_grp_id=10004&topic_id=1000006921
具体讲,在PCB中使用机械层画邦定图,IC衬底衬根据IC SPEC.决定接vccgndfloat,用机械层print bonding drawing即可。
88、用PROTEL绘制原理图,制板时产生的网络表始终有错,无法自动产生PCB板,原因是什么?http://www.eetchina.com/DG/eec_dg_free_reply.php?disc_grp_id=10004&topic_id=1000002221
可以根据原理图对生成的网络表进行手工编辑, 检查通过后即可自动布线。用制板软件自动布局和布线的板面都不十分理想。网络表错误可能是没有指定原理图中元件封装;也可能是布电路板的库中没有包含指定原理图中全部元件封装。如果是单面板就不要用自动布线,双面板就可以用自动布线。也可以对电源和重要的信号线手动,其他的自动。
89、PCB与PCB的连接,通常靠接插镀金或银的“手指”实现,如果“手指”与插座间接触不良怎么办? http://www.eetchina.com/DG/eec_dg_free_reply.php?disc_grp_id=10007&topic_id=1000006877
如果是清洁问题,可用专用的电器触点清洁剂清洗,或用写字用的橡皮擦清洁PCB。还要考虑1、金手指是否太薄,焊盘是否和插座不吻合;2、插座是否进了松香水或杂质;3、插座的质量是否可靠。
90、如何用powerPCB设定4层板的层? http://www.eetchina.com/DG/eec_dg_free_reply.php?disc_grp_id=10004&topic_id=1000006458 
可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (power) 4:no plane+component(如果单面放元件可以定义为no plane+route) 注意: cam plane生成电源和地层是负片,并且不能在该层走线,而split/mixed生成的是正片,而且该层可以作为电源地,也可以在该层走线(部推荐在电源层和地层走线,因为这样会破坏该层的完整性, 可能造成EMI的问题) 。将电源网络(如3.3V,5V等)在2层的assign中由左边列表添加到右边列表,这样就完成了层定义
91、PCB中各层的含义是什么?http://www.eetchina.com/DG/eec_dg_free_reply.php?disc_grp_id=10004&topic_id=1000006038
Mechanical 机械层:定义整个PCB板的外观,即整个PCB板的外形结构。Keepoutlayer 禁止布线层:定义在布电气特性的铜一侧的边界。也就是说先定义了禁止布线层后,在以后的布过程中,所布的具有电气特性的线不可以超出禁止布线层的边界。Topoverlay 顶层丝印层 & Bottomoverlay 底层丝印层:定义顶层和底的丝印字符,就是一般在PCB板上看到的元件编号和一些字符。 Toppaste 顶层焊盘层 &  Bottompaste 底层焊盘层:指我们可以看到的露在外面的铜铂。Topsolder 顶层阻焊层 &  Bottomsolder 底层阻焊层:与toppaste和bottompaste两层相反,是要盖绿油的层。Drillguide 过孔引导层: Drilldrawing 过孔钻孔层: Multiplayer 多层:指PCB板的所有层。
92、在高速PCB中,VIA可以减少很大的回流路径,但有的又说情愿弯一下也不要打VIA,应该如何取舍? 
分析RF电路的回流路径,与高速数字电路中信号回流还不太一样。首先,二者有共同点,都是分布参数电路,都是应用maxwell方程计算电路的特性。 然而,射频电路是模拟电路,有电路中电压V=V(t),电流I=I(t)两个变量都需要进行控制,而数字电路只关注信号电压的变化V=V(t)。因此,在RF布线中,除了考虑信号回流外,还需要考虑布线对电流的影响。即打弯布线和过孔对信号电流有没有影响。 此外,大多数RF板都是单面或双面PCB,并没有完整的平面层,回流路径分布在信号周围各个地和电源上,仿真时需要使用3D场提取工具分析,这时候打弯布线和过孔的回流需要具体分析;高速数字电路分析一般只处理有完整平面层的多层PCB,使用2D场提取分析,只考虑在相邻平面的信号回流,过孔只作为一个集总参数的R-L-C处理。
93、在设计PCB板时,有如下两个叠层方案: 叠层1 》信号 》地 》信号 》电源+1.5V 》信号 》电源+2.5V 》信号 》电源+1.25V 》电源+1.2V 》信号 》电源+3.3V 》信号 》电源+1.8V 》信号 》地 》信号 叠层2 》信号 》地 》信号 》电源+1.5V 》信号 》地 》信号 》电源+1.25V +1.8V 》电源+2.5V +1.2V 》信号 》地 》信号 》电源+3.3V 》信号 》地 》信号 哪一种叠层顺序比较优选?对于叠层2,中间的两个分割电源层是否会对相邻的信号层产生影响?这两个信号层已经有地平面给信号作为回流路径。 
应该说两种层叠各有好处。第一种保证了平面层的完整,第二种增加了地层数目,有效降低了电源平面的阻抗,对抑制系统EMI有好处。 理论上讲,电源平面和地平面对于交流信号是等效的。但实际上,地平面具有比电源平面更好的交流阻抗,信号优选地平面作为回流平面。但是由于层叠厚度因素的影响,例如信号和电源层间介质厚度小于与地之间的介质厚度,第二种层叠中跨分割的信号同样在电源分隔处存在信号回流不完整的问题。 
94、当信号跨电源分割时,是否表示对该信号而言,该电源平面的交流阻抗大?此时,如果该信号层还有地平面与其相邻,即使信号和电源层间介质厚度小于与地之间的介质厚度,信号是否也会选择地平面作为回流路径?
没错,这种说法是对的,根据阻抗计算公式,Z=squa(L/C), 在分隔处,C变小,Z增大。当然此处,信号还与地层相邻,C比较大,Z较小,信号优先从完整的地平面上回流。但是,不可避免会在分隔处产生阻抗不连续。
95、在使用protel 99se软件设计,处理器的是89C51,晶振12MHZ 系统中还有一个40KHZ的超声波信号和800hz的音频信号,此时如何设计PCB才能提供高抗干扰能力?对于89C51等单片机而言,多大的信号的时候能够影响89C51的正常工作?除了拉大两者之间的距离之外,还有没有其他的技巧来提高系统抗干扰的能力? 
PCB设计提供高抗干扰能力,当然需要尽量降低干扰源信号的信号变化沿速率,具体多高频率的信号,要看干扰信号是那种电平,PCB布线多长。除了拉开间距外,通过匹配或拓扑解决干扰信号的反射,过冲等问题,也可以有效降低信号干扰。
96、请问焊盘对高速信号有什么影响? 
一个很好的问题。焊盘对高速信号有的影响,它的影响类似器件的封装对器件的影响上。详细的分析,信号从IC内出来以后,经过绑定线,管脚,封装外壳,焊盘,焊锡到达传输线,这个过程中的所有关节都会影响信号的质量。但是实际分析时,很难给出焊盘、焊锡加上管脚的具体参数。所以一般就用IBIS模型中的封装的参数将他们都概括了,当然这样的分析在较低的频率上分析是可以接收的,对于更高频率信号更高精度仿真,就不够精确了。现在的一个趋势是用IBIS的V-I、V-T曲线描述buffer特性,用SPICE模型描述封装参数。当然,在IC设计当中,也有信号完整性问题,在封装选择和管脚分配上也考虑了这些因素对信号质量的影响。 
97、自动浮铜后,浮铜会根据板子上面器件的位置和走线布局来填充空白处,但这样就会形成很多的小于等于90度的尖角和毛刺(比如一个多脚芯片各个管脚之间会有很多相对的尖角浮铜),在高压测试时候会放电,无法通过高压测试,不知除了自动浮铜后通过人工一点一点修正去除这些尖角和毛刺外有没有其他的好办法。
自动浮铜中出现的尖角浮铜问题,的确是各很麻烦的问题,除了有你提到的放电问题外,在加工中也会由于酸滴积聚问题,造成加工的问题。从2000年起,mentor在WG和EN当中,都支持动态铜箔边缘修复功能,还支持动态覆铜,可以自动解决你所提到的问题。请见动画演示。(如直接打开有问题,请按鼠标右键选择“在新窗口中打开”,或选择“目标另存为”将该文件下载到本地硬盘再打开。) 
98、请问在PCB 布线中电源的分布和布线是否也需要象接地一样注意。若不注意会带来什么样的问题?会增加干扰么? 
电源若作为平面层处理,其方式应该类似于地层的处理,当然,为了降低电源的共模辐射,建议内缩20倍的电源层距地层的高度。如果布线,建议走树状结构,注意避免电源环路问题。电源闭环会引起较大的共模辐射。 
99、地址线是否应该采用星形布线?若采用星形布线,则Vtt的终端电阻可不可以放在星形的连接点处或者放在星形的一个分支的末端?
地址线是否要采用星型布线,取决于终端之间的时延要求是否满足系统的建立、保持时间,另外还要考虑到布线的难度。星型拓扑的原因是确保每个分支的时延和反射一致,所以星型连接中使用终端并联匹配,一般会在所有终端都添加匹配,只在一个分支添加匹配,不可能满足这样的要求。
100、如果希望尽量减少板面积,而打算像内存条那样正反贴,可以吗?
正反贴的PCB设计,只要你的焊接加工没问题,当然可以。
101、如果只是在主板上贴有四片DDRmemory,要求时钟能达到150Mhz,在布线方面有什么具体要求?
150Mhz的时钟布线,要求尽量减小传输线长度,降低传输线对信号的影响。如果还不能满足要求,仿真一下,看看匹配、拓扑、阻抗控制等策略是有效。

102、在PCB板上线宽及过孔的大小与所通过的电流大小的关系是怎样的? 
答:一般的PCB的铜箔厚度为1盎司,约1.4mil的话,大致1mil线宽允许的最大电流为1A。过孔比较复杂,除了与过孔焊盘大小有关外,还与加工过程中电镀后孔壁沉铜厚度有关。 

- 作者: badcup 2006年06月7日, 星期三 09:41  回复(0) |  引用(0) 加入博采

不同编译器下基本数据长度

 

KEIL uVision2 C51编译器所支持的数据类型

表中列出了KEIL uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中nt和short相同,float和double相同,这里就不列出说明了。下面来看看它们的具体定义:

数据类型

长 度

值 域

unsigned char

单字节

0~255

signed char

单字节

-128~+127

unsigned int

双字节

0~65535

signed int

双字节

-32768~+32767

unsigned long

四字节

0~4294967295

signed long

四字节

-2147483648~+2147483647

float

四字节

±1.175494E-38~±3.402823E+38

*

1~3字节

对象的地址

bit

0或1

sfr

单字节

0~255

sfr16

双字节

0~65535

sbit

0或1

TorboC编译器的数据长度说明:

整型变量

  整型变量可分为以下几类:

  1.基本型

  类型说明符为int,在内存中占2个字节,其取值为基本整常数。

  2.短整量

  类型说明符为short int或short'C110F1。所占字节和取值范围均与基本型相同。

  3.长整型

  类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。

  4.无符号型

  类型说明符为unsigned。

  无符号型又可与上述三种类型匹配而构成:

  (1)无符号基本型 类型说明符为unsigned int或unsigned。

  (2)无符号短整型 类型说明符为unsigned short

  (3)无符号长整型 类型说明符为unsigned long

  各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。 下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。

类型说明符    数的范围     分配字节数
int       -32768~32767     ■■
short int    -32768~32767     ■■
signed int    -32768~32767     ■■
unsigned int   0~65535        ■■
long int  -2147483648~2147483647  ■■■■
unsigned long  0~4294967295     ■■■■                           

在ARM系统应用的数据类型如下 不同编译器可能有所不同

ARM编译器支持的数据类型

************************************************************
数据类型 长度(位) 对齐特性
Char 8 1(字节对齐)
short 16 2(百字对齐)
Int 32 4(字对齐)
Long 32 4(字对齐)
Longlong 64 4(字对齐)
Float 32 4(字对齐)
Double 64 4(字对齐)
Long double 64 4(字对齐)
All pointers 32 4(字对齐)
Bool(C++ only) 32 4(字对齐)

1.整数类型
ARM体系中,整数类型是以2的补码形式存储的。对于long long类型来说,在little endian内存模式下,其低32位保存在低地址的字单元中,高32为保存在高地址的字单元中;在big endian模式下,其低32位保存在高地址的字单元中,高32为保存在低地址的字单元中。对于整型数据的操作遵守下面的规则:
**所有带符号的整型书的运算是按照二进制的补码进行的。
**带符号的整型数的运算不进行符号的扩展。
**带符号的整型数的右移操作是算数移位。
**制定的移位位数的数是8位的无符号数。
**进行移位操作的数被作为32位数。
**超过31位的逻辑左移的结果为0。
**对于无符号数和有符号的正数来说,超过32位的右移操作结果为0;对于有符号的负数来说,超过32位的右移操作结果为-1。
**整数除法运算的余数和除数有相同的符号。
**当把一个整数截断成位数更短的整数类型的数时,并不能保证所得到的结果的最高位的符号位的正确性。
**整型数据之间的类型转换不会产生异常中断。
**整型数据的溢出不会产生异常中断。
**整型数据除以0将会产生异常中断。
2.浮点数
ARM体系中,浮点数是按照IEEE标准存储的。
**float类型的数是按照IEEE的单精度数表示的。
**double和long double 是用IEEE的双精度数表示的。
对于浮点数的操作遵守下面的规则:
**遵守正常的IEEE754规则。
**当默认情况下禁止浮点数运算异常中断。
**当发生卷绕时,用最接近的数据来表示。
3.指针类型的数据
下面的规则适用于处数据成员指针以外的其他指针:
**NULL被定义为0。
**相邻的两个存储单元地址相差一。
**在指向函数的指针和指向数据的指针进行数据转换时,编译器将会产生警告信息。
**类型size_t被定义为unsigned int.
**类型ptrdiff_t被定义为signed int。
**两个指针类型的数据相减时,结果可以按照下面的公式得到。
((int)a-(int)b)/(int)sizeof(type pointed to)
这时,只要指针所指的对象不是pack的,其对齐特性能够满足整除的要求。
ARM基础知识
*****************************************************

ARM编译器中预定义的宏

*****************************************************
ARM编译器预定义了一些宏,这些预定义宏对应一定的数值,有些预定义宏没有对应数值,见下表:

_arm _ 使用编译器armcc,tcc,armcpp,tcpp时

_ARMCC_VERSION Ver 代表编译器版本号,其格式为:
PVtbbb,其中:
P为产品编号(1代表ADS)
V为副版本号(1代表1.1)
T为补丁版本号(0代表1.1)
bbb为build号(比如650)

_APCS_INTERWORK _ 使用编译选项-apcs/interwork时

_APCS_ROPI _ 使用编译选项apcs/ropi时

_RWPI _ 使用编译选项-apcs/rwpi时

_APCS_SWST _ 使用编译选项-apcs/swst时

_BIG_ENDIAN _ 编译器针对目标系统使用big-endian内存模式时

_cplusplus _ 编译器工作与C++模式时

_CC_ARM _ 返回编译器的名称

_DATE_ date 编译源文件的日期

_embedded_cplusplus 编译器工作于EC++模式时

_FEATURE_SINGED_CHAE 使用编译设置选项-zc时设置该预定义宏

_FILE_ name 包含全路径的当前被编译的源文件名称

_func_ name 当前被编译的函数名称

_LINE_ num 当前被编译的代码行号名称

_MOUDLE_ mod 预定义宏_FILE_的文件名称部分

_OPTIMISE_SPACE _ 使用编译选项-OSPACE时

_OPTIMISE_TIME _ 使用编译选项-Otime时

_pretty_func name unmangled的当前函数名称

_sizeof_int 4 sizeof(int),在预处理表达式中可以使用

_sizeof_long 4 sizeof(long),在预处理表达式中可以使用

_sizeof_ptr 4 sizeof(void*)在预处理表达式中可以使用

_SOFTFP _ 编译时使用浮点数

_ _ 在各种编译器模式下

_STDC_VERSION _ 标准的版本信息

_STRICT_ANSI_ _ 使用编译选项-STRICT时

_TARGET_ARCH_xx _ xx代表ARM体系编号

_TARGET_CPU_xx _ xx代表CPU编号

_TARGET_FEATURE_ 当ARM体系支持指令PLD,LDRD,STRD,MCRR,MRRC时
DOUBLEWORD _ 设置该定义宏

_TARGET_FEATURE_ 当系统中包含DSP乘法处理器时,设置该
DSPMUL _ 预定义宏

_TARGET_FEATURE_ 如果目标ARM体系支持半字访问以及有符号的字节数据
HALFWORD _ ,设置该预定义宏

_TARGET_FEATURE_ 如果目标ARM体系支持长乘法指令ULL和
MULTIPLY _ MUAL,设置该预定义宏

_TARGET_FEATURE_ 如果目标ARM体系支持THUMB指令
THUMB _

_TARGET_FPU_xx _ 表示FPU选项,可能取值如下所示:
_TARGET_FPU_VFP
_TARGET_FPU_FPA
_TARGET_FPU_SOFTVFP
_TARGET_FPU_SOFTVFP_VFP
_TARGET_FPU_SOFTFPA
_TARGET_FPU_NONE

_thumb _ 编译器为tcc或tcpp时,设置该预定义宏

_TIME 源文件编译时间

- 作者: badcup 2006年04月19日, 星期三 17:02  回复(0) |  引用(0) 加入博采

LCD基础及S3C2410 LCD控制器
LCD基础及S3C2410 LCD控制器 
(发布日期:2005-7-13 22:39:46)
  浏览人数:374

点此滚屏鼠标双击自动滚屏 

    一、超薄平面显示器时代来临

    电视机所采用的 CRT(阴极射线管)有着体积大、重量重、尺寸受限等缺点。随着电子科技的发展,对移动显示的要求越来越多,CRT 的先天限制,让其小型化、行动化的理想受到阻碍。这使得开发新一代的显示器技术变得更有其必要! 新一代的显示器讲求几个重点:平面直角,画面显示不变形、轻薄短小耗能少,携带方便且同时要与现有的影像信号技术兼容。目前谈论到超薄型显示器技术,最普及当是 TFT LCD 的应用了,举凡数字相机、笔记型计算机、PDA 等,需要显示复杂信息的电子产品通通少不了它。TFT LCD 技术又包含了,低温多硅晶TFT LCD、反射式TFT LCD 等,多项不同的显示技术,下面我们就要来一探 LCD 的历史与原理。

二、液晶的发明与发现
    液晶的诞生来自于一项非常特殊物质的发现,早在 1850 年 Virchow, Mettenheimer 和 Valentin 这三个人就发现 nerve fibre 的粹取物中含有这种不寻常的东西。到了 1877 年德国物理学家 Otto Lehmann 运用偏极化的显微镜首次观测到了液晶化的现象,但他对此一现象的成因并不了解。直到公元1888年,奥地利的植物学家 Friedrich Reinitzer(1857-1927)发现了螺旋性甲苯酸盐的化合物(cholesteryl benzoate),确认了这种化合物在加热时具有两个不同温度的熔点,在这两个不同的温度点中,其状态介于一般液态与固态物质之间,类似胶状,但在某一温度范围内其又具有液体和结晶双方性质,由于其特殊的状态。Reinitzer 后来走访 Lehmann 深入探讨这种物质的表现,其后两人便命名这种物质为「Liquid Crystal」,就是液态结晶物质的意思。Reinitzer 和 Lehmann 这两人被誉为液晶之父。

    同 CRT 阴极射线管一样,液晶虽早在1888年就被发现(实际上,但是实际应用在生活周遭时,已是80年后的事了。因为液晶在两次大战中对军事用途的帮助不大,以致于 其发展落后 CRT 甚多。比较重要的是 1922 年 Oseen 和 Z?cher 这两位科学家为液晶确立状态变化之方程式。一直到了 1968年美国RCA公司工程师们利用液晶分子受到电压的影响而改变其分子的排列状态,并且可以让入射光线产生偏转的现象之原理,制造了世界第一台使用液晶显示的屏幕。由此开始,加上了1970年代日本 SONY 与 Sharp 两家公司对液晶显示技术全面开发与应用,让液晶显示器成功的融入现代的电子产品之中。

    描述液晶的物理性质,必须先了解一般固态晶体具有方向性,而液态晶体这种特殊物质,不但具有一般固体晶体的方向性外,同时又具有液体的流动性。改变固态晶体方向必须旋转整个晶体,改变液态晶体就不用那幺麻烦,它的方向性可经由电场或磁场来控制。 
改变液晶的方向视液晶的成分而有所不同,有的液晶和电场平行时位能较低,所以当外加电场时会朝着电场方向转动,相对的,也有液晶是对应电场垂直时位能较低。由于液晶对于外加力量(电场或磁场敏感),从而呈现了方向性的效果,也导致了当光线入射液晶中时,必然会按照液晶分子的排列方式行进,产生了自然的偏转现像(见图3-1)。 
<img src=photo/1.jpg></img>
图3-1

    部分液晶分子的电子结构中,有着很强的电子共轭运动能力,所以当液晶分子受到外加电场的作用,便很容易的被极化产生感应偶极性(induced dipolar),这也是液晶分子之间互相作用力量的来源。而一般电子产品中所用的液晶显示器,就是是利用液晶的光电效应,藉由外部的电压控制,再透过液晶分子的折射特性,以及对光线的旋转能力来获得亮暗情况,进而达到显像的目的。



电源关闭时,液晶具有偏光效果 
可将入射光线转弯,穿过极栅,呈现亮色  


电源开启时液晶不具有偏光的功能
因此光线不能通过极栅呈现暗色  


三、液晶显示器的种类
    利用液晶制成的显示器称为液晶显示器,英文称 LCD(Liquid Crystal Display)。其种类可分为依驱动方式之静态驱动(Static)、单纯矩阵驱动(Simple Matrix)以及主动矩阵驱动(Active Matrix)三种。而其中,单纯矩阵型又是俗称的被动式(Passive),可分为扭转向列型(Twisted Nematic,简称 TN)和超扭转式向列型(Super Twisted Nematic,简称STN)两种;而主动矩阵型则以薄膜式晶体管型(Thin Film Transistor;TFT)为目前主流。

TN型
TN型液晶显示技术可说是液晶显示器中最基本的,其它种类的液晶显示器也可说是以TN型为蓝本加以改良。同样的,它的运作原理也较其它技术来的简单。TN 的构造包括了垂直方向与水平方向的偏光板(Polarizer),其上具有细纹沟槽,中间夹杂液晶材料以及导电的玻璃基板(Glass)。

STN/DSTN
STN型的显示原理也类似,不同的是TN型的液晶分子是将入射光旋转90度,而STN则可将入射光旋转180~270度。 单纯的 TN 显示器本身只有明暗两种显示(或黑白),无法产生色彩的变化。TN LCD 采用的是“直接驱动”无法显示较多的像素,且画面的对比小,反应速度慢,视角更仅在+30度以下(即观赏角度约60度),显示质量也较差;故TN型LCD主要用途在于简单的数字符与文字的显示,如:电子表及电子计算器等。 STN的出现改善了视角狭小的缺点并提高对比率,STN以“多任务驱动”增加扫瞄线数提高画素显示,品较TN来得高。再搭配彩色滤光片的使用,将单色显示矩阵的任一像素(pixel)分成三个子像素(sub-pixel),分别透过彩色滤光片显示红、绿、蓝三原色,再经由三原色比例之调和,可以显示出逼近全彩模式的色彩。由于 STN 显示的画面色彩对比度仍只达30:1(对比愈小,画面愈不清楚);反应速度为150ms(毫秒),作为一般操作显示接口尚可,但若要播放电影速度仍然不够。

由于 STN 仍有不少缺点,后续的 DSTN则通过双扫描方式来显示,由于DSTN采用双扫描技术,因此显示效果相对STN来说,有大幅度提高。DSTN 反应速度可达到 100ms,但因它们都为“被动式驱动”,在电场反复改变电压的过程中,每一像素的恢复过程都较慢,在屏幕画面快速变化时,例如:显示网球比赛的转播,就会产生所谓的“拖尾”现象。特别是当网球选手击球的那一瞬间,你就可以看到拖屏幕上出现“球迹尾”现象。不过,DSTN 价格便宜、功耗能低,一些 PDA 等,仍使用 DSTN 作为显示装置。 

TFT
TN与STN型液晶显示器都是使用场电压驱动方式,如果显示尺寸加大,中心部位对电极变化的反应时间就会拉长,显示器的速度就跟不上。 为了改善这个的问题,主动式矩阵(active-matrix )驱动被提出,主动式 TFT型的液晶显示器的结构较为复杂包括了:背光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料和薄模式晶体管等等(如图3-2)。在TFT型液晶显器中,导电玻璃上画上网状的细小线路,电极则由是薄膜式晶体管所排列而成的矩阵开关,在每个线路相交的地方配有控制闸,各显示点控制闸配合驱动讯号作动。电极上之晶体管矩阵依显示讯号开启或关闭液晶分子的电压,使液晶分子轴转向而成“亮”或“暗”的对比,避免了显示器对电场效应的依靠,转以晶体管开启和关闭的速率作为决定步骤。 也因此,TFT-LCD 的显示质量较 TN/STN佳,画面显示对比可达150:1以上,反应速度逼近 30ms 甚至更快。同时又可以全彩甚至真彩效果显示,产品适用于PDA、笔记型计算机、液晶显示器、汽车导航系统、数字相机及液晶投影机。





图3-2

下面的表格对TN、STN、TFT的各自特性做了对比

TN、STN及TFT型液晶显示器之比较表 

类别      TN                  STN               TFT  
原理      液晶分子,扭转90度  扭转180~270度     液晶分子,扭转90度  
特性      黑白、单色低对比    黑白、彩色,低对比 彩色(1667万色)高对比
全色彩化  否                  否                可媲美CRT之全彩色 
动画显示  否                  否                可媲美CRT 
视角      30度以下            40度以下          80度以下  
面板尺寸  1~3寸               1~12寸            37寸以下  


四、液晶显示器的发展与未来
    TFT LCD 之所以成功,在于其每个像素后面都配置一个晶体管开关作为控制整合之用,以致于整个 TFT LCD 看起来就类似一个大型整合电路。由于 TFT LCD 必须将画素作得非常小,让人眼只能看到画面,分辨不出画素,所以 TFT LCD 的生产工艺就相当精密。过去,因为技术尚未成熟,在一大片的 TFT LCD 当中难免有些节点,无法连接或连接错误,导致无法显示正确画素,这些统称“坏点”,包含常见的“红、蓝、绿点”无法自行控制、“黑、白点”无法使用等。目前高精密的技术已经足以克服 TFT LCD 在生产过程中产生“坏点”的机率,部分“坏点”也可通过“暗点化”(人类的眼睛对于暗画素不敏感)将其消隐。

    由于 TFT-LCD 成功的解决 CRT 的缺点,连带的使其应用范围加广范!同时,也发生了一些意想不到的问题,例如:在阳光下 TFT LCD 显示不佳,需要倚靠遮光罩或透光式设计减少反光的发生,才能将其看得清楚。另外,也有利用特殊镀膜技术,减少背景光泄漏、增加屏幕黑度、提高对比度的作用,并可以同时减小在日常明亮工作环境下的眩光现象。

五、S3C2410内置LCD控制器详解

    一块LCD屏显示图像,不但需要LCD驱动器,还需要有相应的LCD控制器。通常LCD驱动器会以COF/COG的形式与LCD 玻璃基板制做在一起,而LCD控制器则有外部电路来实现。而S3C2410内部已经集成了LCD控制器,因此可以很方便地去控制各种类型的LCD屏,例如:STN和TFT屏。由于TFT屏将是今后应用的主流,因此接下来,重点围绕TFT屏的控制来进行。
S3C2410 LCD控制器的特性:

STN屏
-支持3种扫描方式:4bit单扫、4位双扫和8位单扫
-支持单色、4级灰度和16级灰度屏
-支持256色和4096色彩色STN屏(CSTN)
-支持分辩率为640*480、320*240、160*160以及其它规格的多种LCD

TFT屏
-支持单色、4级灰度、256色的调色板显示模式
-支持64K和16M色非调色板显示模式
-支持分辩率为640*480,320*240及其它多种规格的LCD
对于控制TFT屏来说,除了要给它送视频资料(VD[23:0])以外,还有以下一些信号是必不可少的,分别是:
VSYNC(VFRAME) :帧同步信号
HSYNC(VLINE) :行同步信号
VCLK :像数时钟信号
VDEN(VM) :数据有效标志信号
图3-3是S3C2410内部的LCD控制器的逻辑示意图:


图3-3 
REGBANK 是LCD控制器的寄存器组,用来对LCD控制器的各项参数进行设置。而 LCDCDMA 则是LCD控制器专用的DMA信道,负责将视频资料从系统总线(System Bus)上取来,通过 VIDPRCS 从VD[23:0]发送给LCD屏。同时 TIMEGEN 和 LPC3600 负责产生 LCD屏所需要的控制时序,例如VSYNC、HSYNC、VCLK、VDEN,然后从 VIDEO MUX 送给LCD屏。 

TFT屏时序分析

图3-4是TFT屏的典型时序。其中VSYNC是帧同步信号,VSYNC每发出1个脉冲,都意味着新的1屏视频资料开始发送。而HSYNC为行同步信号,每个HSYNC脉冲都表明新的1行视频资料开始发送。而VDEN则用来标明视频资料的有效,VCLK是用来锁存视频资料的像数时钟。
并且在帧同步以及行同步的头尾都必须留有回扫时间,例如对于VSYNC来说前回扫时间就是(VSPW+1)+(VBPD+1),后回扫时间就是(VFPD+1);HSYNC亦类同。这样的时序要求是当初CRT显示器由于电子枪偏转需要时间,但后来成了实际上的工业标准,乃至于后来出现的TFT屏为了在时序上于CRT兼容,也采用了这样的控制时序。




图3-4 
YFARM9-EDU-1采用的是Samsung公司的1款3.5寸TFT真彩LCD屏,分辩率为240*320,下图为该屏的时序要求。 

图3-5 
 

通过对比图3-4和图3-5,我们不难看出:
VSPW+1=2 -> VSPW=1
VBPD+1=2 -> VBPD=1
LINVAL+1=320-> LINVAL=319
VFPD+1=3 -> VFPD=2

HSPW+1=4 -> HSPW=3
HBPD+1=7 -> HBPW=6
HOZVAL+1=240-> HOZVAL=239
HFPD+1=31 -> HFPD=30
以上各参数,除了LINVAL和HOZVAL直接和屏的分辩率有关,其它的参数在实际操作过程中应以上面的为参考,不应偏差太多。 
LCD控制器主要寄存器功能详解
(1)LCDCON1



LINECNT :当前行扫描计数器值,标明当前扫描到了多少行
CLKVAL :决定VCLK的分频比。LCD控制器输出的VCLK是直接由系统总线(AHB)的工作频率HCLK直接分频得到的。做为240*320的TFT屏,应保证得出的VCLK在5~10MHz之间
MMODE :VM信号的触发模式(仅对STN屏有效,对TFT屏无意义)
PNRMODE :选择当前的显示模式,对于TFT屏而言,应选择[11],即TFT LCD panel
BPPMODE :选择色彩模式,对于真彩显示而言,选择16bpp(64K色)即可满足要求
ENVID :使能LCD信号输出
 

VBPD , LIEVAL , VFPD , VSPW 的各项含义已经在前面的时序图中得到体现,这里不再赘述。 

HBPD , HOZVAL , HFPD 的各项含义已经在前面的时序图中得到体现,这里不再赘述。

HSPW 的含义已经在前面的时序图中得到体现,这里不再赘述。
MVAL 只对 STN屏有效,对TFT屏无意义。

- 作者: badcup 2006年03月30日, 星期四 17:23  回复(0) |  引用(0) 加入博采

电容器类型和标号

钽电解 CA   

复合介质 CH  

铌电解 CO  

漆膜介质 CQ  

铝电解 CD

云母 CY

其它电解 CE

合金电解 CG

高频瓷介 CC

纸介 CZ

低频瓷介 CT

聚苯乙稀 CB

涤纶 CL

聚丙稀 CBB

玻璃膜 CO

聚四氟乙稀 CBF

玻璃釉 CI

聚碳酸脂 CLS


金属化纸介 CJ

- 作者: badcup 2006年03月10日, 星期五 10:34  回复(0) |  引用(0) 加入博采

74系列

74系列集成电路大致可分为6大类:
. 74××(标准型);
.74LS××(低功耗肖特基);
.74S××(肖特基);
.74ALS××(先进低功耗肖特基);
.74AS××(先进肖特基);
.74F××(高速)。
近年来还出现了高速CMOS电路的74系列,该系列可分为3大类:
. HC为COMS工作电平;
. HCT为TTL工作电平,可与74LS系列互换使用;
.HCU适用于无缓冲级的CMOS电路。
这9种74系列产品,只要后边的标号相同,其逻辑功能和管脚排列就相同。根据不同的条件和要求可选择不同类型的74系列产品,比如电路的供电电压为3V就应选择74HC系列的产品

系列 电平 典型传输延迟ns 最大驱动电流(-Ioh/Lol)mA
AHC CMOS 8.5 -8/8
AHCT COMS/TTL 8.5 -8/8
HC COMS 25 -8/8
HCT COMS/TTL 25 -8/8
ACT COMS/TTL 10 -24/24
F TTL 6.5 -15/64
ALS TTL 10 -15/64
LS TTL 18 -15/24

LVC

AC

S

LC



注:同型号的74系列、74HC系列、74LS系列芯片,逻辑功能上是一样的。
74LSxx的使用说明如果找不到的话,可参阅74xx或74HCxx的使用说明。
有些资料里包含了几种芯片,如74HC161资料里包含了74HC160、74HC161、
74HC162、74HC163四种芯片的资料。找不到某种芯片的资料时,
可试着查看一下临近型号的芯片资料。

7400 QUAD 2-INPUT NAND GATES      与非门
7401 QUAD 2-INPUT NAND GATES OC    与非门
7402 QUAD 2-INPUT NOR GATES      或非门
7403 QUAD 2-INPUT NAND GATES      与非门
7404 HEX INVERTING GATES        反向器
7406 HEX INVERTING GATES HV   高输出反向器
7408 QUAD 2-INPUT AND GATE        与门
7409 QUAD 2-INPUT AND GATES OC      与门
7410 TRIPLE 3-INPUT NAND GATES     与非门
7411 TRIPLE 3-INPUT AND GATES      与门
74121 ONE-SHOT WITH CLEAR       单稳态
74132 SCHMITT TRIGGER NAND GATES 触发器与非门
7414 SCHMITT TRIGGER INVERTERS  触发器反向器
74153 4-LINE TO 1 LINE SELECTOR    四选一
74155 2-LINE TO 4-LINE DECODER     译码器
74180 PARITY GENERATOR/CHECKER  奇偶发生检验
74191 4-BIT BINARY COUNTER UP/DOWN   计数器
7420 DUAL 4-INPUT NAND GATES  双四输入与非门
7426 QUAD 2-INPUT NAND GATES      与非门
7427 TRIPLE 3-INPUT NOR GATES  三输入或非门
7430 8-INPUT NAND GATES    八输入端与非门
7432 QUAD 2-INPUT OR GATES     二输入或门
7438 2-INPUT NAND GATE BUFFER  与非门缓冲器
7445 BCD-DECIMAL DECODER/DRIVER BCD译码驱动器
7474 D-TYPE FLIP-FLOP        D型触发器
7475 QUAD LATCHES          双锁存器
7476 J-K FLIP-FLOP         J-K触发器
7485 4-BIT MAGNITUDE COMPARATOR  四位比较器
7486 2-INPUT EXCLUSIVE OR GATES  双端异或门
74HC00 QUAD 2-INPUT NAND GATES  双输入与非门
74HC02 QUAD 2-INPUT NOR GATES  双输入或非门
74HC03 2-INPUT OPEN-DRAIN NAND GATES  与非门
74HC04 HEX INVERTERS        六路反向器
74HC05 HEX INVERTERS OPEN DRAIN  六路反向器
74HC08 2-INPUT AND GATES      双输入与门
74HC107 J-K FLIP-FLOP WITH CLEAR  J-K触发器
74HC109A J-K FLIP-FLOP W/PRESET   J-K触发器
74HC11 TRIPLE 3-INPUT AND GATES  三输入与门
74HC112 DUAL J-K FLIP-FLOP    双J-K触发器
74HC113 DUAL J-K FLIP-FLOP PRESET 双JK触发器
74HC123A RETRIGGERABLE MONOSTAB 可重触发单稳
74HC125 TRI-STATE QUAD BUFFERS   四个三态门
74HC126 TRI-STATE QUAD BUFFERS    六三态门
74HC132 2-INPUT TRIGGER NAND 施密特触发与非门
74HC133 13-INPUT NAND GATES  十三输入与非门
74HC137 3-TO-8 DECODERS W/LATCHES 3-8线译码器
74HC138 3-8 LINE DECODER    3线至8线译码器
74HC139 2-4 LINE DECODER    2线至4线译码器74HC14 TRIGGERED HEX INVERTER  六触发反向器
74HC147 10-4 LINE PRIORITY ENCODER 10-4编码器
74HC148 8-3 LINE PRIORITY ENCODER  8-3编码器
74HC149 8-8 LINE PRIORITY ENCODER  8-8编码器
74HC151 8-CHANNEL DIGITAL MUX   8通道多路器
74HC153 DUAL 4-INPUT MUX    双四输入多路器
74HC154 4-16 LINE DECODER   4线至16线译码器
74HC155 2-4 LINE DECODER    2线至4线译码器
74HC157 QUAD 2-INPUT MUX    四个双端多路器
74HC161 BINARY COUNTER      二进制计数器
74HC163 DECADE COUNTERS     十进制计数器
74HC164 SERIAL-PARALLEL SHIFT REG  串入并出
74HC165 PARALLEL-SERIAL SHIFT REG  并入串出
74HC166 SERIAL-PARALLEL SHIFT REG  串入并出
74HC173 TRI-STATE D FLIP-FLOP   三态D触发器
74HC174 HEX D FLIP-FLOP W/CLEAR   六D触发器
74HC175 HEX D FLIP-FLOP W/CLEAR   六D触发器
74HC181 ARITHMETIC LOGIC UNIT  算术逻辑单元
74HC182 LOOK AHEAD CARRYGENERATR  进位发生器
74HC190 BINARY UP/DN COUNTER 二进制加减计数器
74HC191 DECADE UP/DN COUNTER 十进制加减计数器
74HC192 DECADE UP/DN COUNTER 十进制加减计数器
74HC193 BINARY UP/DN COUNTER 二进制加减计数器
74HC194 4BIT BI-DIR SHIFT  4位双向移位寄存器
74HC195 4BIT PARALLEL SHIFT 4位并行移位寄存器
74HC20 QUAD 4-INPUT NAND GATE 四个四入与非门
74HC221A NON-RETRIG MONOSTAB  不可重触发单稳
74HC237 3-8 LINE DECODER 地址锁3线至8线译码器
74HC242/243 TRI-STAT TRANSCEIVER  三态收发器
74HC244 OCTAL 3-STATE BUFFER  八个三态缓冲门
74HC245 OCTAL 3-STATE TRANSCEIVER 三态收发器
74HC251 8-CH 3-STATE MUX     8路3态多路器
74HC253 DUAL 4-CH 3-STATE MUX  4路3态多路器
74HC257 QUAD 2-CH 3-STATE MUX  4路3态多路器
74HC258 2-CH 3-STATE MUX     2路3态多路器
74HC259 3-8 LINE DECODER  8位地址锁存译码器
74HC266A 2-INPUT EXCLUSIVE NOR GATE  异或非
74HC27 TRIPLE 3-INPUT NOR GATE三个3输入或非门
74HC273 OCTAL D FLIP-FLOP CLEAR  8路D触发器
74HC280 9BIT ODD/EVEN GENERATOR  奇偶发生器
74HC283 4BIT BINARY ADDER CARRY  四位加法器
74HC299 3-STATE UNIVERSAL SHIFT 三态移位寄存
74HC30 8-INPUT NAND GATE    8输入端与非门
74HC32 QUAD 2-INPUT OR GATE   四个双端或门
74HC34 NON-INVERTER         非反向器
74HC354 8-CH 3-STATE MUX     8路3态多路器
74HC356 8-CH 3-STATE MUX     8路3态多路器
74HC365 HEX 3-STATE BUFFER   六个三态缓冲门
74HC366 3-STATE BUFFER INVERTER  缓冲反向器
74HC367 3-STATE BUFFER INVERTER  缓冲反向器
74HC368 3-STATE BUFFER INVERTER  缓冲反向器
74HC373 3-STATE OCTAL D LATCHES 三态D型锁存器
74HC374 3-STATE OCTAL D FLIPFLOP 三态D触发器
74HC393 4-BIT BINARY COUNTER 4位二进制计数器
74HC4016 QUAD ANALOG SWITCH  四路模拟量开关
74HC4020 14-Stage Binary Counter 14输出计数器
74HC4017 Decade Counter/Divider with 10 Decoded Outputs
十进制计数器带10个译码输出端
74HC4040 12 Stage Binary Counter  12出计数器
74HC4046 PHASE LOCK LOOP    相位监测输出器
74HC4049 LEVEL DOWN CONVERTER   电平变低器
74HC4050 LEVEL DOWN CONVERTER   电平变低器
74HC4051 8-CH ANALOG MUX     8通道多路器
74HC4052 4-CH ANALOG MUX     4通道多路器
74HC4053 2-CH ANALOG MUX     2通道多路器
74HC4060 14-STAGE BINARY COUNTER 14阶BIN计数
74HC4066 QUAD ANALOG MUX     四通道多路器
74HC4075 TRIPLE 3-INPUT OR GATE   3输入或门
74HC42 BCD TO DECIMAL    BCD转十进制译码器
74HC423A RETRIGGERABLE MONOSTAB 可重触发单稳
74HC4511 BCD-7 SEG DRIVER/DECODER  7段译码器
74HC4514 4-16 LINE DECODER   4至16线译码器
74HC4538A RETRIGGERAB MONOSTAB  可重触发单稳
74HC4543 LCD BCD-7 SEG LCD用的BCD-7段译码驱动
74HC51 AND OR GATE INVERTER     与或非门
74HC521 8BIT MAGNITUDE COMPARATOR  判决定路
74HC533 3-STATE D LATCH      三态D锁存器
74HC534 3-STATE D FLIP-FLOP   三态D型触发器
74HC540 3-STATE BUFFER       三态缓冲器
74HC541 3-STATE BUFFER INVERTER三态缓冲反向器
74HC58 DUAL AND OR GATE        与或门
74HC589 3STATE 8BIT SHIFT 8位移位寄存三态输出
74HC594 8BIT SHIFT REG     8位移位寄存器
74HC595 8BIT SHIFT REG  8位移位寄存器出锁存
74HC597 8BIT SHIFT REG  8位移位寄存器入锁存
74HC620 3-STATE TRANSCEIVER   反向3态收发器
74HC623 3-STATE TRANSCEIVER  八路三态收发器
74HC640 3-STATE TRANSCEIVER   反向3态收发器
74HC643 3-STATE TRANSCEIVER  八路三态收发器
74HC646 NON-INVERT BUS TRANSCEIVER 总线收发器
74HC648 INVERT BUS TRANCIVER  反向总线收发器
74HC688 8BIT MAGNITUDE COMPARATOR 8位判决电路
74HC7266 2-INPUT EXCLUSIVE NOR GATE 异或非门
74HC73 DUAL J-K FLIP-FLOP W/CLEAR 双JK触发器
74HC74A PRESET/CLEAR D FLIP-FLOP  双D触发器
74HC75 4BIT BISTABLE LATCH   4位双稳锁存器
74HC76 PRESET/CLEAR JK FLIP-FLOP  双JK触发器
74HC85 4BIT MAGNITUDE COMPARATOR 4位判决电路
74HC86 2INPUT EXCLUSIVE OR GATE  2输入异或门
74HC942 BAUD MODEM    300BPS低速调制解调器
74HC943 300 BAUD MODEM  300BPS低速调制解调器
74LS00 QUAD 2-INPUT NAND GATES     与非门
74LS02 QUAD 2-INPUT NOR GATES     或非门
74LS03 QUAD 2-INPUT NAND GATES     与非门
74LS04 HEX INVERTING GATES       反向器
74LS05 HEX INVERTERS OPEN DRAIN  六路反向器
74LS08 QUAD 2-INPUT AND GATE       与门
74LS09 QUAD 2-INPUT AND GATES OC     与门
74LS10 TRIPLE 3-INPUT NAND GATES    与非门
74LS109 QUAD 2-INPUT AND GATES OC    与门
74LS11 TRIPLE 3-INPUT AND GATES     与门
74LS112 DUAL J-K FLIP-FLOP    双J-K触发器
74LS113 DUAL J-K FLIP-FLOP PRESET 双JK触发器
74LS114 NEGATIVE J-K FLIP-FLOP 负沿J-K触发器
74LS122 Retriggerable Monostab  可重触发单稳
74LS123 Retriggerable Monostable 可重触发单稳
74LS125 TRI-STATE QUAD BUFFERS   四个三态门
74LS13 QUAL 4-in NAND TRIGGER 4输入与非触发器
74LS160 BCD DECADE 4BIT BIN COUNTERS  计数器
74LS136 QUADRUPLE 2-INPUT XOR GATE   异或门
74LS138 3-8 LINE DECODER    3线至8线译码器
74LS139 2-4 LINE DECODER    2线至4线译码器
74LS14 TRIGGERED HEX INVERTER  六触发反向器
74HC147 10-4 LINE PRIORITY ENCODER 10-4编码器
74HC148 8-3 LINE PRIORITY ENCODER  8-3编码器
74HC149 8-8 LINE PRIORITY ENCODER  8-8编码器
74LS151 8-CHANNEL DIGITAL MUX   8通道多路器
74LS153 DUAL 4-INPUT MUX    双四输入多路器
74LS155 2-4 LINE DECODER    2线至4线译码器
74LS156 2-4 LINE DECODER/DEMUX   2-4译码器
74LS157 QUAD 2-INPUT MUX    四个双端多路器
74LS158 2-1 LINE MUX       2-1线多路器
74LS160A BINARY COUNTER     二进制计数器
74LS161A BINARY COUNTER     二进制计数器
74LS162A BINARY COUNTER     二进制计数器
74LS163A DECADE COUNTERS     十进制计数器
74LS164 SERIAL-PARALLEL SHIFT REG  串入并出
74LS168 BI-DIRECT BCD TO DECADE  双向计数器
74LS169 4BIT UP/DN BIN COUNTER 四位加减计数器
74LS173 TRI-STATE D FLIP-FLOP   三态D触发器
74LS174 HEX D FLIP-FLOP W/CLEAR   六D触发器
74LS175 HEX D FLIP-FLOP W/CLEAR   六D触发器
74LS190 BINARY UP/DN COUNTER 二进制加减计数器
74LS191 DECADE UP/DN COUNTER 十进制加减计数器
74LS192 DECADE UP/DN COUNTER 十进制加减计数器
74LS193 BINARY UP/DN COUNTER 二进制加减计数器
74LS194A 4BIT BI-DIR SHIFT 4位双向移位寄存器
74LS195A 4BIT PARALLEL SHIFT4位并行移位寄存器
74LS20 QUAD 4-INPUT NAND GATE 四个四入与非门
74LS21 4-INPUT AND GATE     四输入端与门
74LS240 OCTAL 3-STATE BUFFER  八个三态缓冲门
74LS244 OCTAL 3-STATE BUFFER  八个三态缓冲门
74LS245 OCTAL 3-STATE TRANSCEIVER 三态收发器
74LS253 DUAL 4-CH 3-STATE MUX  4路3态多路器
74LS256 4BIT ADDRESS LATCH  四位可锁存锁存器
74LS257 QUAD 2-CH 3-STATE MUX  4路3态多路器
74LS258 2-CH 3-STATE MUX     2路3态多路器
74LS27 TRIPLE 3-INPUT NOR GATES 三输入或非门
74LS279 QUAD R-S LATCHES    四个RS非锁存器
74LS28 QUAD 2-INPUT NOR BUFFER 四双端或非缓冲
74LS283 4BIT BINARY ADDER CARRY  四加法器
74LS30 8-INPUT NAND GATES   八输入端与非门
74LS32 QUAD 2-INPUT OR GATES    二输入或门
74LS352 4-1 LINE SELECTOR/MUX 4-1线选择多路器
74LS365 HEX 3-STATE BUFFER   六个三态缓冲门
74LS367 3-STATE BUFFER INVERTER  缓冲反向器
74LS368A 3-STATE BUFFER INVERTER  缓冲反向器
74LS373 OCT LATCH W/3-STATE OUT三态输出锁存器
74LS76 Dual JK Flip-Flop w/set  2个JK触发器
74LS379 QUAD PARALLEL REG   四个并行寄存器
74LS38 2-INPUT NAND GATE BUFFER 与非门缓冲器
74LS390 DUAL DECADE COUNTER  2个10进制计数器
74LS393 DUAL BINARY COUNTER  2个2进制计数器
74LS42 BCD TO DECIMAL    BCD转十进制译码器
74LS48 BCD-7 SEG        BCD-7段译码器
74LS49 BCD-7 SEG        BCD-7段译码器
74LS51 AND OR GATE INVERTER     与或非门
74LS540 OCT Buffer/Line Driver 8路缓冲驱动器
74LS541 OCT Buffer/LineDriver  8路缓冲驱动器
74LS74 D-TYPE FLIP-FLOP       D型触发器
74LS682 8BIT MAGNITUDE COMPARATOR  8路比较器
74LS684 8BIT MAGNITUDE COMPARATOR  8路比较器
74LS75 QUAD LATCHES         双锁存器
74LS83A 4BIT BINARY ADDER CARRY  四位加法器
74LS85 4BIT MAGNITUDE COMPARAT  4位判决电路
74LS86 2INPUT EXCLUSIVE OR GATE  2输入异或门
74LS90 DECADE/BINARY COUNTER 十/二进制计数器
74LS95B 4BIT RIGHT/LEFT SHIFT 4位左右移位寄存
74LS688 8BIT MAGNITUDE COMPARAT  8位判决电路
74LS136 2-INPUT XOR GATE     2输入异或门
74LS651 BUS TRANSCEIVERS      总线收发器
74LS653 BUS TRANSCEIVERS      总线收发器
74LS670 3-STATE 4-BY-4 REG    3态4-4寄存器
74LS73A DUAL J-K FLIP-FLOP W/CLEAR 双JK触发器

- 作者: badcup 2006年03月10日, 星期五 10:04  回复(0) |  引用(0) 加入博采

CListCtrl应用
 

void CSimpleServerView::OnInitialUpdate()
{
 CView::OnInitialUpdate();

 // TODO: 在此添加专用代码和/或调用基类

 CRect rect;
 GetClientRect(rect);
 m_pCListCtrl=new CListCtrl;
 m_pCListCtrl->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,rect,this,1);

 LV_COLUMN column;
 column.pszText="ClientID";
 column.mask=LVCF_TEXT;
 m_pCListCtrl->InsertColumn(0,&column);
 m_pCListCtrl->SetColumnWidth(0,100);

 column.pszText="ClientIP";
 column.mask=LVCF_TEXT;
 m_pCListCtrl->InsertColumn(1,&column);
 m_pCListCtrl->SetColumnWidth(1,100);


 column.pszText="ClientPort";
 column.mask=LVCF_TEXT;
 m_pCListCtrl->InsertColumn(2,&column);
 m_pCListCtrl->SetColumnWidth(2,100);

 column.pszText="Online";
 column.mask=LVCF_TEXT;
 m_pCListCtrl->InsertColumn(3,&column);
 m_pCListCtrl->SetColumnWidth(3,80);

}

增加一项

  if (m_pCListCtrl)
  {
      char temp[9];
      strncpy(temp,(char *)pClientInfo->ClientID,8);
      temp[8]=0x0;
      CString str=temp;
      m_pCListCtrl->InsertItem(m_pCListCtrl->GetItemCount(),str);
   
      str.Format("0x%x",pClientInfo->ClientIP);
      m_pCListCtrl->SetItemText(m_pCListCtrl->GetItemCount()-1,1,str);

      str.Format("%d",pClientInfo->ClientPort);
      m_pCListCtrl->SetItemText(m_pCListCtrl->GetItemCount()-1,2,str);

      if (pClientInfo->Online==TRUE)
      {
         m_pCListCtrl->SetItemText(m_pCListCtrl->GetItemCount()-1,3,"TRUE");
      }
      else
      {
         m_pCListCtrl->SetItemText(m_pCListCtrl->GetItemCount()-1,3,"FALSE");
      }
  }

- 作者: badcup 2005年12月27日, 星期二 12:00  回复(0) |  引用(0) 加入博采