引言

    FPGA的设计是基于硬件描述语言(HDL)进行编程的一种工作,但是又不能理解为纯粹的软件编程问题,因为FPGA的设计本质上是硬件产品的设计。因此,设计者应从系统级别的角度进行设计,从硬件、软件两个层次并进考虑问题,才能保证FPGA产品的性能最优。本文通过在实际工作中观察与总结的若干问题进行总结,不妨作为FPGA初学者应注意事项若干,欢迎大家多交流,用于促进大家一起进步。

    雷区1:注释问题

    很多初学者没有在代码中添加注释的意识,这将导致三个问题:一、团队其他成员在帮助你校对或debug时看不懂你的代码,需要一次次人工口头的沟通;二、设计者自己对自己开发时间较久远的HDL代码忘记了设计意图,简而言之需要努力地回忆才能想起来;三、不利于团队化设计(大家都很忙,谁有时间听你口头一句句讲代码)?

    所以,看起来微不足道的注释问题其实是一个大问题,因此HDL代码实现阶段,记得适当添加衣物,哦不,注释语句!

    至于注释语句怎么添加比较好,请大家查一下自己公司的标准或某些大公司的标准(如果你的公司没有相关标准的话,建议你查阅一下诸如华为这样的大公司的标准)。

    雷区2:代码的规范使用问题

    正如引言指出:FPGA的设计本质上是硬件产品的设计——简而言之,HDL也就是逻辑器件在编程语言上的一种映射。如果逻辑器件是规范的(应该说,逻辑器件肯定是规范的),那么我们的代码也应该是规范的。然而,HDL又是一门编程语言,就像人类的自然语言会出现语词不搭意但是别人大多数情况下也能听懂的情况一样,HDL的描述上也具有随意表达的可能性——如果初学者没有遵守大家公约的规范代码,那么往往会制造出一些不规范的代码,而这种不规范也可以通过软件仿真、综合编程、布局布线,虽然看似无伤大雅,但是有两条不利后果:2、这种不规范的代码最容易出现BUG;2、代码显得很不专业,与人交流时大家会把你和你的团队当外行。在这里推荐一篇关于规范使用代码文档《Actel HDL UG》,这是Actel公司编写的关于逻辑器件的代码实现的一本官方指导。

    例如逻辑语句:

    if (条件1)

        A <= '1';

    else

        B <= '1';

    end if;

    这样的逻辑,看似符合人类的语言赋值语句,其实本质上生成的是一个奇怪的锁存器:该锁存器能对A、B两种数据进行锁存,且A的优先级高于B。然而实际上,这样的锁存器并不规范——可查阅任意一本公司的编写规范(推荐Actel公司的HDL UG)。

    私以为,依据上述描述的功能,语句应该这样描述比较规范:

    if(条件1)

        A <= '1';

    else

        A <= A;

    end if;

    if(!条件1)

        B <= '1';

    else

        B <= B;

    end if;

    这样,相同的功能是通过两个标准的锁存器实现的,而非一个不标准的具有某种优先级规则的“锁存器”实现——这里要提示一点,关于锁存器的使用应该注意:其实锁存器的使用在很多公司的标准里是不推荐甚至是不允许的,实际开发中一定要注意。

-----------------未完待续-------------------

更多推荐

FPGA初学者易触雷区99条