xueyoo

FPGA经验之谈汇总

FPGA设计要点之一:时钟树

对于FPGA来说,要尽可能避免异步设计,尽可能采用同步设计。
            同步设计的第一个关键,也是关键中的关键,就是时钟树。
            一个糟糕的时钟树,对FPGA设计来说,是一场无法弥补的灾难,是一个没有打好地基的大楼,崩溃是必然的。
            具体一些的设计细则:
            1)尽可能采用单一时钟;
            2)如果有多个时钟域,一定要仔细划分,千万小心;
            3)跨时钟域的信号一定要做同步处理。对于控制信号,可以采用双采样;对于数据信号,可以采用异步fifo。需要注意的是,异步fifo不是万能的,一个异步fifo也只能解决一定范围内的频差问题。
            4)尽可能将FPGA内部的PLL、DLL利用起来,这会给你的设计带来大量的好处。
            5)对于特殊的IO接口,需要仔细计算Tsu、Tco、Th,并利用PLL、DLL、DDIO、管脚可设置的delay等多种工具来实现。简单对管脚进行Tsu、Tco、Th的约束往往是不行的。

 

FPGA设计要点之二:FSM

关于上期的时钟树,可能说的不是很确切。这里的时钟树实际上泛指时钟方案,主要是时钟域和PLL等的规划,一般情况下不牵扯到走线时延的详细计算(一般都走全局时钟网络和局部时钟网络,时延固定),和ASIC中的时钟树不一样。对于ASIC,就必须对时钟网络的设计、布线、时延计算进行仔细的分析计算才行。
            FSM:有限状态机。这个可以说时逻辑设计的基础。几乎稍微大一点的逻辑设计,几乎都能看得到FSM。
            FSM分为moore型和merly型,moore型的状态迁移和变量无关,merly型则有关。实际使用中大部分都采用merly型。
            FSM通常有2种写法:单进程、双进程。
            初学者往往喜欢单进程写法,格式如下:
            always  @( posedge clk or posedge rst )
                begin
                     if  ( rst == 1\'b1 )
                         FSM_status <= ......;
                     else
                           case  ( FSM_status )
                                ......;
                           endcase
                 end
            简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。
            优点:
            1)看起来比较简单明了,写起来也不用在每个case分支或者if分支中写全对各个信号和状态信号的处理。也可以简单在其中加入一些计数器进行计数处理。
            2)所有的输出信号都已经是经过D触发器锁存了。
            缺点:
            1)优化效果不佳。由于同步、异步放在一起,编译器一般对异步逻辑的优化效果最好。单进程FSM把同步、异步混杂在一起的结果就是导致编译器优化效果差,往往导致逻辑速度慢、资源消耗多。
            2)某些时候需要更快的信号输出,不必经过D触发器锁存,这时单进程FSM的处理就比较麻烦了。
            双进程FSM,格式如下:
            always  @( posedge clk or posedge rst )
                begin
                    if ( rst == 1\'b1 )
                        FSM_status_current <= ...;
                    else
                        FSM_status_current <= FSM_status_next;
            always  @(*)
                begin
                    case  ( FSM_status_current )
                        FSM_status_next = ......;
                    endcase
                end
            从上面可以看到,同步处理和异步处理分别放到2个always中。其中FSM状态变量也采用2个来进行控制。双进程FSM的原理我这里就不多说了,在很多逻辑设计书中都有介绍。这里描述起来太费劲。
            优点:
            1)编译器优化效果明显,可以得到很理想的速度和资源占用率。
            2)所有的输出信号(除了FSM_status_current)都是组合输出的,比单进程FSM快。
            缺点:
            1)所有的输出信号(除了FSM_status_current)都是组合输出的,在某些场合需要额外写代码来进行锁存。
            2)在异步处理的always中,所有的if、case分支必须把所有的输出信号都赋值,而且不能出现在FSM中的输出信号回送赋值给本FSM中的其他信号的情况,否则会出现
            latch。
            latch会导致如下问题:
            1)功能仿真结果和后仿不符;
            2)出现无法测试的逻辑;
            3)逻辑工作不稳定,特别是latch部分对毛刺异常敏感;
            4)某些及其特殊的情况下,如果出现正反馈,可能会导致灾难性的后果。
            这不是恐吓也不是开玩笑,我就亲眼见过一个小伙把他做的逻辑加载上去后,整个FPGA给炸飞了。后来怀疑可能是出现正反馈导致高频振荡,最后导致芯片过热炸掉(这个FPGA芯片没有安装散热片)。

 

FPGA设计之三:LATCH

首先回答一下:
            1)stateCAD没有用过,不过我感觉用这个东东在构建大的系统的时候似乎不是很方便。也许用system C或者system
            Verilog更好一些。
            2)同步、异步的叫法是我所在公司的习惯叫法,不太对,不过已经习惯了,呵呵。
            这次讲一下latch。
            latch的危害已经说过了,这里不再多说,关键讲一下如何避免。
            1)在组合逻辑进程中,if语句一定要有else!并且所有的信号都要在if的所有分支中被赋值。
            always  @( * )    begin
                 if ( sig_a == 1\'b1 )    sig_b = sig_c;
            end
            这个是绝对会产生latch的。
            正确的应该是
            always  @( * )  begin
                if ( sig_a == 1\'b1 )  sig_b = sig_c;
                else  sig_b = sig_d;
            end
            另外需要注意,下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。
            always  @( * )  begin
               if ( rst == 1\'b1 )      counter =  32\'h00000000;
               else  counter = counter + 1;
            end
            但如果是时序逻辑进程,则不存在该问题。
            2)case语句的default一定不能少!
            原因和if语句相同,这里不再多说了。
            需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。
            3)组合逻辑进程敏感变量不能少也不能多。
            这个问题倒不是太大,verilog2001语法中可以直接用 * 搞定了。
            
            顺便提一句,latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。不过在我们平时的设计中,对latch还是要尽可能的敬而远之。
            到年底了,工作越来越紧了,可能后续的日志写作时间会不规律且长度不定,请大家谅解啊!
            另外,有空请各位多推荐推荐,拜谢!

 

TONY的工作经验

在公司里的几个月,做的项目其实不多,但是收获还是有一些,我觉得收获最大的是
设计理念的改变,这也是我这段时间最想总结的,我会在后面逐渐阐述。
   版权所有,未经作者允许,禁止用于商业性质的转载;如对此文有疑问或想给作者提
建议请给作者发email:wangdian@tom.com  

时序是设计出来的
    我的boss有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑
的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。在工作这几个月中
,给我感触最深的是华为的那句话:时序是设计出来的,不是仿出来的,更不是湊出来
的。
    在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工
作。以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细
设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作
所占的时间要远大于编码的时间。
    总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求
把接口信号的时序波形描述出来)以及将来如何测试设计。在这一级方案中,要保证在
今后的设计中时序要收敛到一级模块(最后是在二级模块中)。什么意思呢?我们在做
详细设计的时候,对于一些信号的时序肯定会做一些调整的,但是这种时序的调整最多
只能波及到本一级模块,而不能影响到整个设计。记得以前在学校做设计的时候,由于
不懂得设计时序,经常因为有一处信号的时序不满足,结果不得不将其它模块信号的时
序也改一下,搞得人很郁闷。
    在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来了
,各级模块内部是怎么实现的也基本上确定下来了。
    由于做到这一点,在编码的时候自然就很快了,最重要的是这样做后可以让设计会
一直处于可控的状态,不会因为某一处的错误引起整个设计从头进行。

2规范很重要
    工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件
还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的
话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,
更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如
果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用
性。
    在逻辑方面,我觉得比较重要的规范有这些:
    1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过
后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对
要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。
    2.代码规范。
    a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我
们可以这么写:
          parameter  CLK_PERIOD = 30;
          parameter  RST_MUL_TIME = 5;
          parameter  RST_TIME = RST_MUL_TIME * CLK_PERIOD;
          ...
          rst_n = 1\'b0;
          # RST_TIME rst_n = 1\'b1;
          ...
          # CLK_PERIOD/2 clk <= ~clk;
     如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重
新例化就行了,从而使得代码更加易于重用。
    b.信号命名要规范化。
    1) 信号名一律小写,参数用大写。
    2) 对于低电平有效的信号结尾要用_n标记,如rst_n。
    3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪
个模块去的关系排列,这样在后期仿真验证找错时后  方便很多。如:
       module a(
                //input
                clk,
                rst_n,   //globle signal
                wren,
                rden,
                avalon_din,  //related to avalon bus
                sdi,         //related to serial port input
                //output
                data_ready,
                avalon_dout, //related to avalon bus
                ...
               );
       4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个en
tity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔
离。这样做可以让综合器综合出更优的结果。
       5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止
出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。
       6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的
,比如配置寄存器就是这种类型。
       7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。
       8) 所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也
是极有好处的。
       9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要
用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。
           clk_gate_en      --------                    ----
               ----------------- |D     Q |------------------|     \    gate_clk_out
                                |          |       ---------|      )---------
                        ------o |>       |        |        |     /
                 clk    |        --------          |        ----
                 ------------------------------------
       10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式
,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的
复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_
1xclk的速率发送数据。
         不要这样做:
         always (posedge rs232_1xclk or negedge rst_n)
         begin
             ...
         end
         而要这样做:
         always (posedge clk_25m or negedge rst_n)
         begin
             ...
             else if ( rs232_1xclk == 1\'b1 )
             ...
         end
       11)状态机要写成3段式的(这是最标准的写法),即
          ...
          always @(posedge clk or negedge rst_n)
          ...
              current_state <= next_state;
          ...
          always @ (current_state ...)
          ...
          case(current_state)
                ...
                s1:
                   if ...
                     next_state = s2;
                ...
          ...
          always @(posedge clk or negedge rst_n)
          ...
              else
                 a <= 1\'b0;
                 c <= 1\'b0;
                 c <= 1\'b0;            //赋默认值
                  case(current_state)
                      s1:
                          a <= 1\'b0;   //由于上面赋了默认值,这里就不用再对b、c赋值了
                      s2:
                          b <= 1\'b1;
                      s3:
                          c <= 1\'b1;
                      default:
                      ...
         ...
       3.ALTERA参考设计准则
        1) Ensure Clock, Preset, and Clear configurations are free of glitch
es.
        2) Never use Clocks consisting of more than one level of combinatori
al logic.
        3) Carefully calculate setup times and hold times for multi-Clock sy
stems.
        4) Synchronize signals between flipflops in multi-Clock systems when
the setup and hold time requirements cannot be met.
        5) Ensure that Preset and Clear signals do not contain race conditio
ns.
        6) Ensure that no other internal race conditions exist.
        7) Register all glitch-sensitive outputs.
        8) Synchronize all asynchronous inputs.
        9) Never rely on delay chains for pin-to-pin or internal delays.
        10)Do not rely on Power-On Reset. Use a master Reset pin to clear al
l flipflops.
        11)Remove any stuck states from state machines or synchronous logic.
     其它方面的规范一时没有想到,想到了再写,也欢迎大家补充。

3/如何提高电路工作频率
    对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明
,工作频率指FPGA片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的
方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提
高电路的工作频率。
    我们先来分析下是什么影响了电路的工作频率。
    我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clock skew有关
。在FPGA内部如果时钟走长线的话,clock skew很小,基本上可以忽略, 在这里为了简
单起见,我们只考虑信号的传播时延的因素。
    信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划
分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率
,我们就要在这三个时延中做文章,使其尽可能的小。
    我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,
所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。
    1.通过改变走线的方式减少时延。
    以altera的器件为例,我们在quartus里面的timing closure floorplan可以看到有
很多条条块块,我们可以将条条块块按行和按列分,每一个条块代表1个LAB,每个LAB里
有8个或者是10个LE。它们的走线时延的关系如下:同一个LAB中(最快) < 同列或者同
行 < 不同行且不同列。
    我们通过给综合器加适当的约束(不可贪心,一般以加5%裕量较为合适,比如电路
工作在100Mhz,则加约束加到105Mhz就可以了,贪心效果反而不好,且极大增加综合时
间)可以将相关的逻辑在布线时尽量布的靠近一点,从而减少走线的时延。(注:约束
的实现不完全是通过改进布局布线方式去提高工作频率,还有其它的改进措施)
    2.通过减少组合逻辑的减少时延。
    上面我们讲了可以通过加约束来提高工作频率,但是我们在做设计之初可万万不可
将提高工作频率的美好愿望寄托在加约束上,我们要通过合理的设计去避免出现大的组
合逻辑,从而提高电路的工作频率,这才能增强设计的可移植性,才可以使得我们的设
计在移植到另一同等速度级别的芯片时还能使用。
    我们知道,目前大部分FPGA都基于4输入LUT的,如果一个输出对应的判断条件大于
四输入的话就要由多个LUT级联才能完成,这样就引入一级组合逻辑时延,我们要减少组
合逻辑,无非就是要输入条件尽可能的少,,这样就可以级联的LUT更少,从而减少了组
合逻辑引起的时延。
    我们平时听说的流水就是一种通过切割大的组合逻辑(在其中插入一级或多级D触发
器,从而使寄存器与寄存器之间的组合逻辑减少)来提高工作频率的方法。比如一个32
位的计数器,该计数器的进位链很长,必然会降低工作频率,我们可以将其分割成4位和
8位的计数,每当4位的计数器计到15后触发一次8位的计数器,这样就实现了计数器的切
割,也提高了工作频率。
    在状态机中,一般也要将大的计数器移到状态机外,因为计数器这东西一般是经常
是大于4输入的,如果再和其它条件一起做为状态的跳变判据的话,必然会增加LUT的级
联,从而增大组合逻辑。以一个6输入的计数器为例,我们原希望当计数器计到111100后
状态跳变,现在我们将计数器放到状态机外,当计数器计到111011后产生个enable信号
去触发状态跳变,这样就将组合逻辑减少了。
    上面说的都是可以通过流水的方式切割组合逻辑的情况,但是有些情况下我们是很
难去切割组合逻辑的,在这些情况下我们又该怎么做呢?
    状态机就是这么一个例子,我们不能通过往状态译码组合逻辑中加入流水。如果我
们的设计中有一个几十个状态的状态机,它的状态译码逻辑将非常之巨大,毫无疑问,
这极有可能是设计中的关键路径。那我们该怎么做呢?还是老思路,减少组合逻辑。我
们可以对状态的输出进行分析,对它们进行重新分类,并根据这个重新定义成一组组小
状态机,通过对输入进行选择(case语句)并去触发相应的小状态机,从而实现了将大的
状态机切割成小的状态机。在ATA6的规范中(硬盘的标准),输入的命令大概有20十种
,每一个命令又对应很多种状态,如果用一个大的状态机(状态套状态)去做那是不可
想象的,我们可以通过case语句去对命令进行译码,并触发相应的状态机,这样做下来
这一个模块的频率就可以跑得比较高了。
    总结:提高工作频率的本质就是要减少寄存器到寄存器的时延,最有效的方法就是
避免出现大的组合逻辑,也就是要尽量去满足四输入的条件,减少LUT级联的数量。我们
可以通过加约束、流水、切割状态的方法提高工作频率。

4/ 做逻辑的难点在于系统结构设计和仿真验证
    刚去公司的时候BOSS就和我讲,做逻辑的难点不在于RTL级代码的设计,而在于系统
结构设计和仿真验证方面。目前国内对可综合的设计强调的比较多,而对系统结构设计
和仿真验证方面似乎还没有什么资料,这或许也从一个侧面反映了国内目前的设计水平
还比较低下吧。
    以前在学校的时候,总是觉得将RTL级代码做好就行了,仿真验证只是形式而已,所
以对HDL的行为描述方面的语法不屑一顾,对testbench也一直不愿意去学--因为觉得画
波形图方便;对于系统结构设计更是一点都不懂了。
    到了公司接触了些东西才发现完全不是这样。
    其实在国外,花在仿真验证上的时间和人力大概是花在RTL级代码上的两倍,现在仿
真验证才是百万门级芯片设计的关键路径。仿真验证的难点主要在于怎么建模才能完全
和准确地去验证设计的正确性(主要是提高代码覆盖),在这过程中,验证速度也是很
重要的。
    验证说白了也就是怎么产生足够覆盖率的激励源,然后怎么去检测错误。我个人认
为,在仿真验证中,最基本就是要做到验证的自动化。这也是为什么我们要写testbenc
h的原因。在我现在的一个设计中,每次跑仿真都要一个小时左右(这其实算小设计)。
由于画波形图无法做到验证自动化,如果用通过画波形图来仿真的话,一是画波形会画
死(特别是对于算法复杂的、输入呈统计分布的设计),二是看波形图要看死,三是检
错率几乎为零。
    那么怎么做到自动化呢?我个人的水平还很有限,只能简单地谈下BFM(bus funct
ion model,总线功能模型)。
    以做一个MAC的core为例(背板是PCI总线),那么我们需要一个MAC_BFM和PCI_BFM
及PCI_BM(PCI behavior model)。MAC_BFM的主要功能是产生以太网帧(激励源),随
机的长度和帧头,内容也是随机的,在发送的同时也将其复制一份到PCI_BM中;PCI_BFM
的功能则是仿PCI总线的行为,比如被测收到了一个正确帧后会向PCI总线发送一个
请求,PCI_BFM则会去响应它,并将数据收进来;PCI_BM的主要功能是将MAC_BFM发送出
来的东西与PCI_BFM接收到的东西做比较,由于它具有了MAC_BFM的发送信息和PCI_BFM的
接收信息,只要设计合理,它总是可以自动地、完全地去测试被测是否工作正常,
从而实现自动检测。
    华为在仿真验证方面估计在国内来说是做的比较好的,他们已建立起了比较好的验
证平台,大部分与通信有关的BFM都做好了,听我朋友说,现在他们只需要将被测放
在测试平台中,并配置好参数,就可以自动地检测被测功能的正确与否。
    在功能仿真做完后,由于我们做在是FPGA的设计,在设计时已经基本保证RTL级代码
在综合结果和功能仿真结果的一致性,只要综合布局布线后的静态时序报告没有违反时
序约束的警告,就可以下到板子上去调试了。事实上,在华为中兴,他们做FPGA的设计
时也是不做时序仿真的,因为做时序仿真很花时间,且效果也不见得比看静态时序分析
报告好。
    当然了,如果是ASIC的设计话,它们的仿真验证的工作量要大一些,在涉及到多时
钟域的设计时,一般还是做后仿的。不过在做后仿之前,也一般会先用形式验证工具和
通过静态时序分序报告去查看有没有违反设计要求的地方,这样做了之后,后仿的工作
量可以小很多。
    在HDL语言方面,国内语言很多人都在争论VHDLverilog哪个好,其实我个人认为
这并没有多大的意义,外面的大公司基本上都是用verilog在做RTL级的代码,所以还是
建议大家尽量学verilog。在仿真方面,由于VHDL在行为级建模方面弱于verilog,用VH
DL做仿真模型的很少,当然也不是说verilog就好,其实verilog在复杂的行为级建模方
面的能力也是有限的,比如目前它还不支持数组。在一些复杂的算法设计中,需要高级
语言做抽象才能描述出行为级模型。在国外,仿真建模很多都是用System C和E语言,用
verilog的都算是很落后的了,国内华为的验证平台好像是用System C写。
    在系统结构设计方面,由于我做的设计还不够大,还谈不上什么经验,只是觉得必
须要具备一些计算机系统结构的知识才行。划分的首要依据是功能,之后是选择合适的
总线结构、存储结构和处理器架构,通过系统结构划分要使各部分功能模块清晰,易于
实现。这一部分我想过段时间有一点体会了再和大家分享,就先不误导大家了。

 

上拉电阻的作用

上拉电阻:
1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
2、OC门电路必须加上拉电阻,才能使用。
3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。
6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

上拉电阻阻值的选择原则包括:
1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑
以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理


对上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:
1. 驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。
2. 下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。
3. 高低电平的设定。不同电路的高低电平的门槛电平会有不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时,开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。
4. 频率特性。以上拉电阻为例,上拉电阻和开关管漏源级之间的电容和下级电路之间的输入电容会形成RC延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在这方面的需求。

下拉电阻的设定的原则和上拉电阻是一样的。
OC门输出高电平时是一个高阻态,其上拉电流要由上拉电阻来提供,设输入端每端口不大于100uA,设输出口驱动电流约500uA,标准工作电压是5V,输入口的高低电平门限为0.8V(低于此值为低电平);2V(高电平门限值)。
选上拉电阻时:
500uA x 8.4K= 4.2即选大于8.4K时输出端能下拉至0.8V以下,此为最小阻值,再小就拉不下来了。如果输出口驱动电流较大,则阻值可减小,保证下拉时能低于0.8V即可。
当输出高电平时,忽略管子的漏电流,两输入口需200uA
200uA x15K="3V"即上拉电阻压降为3V,输出口可达到2V,此阻值为最大阻值,再大就拉不到2V了。选10K可用。COMS门的可参考74HC系列
设计时管子的漏电流不可忽略,IO口实际电流在不同电平下也是不同的,上述仅仅是原理,一句话概括为:输出高电平时要喂饱后面的输入口,输出低电平不要把输出口喂撑了(否则多余的电流喂给了级联的输入口,高于低电平门限值就不可靠了)

在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。
1. 电阻作用:
l 接电组就是为了防止输入端悬空
l 减弱外部电流对芯片产生的干扰
l 保护cmos内的保护二极管,一般电流不大于10mA
l 上拉和下拉、限流
l 1. 改变电平的电位,常用在TTL-CMOS匹配
2. 在引脚悬空时有确定的状态
3.增加高电平输出时的驱动能力。
4、为OC门提供电流
l 那要看输出口驱动的是什么器件,如果该器件需要高电压的话,而输出口的输出电压又不够,就需要加上拉电阻。
l 如果有上拉电阻那它的端口在默认值为高电平你要控制它必须用低电平才能控制如三态门电路三极管的集电极,或二极管正极去控制把上拉电阻的电流拉下来成为低电平。反之,
l 尤其用在接口电路中,为了得到确定的电平,一般采用这种方法,以保证正确的电路状态,以免发生意外,比如,在电机控制中,逆变桥上下桥臂不能直通,如果它们都用同一个单片机来驱动,必须设置初始状态.防止直通!

2、定义:
l 上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!
l 上拉是对器件注入电流,下拉是输出电流
l 弱强只是上拉电阻的阻值不同,没有什么严格区分
l 对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

3、为什么要使用拉电阻:
l 一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
l 数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定!
l 一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口的输出类似与一个三极管的C,当C接通过一个电阻和电源连接在一起的时候,该电阻成为上C拉电阻,也就是说,如果该端口正常时为高电平,C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该端口平时为低电平,作用吗:
比如:当一个接有上拉电阻的端口设为输如状态时,他的常态就为高电平,用于检测低电平的输入。
l 上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是你同学说的灌电流

---------------------------------------------------------------------------------
有可商讨的地方。
1 、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。
电阻串联才是实现阻抗匹配的好方法。通常线阻的数量级都在几十ohm,如果加上下拉的话,功耗太大。

电阻串联和拉电阻都是阻抗匹配的方法,只是使用范围不同,依电路工作频率而定

21、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
不建议采用这种方法。缺点有2。1 TTL输出地电平时,功耗大。2TTL 输出高电平时,上拉电源可能会有电流灌到TTL电路的电源,影响系统稳定性。
3 3、对于高速电路,过大的上拉电阻可能边沿变平缓。
应该不会。做输入时,上拉电阻又不吸收电流。做输出时,驱动电流为 电路输出电流+上拉通道输出电流。 电阻的容性特征很小,可忽略。
4 2. 下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。
当输出高电平时,开关管怎么回关断呢? CMOS电路的输出级基本上是推拉时。输出地电平时,下面的MOSFET关断,上面的导通。高电平时反过来。该条只适合OC电路。

 

 

关于ASICCPLDFPGA介绍

ASIC(Application Specific Intergrated Circuits)即专用集成电路,是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。目前用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一,它们的共性是都具有用户现场可编程特性,都支持边界扫描技术,但两者在集成度、速度以及编程方式上具有各自的特点。ASIC的特点是面向特定用户的需求,品种多、批量少,要求设计和生产周期短,它作为集成电路技术与特定用户的整机或系统技术紧密结合的产物,与通用集成电路相比具有体积更小、重量更轻、功耗更低、可靠性提高、性能提高、保密性增强、成本降低等优点。

FPGA(现场可编程门阵列)是专用集成电路(ASIC)中集成度最高的一种,用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑,因而也被用于对CPU的模拟。用户对FPGA的编程数据放在Flash芯片中,通过上电加载到FPGA中,对其进行初始化。也可在线对其编程,实现系统在线重构,这一特性可以构建一个根据计算任务不同而实时定制的CPU,这是当今研究的热门领域。

FPGA与CPLD的区别
系统的比较,与大家共享:
尽管FPGA和CPLD都是可编程ASIC器件,有很多共同特点,但由于CPLD和FPGA结构上的差异,具有各自的特点:
①CPLD更适合完成各种算法和组合逻辑,FP GA更适合于完成时序逻辑。换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。
②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。

③在编程上FPGA比CPLD具有更大的灵活性。CPLD通过修改具有固定内连电路的逻辑功能来编程,FPGA主要通过改变内部连线的布线来编程;FP GA可在逻辑门下编程,而CPLD是在逻辑块下编程。

④FPGA的集成度比CPLD高,具有更复杂的布线结构和逻辑实现。

⑤CPLD比FPGA使用起来更方便。CPLD的编程采用E2PROM或FASTFLASH技术,无需外部存储器芯片,使用简单。而FPGA的编程信息需存放在外部存储器上,使用方法复杂。

⑥CPLD的速度比FPGA快,并且具有较大的时间可预测性。这是由于FPGA是门级编程,并且CLB之间采用分布式互联,而CPLD是逻辑块级编程,并且其逻辑块之间的互联是集总式的。

⑦在编程方式上,CPLD主要是基于E2PROM或FLASH存储器编程,编程次数可达1万次,优点是系统断电时编程信息也不丢失。CPLD又可分为在编程器上编程和在系统编程两类。FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中。其优点是可以编程任意次,可在工作中快速编程,从而实现板级和系统级的动态配置。

⑧CPLD保密性好,FPGA保密性差。

⑨一般情况下,CPLD的功耗要比FPGA大,且集成度越高越明显。

随著复杂可编程逻辑器件(CPLD)密度的提高,数字器件设计人员在进行大型设计时,既灵活又容易,而且产品可以很快进入市场。许多设计人员已经感受到CPLD容易使用、时序可预测和速度高等优点,然而,在过去由于受到CPLD密度的限制,他们只好转向FPGA和ASIC。现在,设计人员可以体会到密度高达数十万门的CPLD所带来的好处。
CPLD结构在一个逻辑路径上采用1至16个乘积项,因而大型复杂设计的运行速度可以预测。因此,原有设计的运行可以预测,也很可靠,而且修改设计也很容易。CPLD在本质上很灵活、时序简单、路由性能极好,用户可以改变他们的设计同时保持引脚输出不变。与FPGA相比,CPLD的I/O更多,尺寸更小。

如今,通信系统使用很多标准,必须根据客户的需要配置设备以支持不同的标准。CPLD可让设备做出相应的调整以支持多种协议,并随著标准和协议的演变而改变功能。这为系统设计人员带来很大的方便,因为在标准尚未完全成熟之前他们就可以著手进行硬件设计,然后再修改代码以满足最终标准的要求。CPLD的速度和延迟特性比纯软件方案更好,它的NRE费用低於ASIC,更灵活,产品也可以更快入市。CPLD可编程方案的优点如下:
●逻辑和存储器资源丰富(Cypress Delta39K200的RAM超过480 Kb)
●带冗余路由资源的灵活时序模型
●改变引脚输出很灵活
●可以装在系统上后重新编程
●I/O数目多
●具有可保证性能的集成存储器控制逻辑
●提供单片CPLD和可编程PHY方案
由于有这些优点,设计建模成本低,可在设计过程的任一阶段添加设计或改变引脚输出,可以很快上市

CPLD的结构
CPLD是属於粗粒结构的可编程逻辑器件。它具有丰富的逻辑资源(即逻辑门与寄存器的比例高)和高度灵活的路由资源。CPLD的路由是连接在一起的,而FPGA的路由是分割开的。FPGA可能更灵活,但包括很多跳线,因此速度较CPLD慢。
CPLD以群阵列(array of clusters)的形式排列,由水平和垂直路由通道连接起来。这些路由通道把信号送到器件的引脚上或者传进来,并且把CPLD内部的逻辑群连接起来。


CPLD之所以称作粗粒,是因为,与路由数量相比,逻辑群要大得到。CPLD的逻辑群比FPGA的基本单元大得多,因此FPGA是细粒的。


CPLD的功能块
CPLD最基本的单元是宏单元。一个宏单元包含一个寄存器(使用多达16个乘积项作为其输入)及其它有用特性。
因为每个宏单元用了16个乘积项,因此设计人员可部署大量的组合逻辑而不用增加额外的路径。这就是为何CPLD被认为是“逻辑丰富”型的。

宏单元以逻辑模块的形式排列(LB),每个逻辑模块由16个宏单元组成。宏单元执行一个AND操作,然后一个OR操作以实现组合逻辑。

每个逻辑群有8个逻辑模块,所有逻辑群都连接到同一个可编程互联矩阵。
每个群还包含两个单端口逻辑群存储器模块和一个多端口通道存储器模块。前者每模块有8,192b存储器,后者包含4,096b专用通信存储器且可配置为单端口、多端口或带专用控制逻辑的FIFO。

CPLD有什麽好处?
I/O数量多
CPLD的好处之一是在给定的器件密度上可提供更多的I/O数,有时甚至高达70%。
时序模型简单
CPLD优于其它可编程结构之处在于它具有简单且可预测的时序模型。这种简单的时序模型主要应归功于CPLD的粗粒度特性。
CPLD可在给定的时间内提供较宽的相等状态,而与路由无关。这一能力是设计成功的关键,不但可加速初始设计工作,而且可加快设计调试过程。


粗粒CPLD结构的优点
CPLD是粗粒结构,这意味著进出器件的路径经过较少的开关,相应地延迟也小。因此,与等效的FPGA相比,CPLD可工作在更高的频率,具有更好的性能。
CPLD的另一个好处是其软件编译快,因为其易于路由的结构使得布放设计任务更加容易执行。

细粒FPGA结构的优点
FPGA是细粒结构,这意味著每个单元间存在细粒延迟。如果将少量的逻辑紧密排列在一起,FPGA的速度相当快。然而,随著设计密度的增加,信号不得不通过许多开关,路由延迟也快速增加,从而削弱了整体性能。CPLD的粗粒结构却能很好地适应这一设计布局的改变。


灵活的输出引脚
CPLD的粗粒结构和时序特性可预测,因此设计人员在设计流程的后期仍可以改变输出引脚,而时序仍保持不变。


为什么CPLD和FPGA需要不同的逻辑设计技巧?
FPGA是细粒器件,其基本单元和路由结构都比CPLD的小。FPGA是“寄存器丰富”型的(即其寄存器与逻辑门的比例高),而CPLD正好相反,它是“逻辑丰富”型的。

很多设计人员偏爱CPLD是因为它简单易用和高速的优点。CPLD更适合逻辑密集型应用,如状态机和地址解码器逻辑等。而FPGA则更适用于CPU和DSP等寄存器密集型设计。

新的CPLD封装
CPLD有多种密度和封装类型,包括单芯片自引导方案。自引导方案在单个封装内集成了FLASH存储器和CPLD,无须外部引导单元,从而可降低设计复杂性并节省板空间。在给定的封装尺寸内,有更高的器件密度共享引脚输出。这就为设计人员提供了“放大”设计的便利,而无须更改板上的引脚输出。

CPLD的功耗
与同样密度的FPGA相比,CPLD的待机功耗更低。

CPLD FPGA (待机电流(在Vcc 为1.8V时))
50K 300μA 200mA
100K 600μA 200mA
200K 1.25mA 300mA


CPLD特别适合那些要求低功耗和低温度的电池供电应用,像手持设备。


许多设计人员都熟悉传统的PLD,并喜欢这种结构所固有的灵活性和易用性。CPLD为ASIC和FPGA设计人员提供了一种很好的替代方案,可让他们以更简单、方便易用的结构实现其设计。CPLD现已达到数十万门的密度,并可提供当今通信设计所需的高性能。大于50万门的设计仍需ASIC和FPGA,但对于小型设计,CPLD不失为一个高性价比的替代方案。

FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。 ——2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
3)FPGA内部有丰富的触发器和I/O

 

 

接地技术讨论

前段时间和liugx探讨了一下关于模拟地和数字地的处理(参见帖子http://www.ednchina.com/bbs/DetailTopic_new.asp?topicid=3016&ForumID=10),然后觉得应该把自己对接地技术的体会写出来,放到论坛上来个抛砖引玉,呵呵。采用Q&A的方式,这样也方便汇总和加入后续的问题,讨论和解答。(EDN China技术论坛http://www.ednchina.com/bbs/def.asp

Q1:为什么要接地?
Answer:接地技术的引入最初是为了防止电力或电子等设备遭雷击而采取的保护性措施,目的是把雷电产生的雷击电流通过避雷针引入到大地,从而起到保护建筑物的作用。同时,接地也是保护人身安全的一种有效手段,当某种原因引起的相线(如电线绝缘不良,线路老化等)和设备外壳碰触时,设备的外壳就会有危险电压产生,由此生成的故障电流就会流经PE线到大地,从而起到保护作用。随着电子通信和其它数字领域的发展,在接地系统中只考虑防雷和安全已远远不能满足要求了。比如在通信系统中,大量设备之间信号的互连要求各设备都要有一个基准‘地’作为信号的参考地。而且随着电子设备的复杂化,信号频率越来越高,因此,在接地设计中,信号之间的互扰等电磁兼容问题必须给予特别关注,否则,接地不当就会严重影响系统运行的可靠性和稳定性。最近,高速信号的信号回流技术中也引入了“地”的概念。

Q2:接地的定义
Answer: 在现代接地概念中、对于线路工程师来说,该术语的含义通常是‘线路电压的参考点’;对于系统设计师来说,它常常是机柜或机架;对电气工程师来说,它是绿色安全地线或接到大地的意思。一个比较通用的定义是“接地是电流返回其源的低阻抗通道”。注意要求是”低阻抗”和“通
路”。

Q3:常见的接地符号
Answer: PE,PGND,FG-保护地或机壳;BGND或DC-RETURN-直流-48V(+24V)电源(电
池)回流;GND-工作地;DGND-数字地;AGND-模拟地;LGND-防雷保护地

Q4:合适的接地方式
Answer: 接地有多种方式,有单点接地,多点接地以及混合类型的接地。而单点接地又分为串联单点接地和并联单点接地。一般来说,单点接地用于简单电路,不同功能模块之间接地区分,以及低频(f<1MHz)电子线路。当设计高频(f>10MHz)电路时就要采用多点接地了或者多层板(完整的地平面层)。

Q5:信号回流和跨分割的介绍
Answer:对于一个电子信号来说,它需要寻找一条最低阻抗的电流回流到地的途径,所以如何处理这个信号回流就变得非常的关键。
第一,根据公式可以知道,辐射强度是和回路面积成正比的,就是说回流需要走的路径越长,形成的环越大,它对外辐射的干扰也越大,所以,PCB布板的时候要尽可能减小电源回路和信号回路面积。
第二,对于一个高速信号来说,提供有好的信号回流可以保证它的信号质量,这是因为PCB上传输线的特性阻抗一般是以地层(或电源层)为参考来计算的,如果高速线附近有连续的地平面,这样这条线的阻抗就能保持连续,如果有段线附近没有了地参考,这样阻抗就会发生变化,不连续的阻抗从而会影响到信号的完整性。所以,布线的时候要把高速线分配到靠近地平面的层,或者高速线旁边并行走一两条地线,起到屏蔽和就近提供回流的功能。
第三,为什么说布线的时候尽量不要跨电源分割,这也是因为信号跨越了不同电源层后,它的回流途径就会很长了,容易受到干扰。当然,不是严格要求不能跨越电源分割,对于低速的信号是可以的,因为产生的干扰相比信号可以不予关心。对于高速信号就要认真检查,尽量不要跨越,可以通过调整电源部分的走线。(这是针对多层板多个电源供应情况说的)

Q6:为什么要将模拟地和数字地分开,如何分开?
Answer:模拟信号和数字信号都要回流到地,因为数字信号变化速度快,从而在数字地上引起的噪声就会很大,而模拟信号是需要一个干净的地参考工作的。如果模拟地和数字地混在一起,噪声就会影响到模拟信号。
一般来说,模拟地和数字地要分开处理,然后通过细的走线连在一起,或者单点接在一起。总的思想是尽量阻隔数字地上的噪声窜到模拟地上。当然这也不是非常严格的要求模拟地和数字地必须分开,如果模拟部分附近的数字地还是很干净的话可以合在一起。

Q7:单板上的信号如何接地?
Answer:对于一般器件来说,就近接地是最好的,采用了拥有完整地平面的多层板设计后,对于一般信号的接地就非常容易了,基本原则是保证走线的连续性,减少过孔数量;靠近地平面或者电源平面,等等。

Q8:单板的接口器件如何接地?
Answer:有些单板会有对外的输入输出接口,比如串口连接器,网口RJ45连接器等等,如果对它们的接地设计得不好也会影响到正常工作,例如网口互连有误码,丢包等,并且会成为对外的电磁干扰源,把板内的噪声向外发送。一般来说会单独分割出一块独立的接口地,与信号地的连接采用细的走线连接,可以串上0欧姆或者小阻值的电阻。细的走线可以用来阻隔信号地上噪音过到接口地上来。同样的,对接口地和接口电源的滤波也要认真考虑。

Q9:带屏蔽层的电缆线的屏蔽层如何接地?
Answer:屏蔽电缆的屏蔽层都要接到单板的接口地上而不是信号地上,这是因为信号地上有各种的噪声,如果屏蔽层接到了信号地上,噪声电压会驱动共模电流沿屏蔽层向外干扰,所以设计不好的电缆线一般都是电磁干扰的最大噪声输出源。当然前提是接口地也要非常的干净。

Q10:PCB的信号地和机壳的系统地,最后要接到一起,然后接入大地?
Answer:PCB的信号地和机壳的系统地,最后要接到一起,然后通过电源线的地线接入大地

 

 

   年轻工程师怎样修炼成为高手“?

本人做过技术开发工作多年,从焊电路板的小工程师逐渐做到项目经理、研发经理,现在做到总工程师,作为工程师有亲身的感受,作为研发主管,对工程师的性格、心理和知识结构有非常深入的了解,现在把自己的一点感悟与大家分享,希望大家批评指正,欢迎补充完善。

   有强烈的好奇心。这是成为高手的必要条件,喜欢新生事物,对问题喜欢刨根问底,以钻研为乐趣。那种得过且过,敷衍了事,仅仅把工作当作饭碗的人连熟手都成不了,更何况高手。有好奇心的人,可以为解决一个问题通宵干,躺在床上也在寻思解决方案,这样的人就是高手的胚子!

   做事谨慎细致,考虑问题全面。技术工作来不得半点粗心马虎,否则问题多多,后患无穷。甚至给生产、产品品质造成重大影响,给公司造成重大经济损失。马虎的人不可能成为优秀的工程师,只可能当当助手,哪个上司敢把项目交给一个马大哈?改,难呐,本性难移!趁早找个理由炒他鱿鱼!

模拟、数字,高频、低频,软件、硬件,模具、结构,甚至文字功底也必不可少(撰写产品使用手册、工艺指导书等等也可看出一个人的专业水准)具备完善的知识体系。企业中的工程师不是研究学问,也没指望成为科学家,是为企业的产品服务的。因此,全面的知识架构对于迅速完成产品开发任务非常重要,复合型人才更为难得。既然是高手,当然十八般兵器样样精通,否则,难以独挑大梁,只能做配角。没有全面的知识,要上升到项目经理、研发经理层面是不可能的。企业中的工程师必须时刻关注成本、生产工艺、用户需求、测试环境、采购渠道、配套厂家工艺水平等等许多方面,一点不慎后续问题就冒出来了。你的设计再好,工艺性差,车间生产装配调试困难,导致生产成本急剧上升,或者配套厂家工艺水平达不到又有什么用?或者器件采购困难,经常影响按期交货也同样对企业不利。时刻提醒自己,产品是赚钱的工具,自己才能的张扬要服从这一大前提。这里要特别提醒那些学历高,某方面技术精深,但对企业运作、生产工艺、生产流程、物流管理、行销模式、市场调查、用户心理是“二把刀”的人,不要自恃一点DSP皮毛就以为可以天下无敌,谦虚地深入基层,熟悉一切,虚心学习其他方面的知识,才有大为!

   思路开阔,能从市场、用户和生产工艺角度考虑产品开发。唯技术至上的人,思路狭隘,即使聪明过人,只能扮演一个处理具体问题的小角色。企业的唯一目标是赚钱,能赚钱就是好产品,不能赚钱就等于零。这就能解释为什么很多研究所、大学开发的产品填补了多少多少空白,但在产业化过程中却总赚不到钱,最后落满灰尘。企业的工程师,务必坚持市场第一,用户至上的开发思路,你的工作仅仅是开发出低成本的、工艺性好的、品质稳定的,最关键是满足目标用户需求的产品,不能凭想象发挥,自以为是,要知道,用户永远是对的,你不能让他们服从你的思路,你每天窝在实验室,对市场又了解多少?,对消费心理又知道多少,别自以为聪明,道听途说几句话就轻易下结论!

   现实、灵活的开发思路是高手的重要特征。企业的产品开发是和市场紧密联系在一起的,不是国家拨款的基础理论研究。树立市场化的研发策略是高手必备的素质!不要指望你能搞出超英赶美的世界级产品,你现在的实验条件、项目管理水平、人员素质、资金投入、信息交流等等和人家相比差了十万八千里,你凭什么搞出世界级的东西?家电巨头投下数亿元开发手机,高手云集,十余年了,手机的核心技术还是人家的。你做过的电路、编写过的程序千万人做过,你只不过东拼西凑地组合出了一个东西而已,必须要清醒地、谦虚地认识到这一层面。因此,在开发过程中,不要一切都自己开发、研究,大胆地借鉴国外的东西,绝大多数产品人家早已经普及,不妨照搬其中的功能模块,再结合自己实际情况,去搞开发才是高明的做法。再者别人的产品经过现场用户的使用,许多隐患已经消除,水平再高的人做的新产品也会从用户哪里反馈回来一些缺陷,直接模仿别人的产品,即可消除许多缺陷点。同时,可以大大缩短研发周期,减少研发费用,抢先一步推向市场,绝对是上策。当然,受到专利保护的技术要注意,仔细看看相关法律,在法律允许范围内从事,体会一下总还是有办法的!

   这里要一再强调,我所指的是“企业里受欢迎的高手!”不是科学院里的专家,不是陈景润!这是截然不同的概念。企业里的高手,不仅仅要了解技术、工艺以及生产方面的知识,团队意识,管理才能,协调沟通能力,系统规划能力,甚至语言表达能力都是很重要的,这些是高手的综合素质的体现。

   特别对毕业2-4年的年轻工程师提个醒,要清楚认识自己,知道自己的斤两,不要以为做过2-3个项目就飘飘然,人家也是那样过来的!其实还差得远!等到了二十七、八岁,你会逐渐明白的。学海无涯,除过极个别特殊天才人物,大家都是普通人,互有长短,谦虚谨慎,心态平和是成就大事的基础,总那么浮躁,狂妄,藐视他人,将导致团队合作困难,同事关系紧张,项目的进展必然不顺利,从而延长成为高手的时间,单纯从技术来看,不过在某个狭小领域有小小心得而已,距离经验丰富、技能全面的高手还有八年抗战的历程。一般来讲,毕业5-6年,技术初步达到全面成熟(那些得过且过的人,二十年也成熟不了,现在几十岁来应聘的人也不少,水平还是马马乎乎),再逐渐吸收管理知识、市场知识等其他企业里所涉及的方面的技能,30岁左右基本圆满已经非常不简单了!时刻要有谦和的心态,是在团队中脱颖而出的必须条件。

 

 

亚稳态总结

1)亚稳态定义

亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去

亚稳态这个点并不是真正的稳定,因为随机的躁声会驱使工作与亚稳态点的电路转移到一个稳定的工作点去。

正如山顶的球一样,双稳态电路在不确定进入某一种状态之前,可能会在亚稳态停留一段不可预测的时间。

2)锁存器的亚稳态

(1)R_S锁存器,加在S输入端的脉冲会使锁存器的状态0变到1状态。

对S输入端有一个最小脉冲宽度的限制。若所加脉冲的宽度与这个宽度限制更宽的话,锁存器的状态立即变为一状态。若小于这个限制脉宽就可能进入亚稳态。一旦进入亚稳态之后,他的行为就取决与“山的形状”了。用高增益,快速工艺制作的锁存器和触发器会比用低性能工艺制造的更快地脱离亚稳态!

(2)如果R_S都为1,则输出都被强制为0。一旦取消某一输入,则两个输入有重回复到通常的互补状态。但是,两个输入同时消失,则锁存器将进入一个不可预测的状态,而事实上这个状态可能是震荡状态或者是亚稳态!如果加在S或R端的“1”脉冲太短,也可能引起亚稳定性!

(3)尽管D锁存器消除了R-S锁存器的S=R=1的问题(清零置1同时有效),但是亚稳态的问题依然存在。如果在建立保持时间窗内信号发生变化的话,锁存器的输出就是不可预测的,并且可能进入亚稳态。

 

(4)触发器的亚稳态

像D锁存器那样,边沿触发器D触发器也存在着一个建立和保持时间窗,在这段时间内D端的输入一定不能变化。在这一窗口时间也是在CLK信号的触发沿附近,若未能满足建立和保持时间的要求,触发器的输出通常会进入一个稳定状态。尽管这个状态不可预知,但他不是0就是1。但是,有时输出也可能会震荡或者进入亚稳态,或进入一个界于0和1之间的亚稳态,如果触发器进入亚稳态,则它只是在经过一个随机的延时后,才会自己回到一个稳定状态。

 

在触发器的建立时间和保持时间要求没有得到满足时,触发器就会进入一个界于状态1与状态0之间的第三种状态,即亚稳态状态。

最糟糕的是,理论上讲,门电路个触发器接受到这个亚稳态的输入信号之后,有些部件会把这个信号当成0,而另一些则把它当1,于是会产生不一样的输出,或者,还有一些门电路和触发器本身也可能产生亚稳态的输出信号(毕竟,这些器件现在都工作在其工作区的线性部分)。幸运的是,尽管触发器的输出保持亚稳态的可能性永远也不会为0,但这种可能性随着时间呈指数的下降趋势!

 

使触发器脱离亚稳态有两种方法:

1):利用满足最小脉宽宽度,建立时间等规定的输入信号,迫使触发器进入一个有效的逻辑状态。

2)等待足够长的时间,以便触发器自己脱离亚稳态状态。

亚稳定性分辨时间

如果满足了D触发器的建立和保持时间要求,那么在时钟沿到来后的Tpd时间(传播延迟)内触发器就会稳定在一个新的输出值上。如果没有满足D触发器的建立保持时间要求,触发器的输出就会进入亚稳态,并保持随机长的时间。在特定的系统设计中,我们用一个参数Tr(称为亚稳定分辨时间),来表示在不引起同步器故障的情况下,输出会停留在亚稳态的最大时间。

 

有效的亚稳态分辨时间:

Tr=Tclk(时钟周期)-Tcomb(组合逻辑的传播延迟)-Tsetup

Tpd时间(传播延迟):输入信号变化到产生输出信号变化所需的时间。

 

最可靠同步器设计

最可靠的同步器就是具有最大亚稳定性分辨时间的同步器。但是,在数字系统的设计中,我们不仅很少因为系统的可靠性而奢侈地降低时钟频率,而且为了让系统具有更好的性能还常常要求提高时钟频率。因此,通常需要能够在很短的时钟内可靠工作的同步器。

Tr=Tclk-Tcomb-Tsetup

 

速度越快的触发器建立时间就越短。Tcomb(组合逻辑的传播延迟)最小值为0;

 

用两级D触发器构成同步器,时钟异步信号输入DFF1,这个信号可能会违反触发器的建立时间和保持时间的规定。一旦发生这种情况。输出信号就会进入亚稳态,而且这个状态停留一个任意长的时间。然而,我们已经假设在时钟沿之后,亚稳定性保持的最长时间为Tr(称为亚稳定分辨时间)。只要时钟周期比Tr与DFF2的建立时间之和要大,那么从下一个时钟触发沿开始,DFF2的输出信号就是异步信号(DFF的输入信号)的同步拷贝,而且不会进入亚稳态。于是就可以把DFF2的输出信号(时钟异步信号)分发到系统的其余部分!

通过两极触发器其实就是给亚稳态足够的脱离时间!

 

 

FPGA22年从配角到主角

   任何一个从事后看来很成功的新事物从诞生到发展壮大都不可避免地经历过艰难的历程并可能成为被研究的案例,FPGA也不例外。1985年,当全球首款FPGA产品——XC2064诞生时,注定要使用大量芯片的PC机刚刚走出硅谷的实验室进入商业市场,因特网只是科学家和政府机构通信的神秘链路,无线电话笨重得像砖头,日后大红大紫的Bill Gates正在为生计而奋斗,创新的可编程产品似乎并没有什么用武之地。

 

 

  事实也的确如此。最初,FPGA只是用于胶合逻辑,从胶合逻辑到算法逻辑再到数字信号处理、高速串行收发器和嵌入式处理器,FPGA真正地从配角变成了主角。在以闪电般速度发展的半导体产业里,22年足够改变一切。“在未来十年内每一个电子设备都将有一个可编程逻辑芯片”的理想正成为现实。

  从2μm到65nm

  1985年,Xilinx公司推出的全球第一款FPGA产品XC2064怎么看都像是一只“丑小鸭”——采用2μm工艺,包含64个逻辑模块和85000个晶体管,门数量不超过1000个。22年后的2007年,FPGA业界双雄Xilinx和Altera公司纷纷推出了采用最新65nm工艺的FPGA产品,其门数量已经达到千万级,晶体管个数更是超过10亿个。一路走来,FPGA在不断地紧跟并推动着半导体工艺的进步——2001年采用150nm工艺、2002年采用130nm工艺,2003年采用90nm工艺,2006年采用65nm工艺。

  在上世纪80年代中期,可编程器件从任何意义上来讲都不是当时的主流,虽然其并不是一个新的概念。可编程逻辑阵列(PLA)在1970年左右就出现了,但是一直被认为速度慢,难以使用。1980年之后,可配置可编程逻辑阵列(PAL)开始出现,可以使用原始的软件工具提供有限的触发器和查找表实现能力。PAL被视为小规模/中等规模集成胶合逻辑的替代选择被逐步接受,但是当时可编程能力对于大多数人来说仍然是陌生和具有风险的。20世纪80年代在“mega PAL”方面的尝试使这一情况更加严重,因为“mega PAL”在功耗和工艺扩展方面有严重的缺陷,限制了它的广泛应用。

  然而,Xilinx公司创始人之一——FPGA器件的发明者Ross Freeman认为,对于许多应用来说,如果实施得当的话,灵活性和可定制能力都是具有吸引力的特性。也许最初只能用于原型设计,但是未来可能代替更广泛意义上的定制芯片。事实上,正如Xilinx公司亚太区营销董事郑馨南所言,随着技术的不断发展,FPGA由配角到主角,很多系统设计都是以FPGA为中心来设计的。FPGA走过了从初期开发应用到限量生产应用再到大批量生产应用的发展历程。从技术上来说,最初只是逻辑器件,现在强调平台概念,加入数字信号处理、嵌入式处理、高速串行和其他高端技术,从而被应用到更多的领域。

  “过去20年来,PLD产品的终极目标一直瞄准速度、成本和密度三个指标,即构建容量更大、速度更快和价格更低的FPGA,让客户能直接享用。”Actel公司总裁兼首席执行官John East如此总结可编程逻辑产业的发展脉络。

  当1991年Xilinx公司推出其第三代FPGA产品——XC4000系列时,人们开始认真考虑可编程技术了。XC4003包含44万个晶体管,采用0.7μm工艺,FPGA开始被制造商认为是可以用于制造工艺开发测试过程的良好工具。事实证明,FPGA可为制造工业提供优异的测试能力,FPGA开始用来代替原先存储器所扮演的用来验证每一代新工艺的角色。也许从那时起,向最新制程半导体工艺的转变就已经不可阻挡了。最新工艺的采用为FPGA产业的发展提供了机遇。

  Actel公司相信,Flash将继续成为FPGA产业中重要的一个增长领域。Flash技术有其独特之处,能将非易失性和可重编程性集于单芯片解决方案中,因此能提供高成本效益,而且处于有利的位置以抢占庞大的市场份额。Actel以Flash技术为基础的低功耗IGLOO系列、低成本的ProASIC3系列和混合信号Fusion FPGA将因具备Flash的固有优势而继续引起全球广泛的兴趣和注意。

  从50亿美元到410亿美元

  Altera公司估计可编程逻辑器件市场在2006年的规模大概为37亿美元,Xilinx公司的估计更为乐观一些,为50亿美元。虽然两家公司合计占据该市场90%的市场份额,但是作为业界老大的Xilinx公司在2006年的营收不过18.4亿美元,Altera公司则为12.9亿美元。PLD市场在2000年达到41亿美元,其后两年出现了下滑,2002年大约为23亿美元。虽然从2002年到2006年,PLD市场每年都在增长,复合平均增长率接近13%,但是PLD终究是一个规模较小的市场。而Xilinx公司也敏锐地意识到,FPGA产业在经历了过去几年的快速成长后将放慢前进的脚步,那么,未来FPGA产业的出路在哪里?

  Altera公司总裁兼首席执行官John Daane认为,FPGA及PLD产业发展的最大机遇是替代ASIC和专用标准产品(ASSP),主要由ASIC和ASSP构成的数字逻辑市场规模大约为350亿美元。由于用户可以迅速对PLD进行编程,按照需求实现特殊功能,与ASIC和ASSP相比,PLD在灵活性、开发成本以及产品及时面市方面更具优势。然而,PLD通常比这些替代方案有更高的成本结构。因此,PLD更适合对产品及时面市有较大需求的应用,以及产量较低的最终应用。PLD技术和半导体制造技术的进步,从总体上缩小了PLD和固定芯片方案的相对成本差,在以前由ASIC和ASSP占据的市场上,Altera公司已经成功地提高了PLD的销售份额,并且今后将继续这一趋势。“FPGA和PLD供应商的关键目标不是简单地增加更多的原型客户,而是向大批量应用最终市场和客户渗透。”John Daane为FPGA产业指明了方向。

  Xilinx公司认为,ASIC SoC设计周期平均是14个月到24个月,用FPGA进行开发时间可以平均降低55%。而产品晚上市六个月5年内将少33%的利润,每晚四周等于损失14%的市场份额。因此,郑馨南雄心勃勃地预言:“FPGA应用将不断加快,从面向50亿美元的市场扩展到面向410亿美元的市场。”其中,ASIC和ASSP市场各150亿美元,嵌入式处理和高性能DSP市场各30亿美元。

  改变产业观念居功至伟

  虽然没有像蒸汽机车发明之初备受嘲笑被讥讽为“怪物”,但是FPGA在诞生之初受到怀疑是毫无疑问的。当时,晶体管逻辑门资源极为珍贵,每个人都希望用到的晶体管越少越好。不过,Ross Freeman挑战了这一观念,他大胆预言:“在未来,晶体管将变得极为丰富从而可以‘免费 i使用。”如今,这一预言成为现实。

  “FPGA非常适用于原型设计,但对于批量DSP系统应用来说,成本太高,功耗太大。”这是业界此前的普遍观点,很长时间以来也为FPGA进入DSP领域设置了观念上的障碍。而如今,随着Xilinx公司和Altera公司相关产品的推出,DSP领域已经不再是FPGA的禁区,相反却成了FPGA未来的希望所在。

  FPGA对半导体产业最大的贡献莫过于创立了无生产线(Fabless)模式。如今采用这种模式司空见惯,但是在20多年前,制造厂被认为是半导体芯片企业必须认真考虑的主要竞争优势。然而,基于过去和关系和直接、清晰的业务模式,Xilinx创始人之一Bernie Vonderschmitt成功地使日本精工公司(Seiko)确信利用该公司的制造设施来生产Xilinx公司设计的芯片对双方都是有利的,于是,无生产线模式诞生了。

  未来,相信FPGA还将在更多方面改变半导体产业!

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-07-04
  • 2021-07-11
  • 2021-12-19
  • 2021-05-17
  • 2021-06-07
  • 2021-11-09
猜你喜欢
  • 2021-08-27
  • 2022-01-01
  • 2021-11-25
  • 2021-11-06
  • 2021-11-13
  • 2022-12-23
相关资源
相似解决方案