VHDL常见错误分析.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:7 大小:58KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

VHDL常见错误分析.doc

VHDL常见错误分析.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第页共NUMPAGES7页VHDL常见错误分析一、较好的RTL代码风格1、可综合用HDL语言编程,应时刻牢记所写代码能否反映期望的硬件及其功能,而且电路结构是可实现的。为保证设计的可综合,代码中的指令和数据类型必须是综合工具所支持的,同时代码的结构也必须使综合得到的硬件功能和代码所体现的功能一致。2、简洁清晰,易于理解最易懂的写法也就是效率最高的写法。使用一致的命名规则。3、注释清楚4、模块化程度高,易于修改、移植和复用需要将代码中的常数写成参数化的形式。5、模块例化时,为清楚起见,使用显示的端口说明6、为了避免很大的路径延时,不要使用特别长的嵌套的if结构。7、资源共享资源共享的主要思想是通过数据缓冲器或多路选择的方法来共享数据通路中工作单元(为了提高速度,对于关键路径不要使用该技术。一般在算术单元和关键路径中不采用资源复用。)8、避免使用门限时钟门限时钟可能会引入短脉冲干扰,增加时钟延时、时钟扭曲以及其他一些后果。9、代码中不要带有延时信息(行为级描述与testbench例外)10、进行数学运算时,要有好的顺序和分组。好的顺序及分组可能影响综合结果。ADD=A1+A2+A3+A4;--三级加法,较差ADD=(A1+A2)+(A3+A4);--二级加法,较好为了符合时序要求,综合工具能重新构造算术单元。我们还是要按所需结果书写代码。11、代码中不要带初始化赋值语句。综合工具会忽略掉这种初始化的语句,所以会导致综合前后仿真结果不一致。二、对可综合设计的一些建议1、在电路内部应尽量避免使用三态门,但是在电路边缘引脚处可以使用。2、内部总线应该尽量避免使用双向总线,一般使用单向总线。3、模块的划分应该尽量以寄存器为边界。4、应该尽量避免使用锁存器,因为有可能传输毛刺,而寄存器不会传输毛刺。5、时序逻辑应该注意信号边沿的检测,防止亚稳态的传输。6、串并转换应尽量使用移位寄存器,少用计数器,以提高速度。7、组合环应在边沿加上寄存器,使其在时钟的控制下工作。8、时钟分频和倍频电路一般不易使用高层描述;分频后的信号一般不作为时钟信号,因为其驱动能力较弱,容易产生时钟偏斜。9、在设计的顶层,最好不要实例化门,因为这可能导致代码难以优化。10、如果要使用门限时钟,内部生成的时钟,或者使用时钟的两个沿,则应该构造一个时钟生成单元模块。11、建议将状态机分成两个部分:一部分用于组合逻辑,一部分用于时序逻辑。12、状态机的状态编码最好也使用参数化的表示方式,这有利于将来的改动。三、常见错误及举例1、行为描述中常见问题在VHDL语言中,一条信号带入语句就可以创建一个驱动器。当同一赋值目标处于不同进程中时,其赋值结果就比较复杂。这可以看成是多个信号驱动源连在一起,可以发生线或、线与或者三态等不同结果。若处理不当,则会出现驱动器冲突。所以应避免在不同的进程中对同一个信号赋值,即多重源赋值问题。如例1所示。例1:process(clk1)beginifclk1'eventandclk1='1'theny<=m;endif;endprocess;process(clk2)beginifclk2'eventandclk1='2'thenifena=’1’theny<=n;--禁止使用endif;endif;endprocess;2、RTL描述中常见问题RTL描述又称为寄存器描述。在寄存器描述中,VHDL语言的使用并不是任意的,而是有一定限制的。2.1在一个进程中,禁止使用两个寄存器描述,对两个寄存器的描述是不允许的。如例2所示:例2:process(clk1,clk2)beginif(clk1'eventandclk1='1')theny<=m;endif;if(clk2'eventandclk2='1')then--错误x<=m;endif;endprocess;2.2在进程中,对变量要先读后写。如例3所示:例3:process(clk,reset)variablea:std_logic;beginifreset='1'thena:='0';outsignal<='0';elsifrising_edge(clk)thenoutsignal<=a;--先读a:=insignal;--后写endif;endprocess;因为变量值是立即获得的,所以如果先写后读就会产生长的组合逻辑和锁存器(或寄存器)。因此在编写代码过程中,对变量要先读后写。2.3用IF语句描述寄存器功能时,禁止使用ELSE项。对于RTL描述方式中的IF语句在其描述寄存器功能时,禁止采用ELSE