学习步骤.docx

上传人:b****3 文档编号:4987604 上传时间:2022-12-12 格式:DOCX 页数:11 大小:29.66KB
下载 相关 举报
学习步骤.docx_第1页
第1页 / 共11页
学习步骤.docx_第2页
第2页 / 共11页
学习步骤.docx_第3页
第3页 / 共11页
学习步骤.docx_第4页
第4页 / 共11页
学习步骤.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

学习步骤.docx

《学习步骤.docx》由会员分享,可在线阅读,更多相关《学习步骤.docx(11页珍藏版)》请在冰豆网上搜索。

学习步骤.docx

学习步骤

FPGA学习步骤,我的体会FPGA在目前应用领域非常,在目前的单板设计里面,几乎都可以看到它的身影。

从简单的逻辑组合,到高端的图像、通信协议处理,从单片逻辑到复杂的ASIC原型验证,从小家电到航天器,都可以看到FPGA应用,它的优点在这里无庸赘述。

从个人实用角度看,对于学生,掌握FPGA可以找到一份很好的工作,对于有经验的工作人员,使用fgpa可以让设计变得非常有灵活性。

掌握了fpga的设计,单板硬件设计就非常容易(不是系统设计),特别是上大学时如同天书的逻辑时序图,看起来就非常亲切。

但fpga的入门却有一定难度,因为它不像软件设计,只要有一台计算机,几乎就可以完成所有的设计。

fpga的设计与硬件直接相关,需要实实在在的调试仪器,譬如示波器等。

这些硬件设备一般比较昂贵,这就造成一定的入门门槛,新人在入门时遇到一点问题或者困难,由于没有调试设备,无法定位问题,最后可能就会放弃。

其实这时如果有人稍微指点一下,这个门槛很容易就过去。

      我用FPGA做设计很多年了,远达不到精通的境界,只是熟悉使用,在这里把我对fpga的学习步骤理解写出来,仅是作为一个参考,不对的地方,欢迎大家讨论和指正。

    1、工欲善其事,必先利其器。

    计算机必不可少。

目前FPGA应用较多的是Altera和xilinx这两个公司,可以选择安装quartusII或者ISE软件。

这是必备的软件环境。

    硬件环境还需要下载器、目标板。

虽然有人说没有下载器和目标板也可学习fpga,但那总是纸上谈兵。

这就像谈女朋友,总是嘴上说说,通个电话,连个手都没牵,能说人家是你朋友?

虽说搭建硬件环境需要花费,但想想,硬件环境至多几百元钱,你要真的掌握FPGA的设计,起薪比别人都不止高出这么多。

这点花费算什么?

        2、熟悉verilog语言或者vhdl语言,熟练使用quartusII或者ISE软件。

    VHDL和verilog各有优点,选择一个,建议选择verilog。

熟练使用设计软件,知道怎样编译、仿真、下载等过程。

    起步阶段不希望报一些培训班,除非你有钱,或者运气好,碰到一个水平高、又想把自己的经验和别人共享的培训老师,不然的话,培训完后总会感觉自己是一个冤大头。

入门阶段可以在利用网络资源完成。

        3、设计一个小代码,下载到目标板看看结果    此时可以设计一个最简答的程序,譬如点灯。

如果灯在闪烁了,表示基本入门了。

如果此时能够下载到fpga外挂的flash,fpga程序能够从flash启动,表明fpga的最简单设计你已经成功,可以到下一步。

        4、设计稍微复杂的代码,下载到目标板看看结果。

        可以设计一个UART程序,网上有参考,你要懂RS232协议和fpga内置的逻辑分析仪。

网上下载一个串口调试助手,调试一番,如果通信成功了,  恭喜,水平有提高。

进入下一步。

        5、设计复杂的代码,下载到目标板看看结果。

    譬如sdram的程序,网上也有参考,这个设计难度有点大。

可用串口来调试sdram,把串口的数据存储到sdram,然后读回,如果成功,那你就比较熟悉fpga的设计饿了        6、设计高速接口,譬如ddr2或者高速串行接口    这要对fpga的物理特性非常了解,而且要懂得是时序约束等设计方法,要看大量的原厂文档,这部分成功了,那就对fpga的物理接口掌握很深,你就是设计高手了        7、设计一个复杂的协议      譬如USB、PCIexpress、图像编解码等,锻炼对系统的整体把握和逻辑划分。

完成这些,你就是一个一流的高手、          8、学习再学习      学习什么,我也不知道,我只知道“学无止境,山外有山”。

      上述只是一些简单的学习步骤,希望能对大家有所帮助!

Verilog经验谈

规范很重要

  工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。

逻辑设计也是这样:

如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。

  在逻辑方面,我觉得比较重要的规范有这些:

   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_TIMErst_n=1'b1;

      ...

      #CLK_PERIOD/2clk<=~clk;

  如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重新例化就行了,从而使得代码更加易于重用。

  b.信号命名要规范化。

  1)信号名一律小写,参数用大写。

  2)对于低电平有效的信号结尾要用_n标记,如rst_n。

  3)端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后  方便很多。

如:

    modulea(

          //input

          clk,

          rst_n,  //globlesignal

          wren,

          rden,

          avalon_din,  //relatedtoavalonbus

          sdi,      //relatedtoserialportinput

          //output

          data_ready,

          avalon_dout,//relatedtoavalonbus

          ...

          );    4)一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个en

tity。

在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔离。

这样做可以让综合器综合出更优的结果。

    5)尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止出现任何胶连逻辑(gluelogic),哪怕仅仅是对某个信号取反。

理由同上。

    6)在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的,比如配置寄存器就是这种类型。

    7)一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。

    所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也是极有好处的。

    9)除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要用到门控时钟的地方,也要将门控信号用时钟的下降沿打一拍再输出与时钟相与。

          clk_gate_en    --------              ----

          -----------------|D    Q|------------------|    \gate_clk

_out

                    |      |      ---------|    )--------

-

                ------o|>    |      |      |    /

          clk  |    --------        |      ----

          ------------------------------------

    10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。

如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_

1xclk的速率发送数据。

      不要这样做:

      always(posedgers232_1xclkornegedgerst_n)

      begin

        ...

      end

      而要这样做:

      always(posedgeclk_25mornegedgerst_n)

      begin

        ...

        elseif(rs232_1xclk==1'b1)

        ...

      end    11)状态机要写成3段式的(这是最标准的写法),即

      ...

      always@(posedgeclkornegedgerst_n)

      ...

        current_state<=next_state;

      ...

      always@(current_state...)

      ...

      case(current_state)

          ...

          s1:

            if...

              next_state=s2;

          ...

      ...

      always@(posedgeclkornegedgerst_n)

      ...

        else

          a<=1'b0;

          c<=1'b0;

          c<=1'b0;        //赋默认值

            case(current_state)

              s1:

                a<=1'b0;  //由于上面赋了默认值,这里就不用再对b、c赋值了(b、c在该状态为0,不会产生锁存器,下同)

              s2:

                b<=1'b1;

              s3:

                c<=1'b1;

              default:

              ...

      ...

    3.ALTERA参考设计准则

    1)EnsureClock,Preset,andClearconfigurationsarefreeofglitch

es.    2)NeveruseClocksconsistingofmorethanonelevelofcombinatori

allogic.

    3)Carefullycalculatesetuptimesandholdtimesformulti-Clocksy

stems.

    4)Synchronizesignalsbetweenflipflopsinmulti-Clocksystemswhen

thesetupandholdtimerequirementscannotbemet.

    5)EnsurethatPresetandClearsignalsdonotcontainraceconditio

ns.

    6)Ensurethatnootherinternalraceconditionsexist.

    7)Registerallglitch-sensitiveoutputs.

      Synchronizeallasynchronousinputs.

    9)Neverrelyondelaychainsforpin-to-pinorinternaldelays.

    10)DonotrelyonPower-OnReset.UseamasterResetpintoclearal

lflipflops.

    11)Removeanystuckstatesfromstatemachinesorsynchronouslogic.

  其它方面的规范一时没有想到,想到了再写,也欢迎大家补充。

====================================================================================时序是设计出来的

  我的boss有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。

在工作这几个月中,给我感触最深的是华为的那句话:

时序是设计出来的,不是仿出来的,更不是湊出来的。

  在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工作。

以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作所占的时间要远大于编码的时间。

  总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求把接口信号的时序波形描述出来)以及将来如何测试设计。

在这一级方案中,要保证在今后的设计中时序要收敛到一级模块(最后是在二级模块中)。

什么意思呢?

我们在做详细设计的时候,对于一些信号的时序肯定会做一些调整的,但是这种时序的调整最多只能波及到本一级模块,而不能影响到整个设计。

记得以前在学校做设计的时候,由于不懂得设计时序,经常因为有一处信号的时序不满足,结果不得不将其它模块信号的时序也改一下,搞得人很郁闷。

  在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来了,各级模块内部是怎么实现的也基本上确定下来了。

  由于做到这一点,在编码的时候自然就很快了,最重要的是这样做后可以让设计会一直处于可控的状态,不会因为某一处的错误引起整个设计从头进行。

  如何提高电路工作频率

  对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率指FPGA片内的工作频率)尽量高。

我们也经常听说用资源换速度,用流水的方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提高电路的工作频率。

  我们先来分析下是什么影响了电路的工作频率。

  我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clockskew有关。

在FPGA内部如果时钟走长线的话,clockskew很小,基本上可以忽略,在这里为了简单起见,我们只考虑信号的传播时延的因素。

  信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率,我们就要在这三个时延中做文章,使其尽可能的小。

  我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。

  1.通过改变走线的方式减少时延。

  以altera的器件为例,我们在quartus里面的timingclosurefloorplan可以看到有很多条条块块,我们可以将条条块块按行和按列分,每一个条块代表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级联的数量。

我们可以通过加约束、流水、切割状态的方法提高工作频率。

===================================================================================做逻辑的难点在于系统结构设计和仿真验证

  刚去公司的时候BOSS就和我讲,做逻辑的难点不在于RTL级代码的设计,而在于系统结构设计和仿真验证方面。

目前国内对可综合的设计强调的比较多,而对系统结构设计和仿真验证方面似乎还没有什么资料,这或许也从一个侧面反映了国内目前的设计水平还比较低下吧。

  以前在学校的时候,总是觉得将RTL级代码做好就行了,仿真验证只是形式而已,所以对HDL的行为描述方面的语法不屑一顾,对testbench也一直不愿意去学--因为觉得画波形图方便;对于系统结构设计更是一点都不懂了。

  到了公司接触了些东西才发现完全不是这样。

  其实在国外,花在仿真验证上的时间和人力大概是花在RTL级代码上的两倍,现在仿真验证才是百万门级芯片设计的关键路径。

仿真验证的难点主要在于怎么建模才能完全和准确地去验证设计的正确性(主要是提高代码覆盖),在这过程中,验证速度也是很重要的。

  验证说白了也就是怎么产生足够覆盖率的激励源,然后怎么去检测错误。

我个人认为,在仿真验证中,最基本就是要做到验证的自动化。

这也是为什么我们要写testbenc

h的原因。

在我现在的一个设计中,每次跑仿真都要一个小时左右(这其实算小设计)。

由于画波形图无法做到验证自动化,如果用通过画波形图来仿真的话,一是画波形会画死(特别是对于算法复杂的、输入呈统计分布的设计),二是看波形图要看死,三是检错率几乎为零。

  那么怎么做到自动化呢?

我个人的水平还很有限,只能简单地谈下BFM(busfunct

ionmodel,总线功能模型)。

  以做一个MAC的core为例(背板是PCI总线),那么我们需要一个MAC_BFM和PCI_BFM及PCI_BM(PCIbehaviormodel)。

MAC_BFM的主要功能是产生以太网帧(激励源),随机的长度和帧头,内容也是随机的,在发送的同时也将其复制一份到PCI_BM中;PCI_BFM的功能则是仿PCI总线的行为,比如被测收到了一个正确帧后会向PCI总线发送一个请求,PCI_BFM则会去响应它,并将数据收进来;PCI_BM的主要功能是将MAC_BFM发送出来的东西与PCI_BFM接收到的东西做比较,由于它具有了MAC_BFM的发送信息和PCI_BFM的接收信息,只要设计合理,它总是可以自动地、完全地去测试被测是否工作正常,从而实现自动检测。

  华为在仿真验证方面估计在国内来说是做的比较好的,他们已建立起了比较好的验证平台,大部分与通信有关的BFM都做好了,听我朋友说,现在他们只需要将被测放在测试平台中,并配置好参数,就可以自动地检测被测功能的正确与否。

  在功能仿真做完后,由于我们做在是FPGA的设计,在设计时已经基本保证RTL级代

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1