最新日志

发表于:2007-8-14 0:46:59
标签:无标签

0

有问题大家发邮件给我吧!

现在预计到9月底也没有太多的时间写blog文章了。

计划赶不上变化啊,由于需求变更,现在我是指导上板调试一个版本,编码调试一个临时版本,指导设计一个新版本。每个版本的代码行都有35K,彻底晕菜……。

具体实现的功能类似CISCO的netflow,不知道大家知不知道。呵呵,机密内容,具体的就不说了。

有问题的话大家请直接发邮件给我,已经有3个网友给我发邮件请教了。不过我看邮件的频率不高,回复可能不及时,请大家谅解。

10月份估计会有段时间不忙,到时候会专门出一系列文章仔细讲述一下静态时序分析,还会对主流的外部RAM接口的设计和时序分析进行讲解。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(1) | 阅读(482)
发表于:2007-6-10 23:13:06
标签:无标签

0

好久没有上来,给大家先道个谦

现在这个项目实在是累人,进度紧、难度大就不说了,还经常发生需求变动,幸好不是大的变动,不然真的要死人了……

终于在本周完成了所有的代码和UT,统计结果吓了一跳,居然总代码行数到了6W多。由于时间太近,UT做的不充分,心里对代码质量很担忧。

下周开始就要进行ST了,半个月后就要上板测试,估计又要忙2个月左右。

估计至少要等到8月份才能有空经常上来更新了,很抱歉啊!

期待大家继续关注我的blog,谢谢!

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(571)
发表于:2007-2-4 22:36:21
标签:无标签

5

静态时序分析:Tsu、Tco

首先需要注意的是,这里讨论的都是静态时序分析。所谓静态时序分析,就是只针对FPGA内部布线后生成的实际布线结果来计算理论时序,同时采用的模型为理论模型。静态时序分析并不能完全分析和解决实际运行中的所有问题!

对于FPGA来说,其内部的D触发器本身的Tsu和Tco是固定的,非常小,特别是Tco一般为0。在这里我们将其称之为uTsu、uTco。

但在实际应用时,FPGA中的所有信号都会存在时延,这个时延造成了等效的Tsu、Tco变化。

见下图:

其中,DD为data信号从输入到D触发器的时延,其中包括IO时延、布线延迟、组合逻辑时延等。

DC为clock信号从输入到D触发器的时延,其中包括IO时延、布线时延、PLL相位变化等等。

今天先只讲讲Tsu。

对于Tsu,分析见下图:

点击看大图

其中clock'和data'分别对应于D触发器的clk端和D端信号。

从图中可以很明显的看出来,有如下等式:

Tsu - DD + DC = uTsu ;

可以得出:Tsu = DD - DC + uTsu ;

需要注意的是,DC有可能是负值。例如clock信号是通过DLL(PLL)调相后送给D触发器的情况,如果调相的相位是负值,则DC有可能为负值。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(5) | 阅读(1321)
发表于:2007-1-10 22:47:51
标签:无标签

2

问题答复

to yangss2006:

我的邮箱:fy2kdonews@yahoo.com.cn,欢迎大家发邮件。

init_flag信号是FPGA来产生的吗?

如果是,可以用下面的方式来产生:

always @( posedge clk or posedge rst )

begin

    if ( rst == 1'b1 ) 

    begin   

        init_flag <= 1'b0;

        init_flag_dly <= 1'b0;

    end

    else 

    begin 

        init_flag <= 1'b1;

        init_flag_dly <= init_flag;

    end

end

然后在初始化配置的always block中:

always @( posedge clk or posedge rst )

begin

    if ( rst == 1'b1 )

    begin

        ……

    end

    else  if (( init_flag_dly == 1'b0 )&&( init_flag == 1'b1 ))

    begin

        ……    //进行初始化配置

    end

end

需要注意的是,如果需要init_flag信号不是在复位信号无效后马上有效,这时就需要增加一个计数器来进行延时了。

HPI的接口协议我已经有好多年没有接触了,具体的细节记不清楚了。不过你可以仔细研究一下HPI的时序图,应该不难的。

 

to stephen:

以前做过视频,不过已经是8年前的事了,现在一直在做通讯设备。

行同步是用于指示CRT显示器的每行扫描的起始;

场同步和帧同步的区别我还真不是特别清楚,不过我知道帧同步用于指示每帧图像的起始。

对于不同的分辨率和扫描率,行同步、帧同步的时间间隔是不定的。例如:如果一台CRT显示器的分辨率是1024×768,扫描速率为100帧/秒,那么内部处理电路的工作时钟至少要超过1024×768×100=79MHz,此时行同步信号频率会超过768×100=76.8KHz(还需要加上一些开销,行同步信号频率实际会超过76.8KHz一些),帧同步信号频率为100Hz。

详细的细节,建议你找一个CRT显示器方面的介绍看看。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(804)
发表于:2007-1-1 23:32:19
标签:无标签

4

大家提的一些问题的答复

最近刚忙完一个老逻辑项目的优化工作,把性能提升了一倍。节后马上又要开始一个新项目,难度很大,带宽有10G,6月份就要完工。估计元旦后的空闲时间又不多了,请大家谅解。

to riple:时序分析和约束是一个非常基本和非常重要的工作,不过牵涉面比较大,今天就不说了,下一个专题就仔细讲讲。

to  wyc:也不是绝对的,不过GCLK是专门设计用来接时钟信号的,GCLK管脚可以直接接入全局时钟网络,时延最小且固定,相对于其他管脚而言,GCLK是更好的选择。如果可能,尽可能把逻辑工作时钟接到GCLK管脚上。

to  etu:count=count+1这种计数器分配方式是最常用的分频方式,原理上是没有问题的。不过在实际应用的时候一定要注意以下几个方面:

1)一定要用同步计数器;

2)时钟一定要走全局时钟网络或者局部时钟网络,以保证时钟信号到计数器的各个D触发器处的时延相同;

3)外部芯片对分频后的时钟有何要求?占空比有何要求?抖动有何要求?对于某些jitter要求小于100ps的情况,不要用简单的计数器分频。经过逻辑门处理后的时钟抖动都会逐级增加的。

4)还有一个比较容易疏忽的地方就是输出管脚。输出管脚的驱动能力设置的是否合适?驱动能力小了,在长距离传输后会导致高低电平不满足要求,输出能力过大,会产生振铃和台阶,导致错误的触发。

5)在对时钟精度要求高的场合,建议采用逻辑芯片内部提供的PLL或者DLL来分频,并尽可能通过PLL专用输出管脚或者DDIO来输出。

to  tony1290:altera和xilinx的芯片各有特色,但在平常的逻辑设计中,只要不牵涉到QDR SRAM、SERDES等高速应用,我觉得这两种芯片都没有太大差别。工具软件方面,quartus ii和ISE各有特色,建议有机会都用用。在我看来,只有具体的芯片报价差别才是最重要的,谁的便宜我就用谁的,呵呵

to  yangss2006:真的很抱歉,平时晚上基本都在加班,公司是不准使用QQ的。自从2003年开始,我就基本上没有用过QQ了。不过没有关系,你有甚么问题,尽管在我的blog上提问好了。HPI接口我曾经在1999年用过,不过当初还没有开始做逻辑设计,当时在做单板硬件,用的是5410和5409。HPI接口不复杂,相对于PCI、POS-PHY、SPI4.2等来说,非常简单。FSM的设计要点其实就是你要把整个流程想清楚,并把所有的状态变化和异常处理都考虑清楚,然后画出一个状态机的状态迁移图,接着想清楚每个状态之间跳转的条件是甚么,每个状态中应该做什么。都想清楚且没有疑问后,OK,一半工作已经搞定了,剩下的就是用Verilog或者VHDL把它实现了。按照这个流程来操作,你会发现写FSM其实很简单的。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(6) | 阅读(1013)
发表于:2006-12-11 23:13:24
标签:无标签

1

希望大家在回复中多提问题

最近2周一直在忙一个逻辑优化工作,总共写了5000多行,外加所有的单元仿真和系统仿真。好累!

现在要做系统仿真和上板测试了,估计最近2周晚上也没有空来更新了。

另外,请大家在回复中提出自己关心的问题,我可以在后续的文章中一一答复。这样也有针对性一些。不然,我就怕写的太泛泛了。

逻辑设计是一门实践的学科,很多经验和技巧是要在实际的设计中去发现和积累的。

感谢大家的支持!请大家继续关注我的blog,多谢!

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(4) | 阅读(993)
发表于:2006-12-5 22:47:05
标签:FPGA  逻辑设计  Verilog  

4

FPGA设计要点之四:逻辑仿真

Hehe, 今天用了个手写板, 感觉还不错,虽然速度慢,但是可以练习写字,老用键盘都不会写字了。

仿真是FPGA设计中必不可少的一步。没有仿真,就没有一切。

仿真是一个单调而繁琐的工作,很容易让人产生放弃或者偷工减料的念头。这时一定要挺住!

仿真分为单元仿真、集成仿真、系统仿真。

单元仿真:针对每一个最小基本模块的仿真。单元仿真要求代码行覆盖率、条件分支覆盖率、表达式覆盖率必须达到100%!这三种覆盖率都可以通过MODELSIM来查看,不过需要在编译该模块时要在Compile option中设置好。

集成仿真:将多个大模块合在一起进行仿真。覆盖率要求尽量高。

系统仿真:将整个硬件系统合在一起进行仿真。此时整个仿真平台包含了逻辑周边芯片接口的仿真模型,以及BFM、Testbench等。系统仿真需要根据被仿真逻辑的功能、性能需求仔细设计仿真测试例和仿真测试平台。系统仿真是逻辑设计的一个大分支,是一门需要专门学习的学科。

困了,今天就不多写了。希望大家多提问题,这样针对性更强些。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(4) | 阅读(1655)
发表于:2006-12-5 22:47:01
标签:FPGA  逻辑设计  Verilog  

2

FPGA设计要点之四:逻辑仿真

Hehe, 今天用了个手写板, 感觉还不错,虽然速度慢,但是可以练习写字,老用键盘都不会写字了。

仿真是FPGA设计中必不可少的一步。没有仿真,就没有一切。

仿真是一个单调而繁琐的工作,很容易让人产生放弃或者偷工减料的念头。这时一定要挺住!

仿真分为单元仿真、集成仿真、系统仿真。

单元仿真:针对每一个最小基本模块的仿真。单元仿真要求代码行覆盖率、条件分支覆盖率、表达式覆盖率必须达到100%!这三种覆盖率都可以通过MODELSIM来查看,不过需要在编译该模块时要在Compile option中设置好。

集成仿真:将多个大模块合在一起进行仿真。覆盖率要求尽量高。

系统仿真:将整个硬件系统合在一起进行仿真。此时整个仿真平台包含了逻辑周边芯片接口的仿真模型,以及BFM、Testbench等。系统仿真需要根据被仿真逻辑的功能、性能需求仔细设计仿真测试例和仿真测试平台。系统仿真是逻辑设计的一个大分支,是一门需要专门学习的学科。

困了,今天就不多写了。希望大家多提问题,这样针对性更强些。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(1183)
发表于:2006-11-28 22:07:14
标签:无标签

3

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还是要尽可能的敬而远之。

到年底了,工作越来越紧了,可能后续的日志写作时间会不规律且长度不定,请大家谅解啊!

另外,有空请各位多推荐推荐,拜谢!

我希望能通过这个blog结交更多的FPGA设计爱好者,共同提高,共同进步。

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(2) | 阅读(1043)
发表于:2006-11-24 22:44:07
标签:无标签

5

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芯片没有安装散热片)。

 

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 无分类

评论(5) | 阅读(1740)
总共 , 当前 /,2下一页