
FPGA设计流程与规范.doc
67页FPGA设计流程与规范前言 在大规模的逻辑设计过程中,按照标准的设计流程和代码规范来进行FPGA、CPLD的开发是很重要的,它能够使整个开发过程实现合理性、一致性、高效性对于一个不规范的设计程序,若隔了比较长的时间来进行调试或修改的话,估计很多信号和模块的功能都忘了,若做了一半时需要由别的工程师来接着做的话,估计也得重头开始整个设计了而且,一个不规范的设计也无法实现代码的可重用性因此,FPGA设计流程和代码的规范化是很重要的,鉴于此原因笔者编写了本文档,以供FPGA设计参考用同时,本文档还对FPGA开发过程中的一些常用技巧和需要注意的问题进行了阐述目 录前言 11. 基于HDL的FPGA设计流程概述 11.1 设计流程图 11.2 关键步骤的实现 21.2.1 功能仿真 21.2.2 逻辑综合 21.2.3 前仿真 31.2.4 布局布线 31.2.5 后仿真(时序仿真) 43. 逻辑仿真 43.1 测试程序(test bench) 43.2 使用预编译库 54. 逻辑综合 54.1 逻辑综合的一些原则 64.1.1 关于逻辑综合 64.1.2 大规模设计的综合 64.1.3 必须重视工具产生的警告信息 64.2 调用模块的黑盒子方法 65. VHDL语言编写规范 75.1 VHDL编码风格 75.1.1 标识符命名习惯 75.1.2 数据对象和类型 85.1.3 信号和变量 95.1.4 实体和结构体 105.1.5 语句 115.1.6 运算符 145.1.7 函数(Function) 145.1.8 过程(Procedure) 145.1.9 类属(generics) 155.1.10 程序包(Package) 155.1.11 有限状态机(FSM) 155.1.12 注释(comments) 165.2 代码的模块划分 165.3 代码编写中容易出现的问题 165.3.1 资源共享问题 165.3.2 组合逻辑描述的多种方式 175.3.3 考虑综合的执行时间 175.3.4 避免使用Latch 175.3.5 内部三态总线结构 186. VERILOG语言编写规范 196.1 Verilog编码风格 196.1.1 命名规则 196.1.2 Modules 206.1.3 Net and Register 216.1.4 Expressions 216.1.5 IF语句 216.1.6 CASE语句 226.1.7 Writing Functions 226.1.8 Assignment 236.1.9 Combinatorial VS Sequential Logic 236.1.10 Macros 246.1.11 Comments 246.2 代码编写中容易出现的问题 247. 同步数字电路设计技术 277.1 设计的可靠性 277.2 时序分析基础 277.3 同步电路设计 287.3.1 同步电路的优越性 287.3.2 同步电路设计规则 297.3.3 异步设计中常见问题及解决办法 297.3.4 不建议使用的电路 377.4 置位和复位信号处理 387.5 时延电路处理 387.6 全局信号处理 387.7 时序设计的可靠性保障措施 408. 基于VHDL的FPGA设计指导 418.1 VHDL代码风格 418.2 常见问题 418.2.1 不可综合的代码 418.2.2 采用std_logic以外的数据类型 418.2.3 错误使用inout 428.2.4 产生不必要的Latch 428.2.5 同一个信号在两个或两个以上的process中赋值 438.2.6 错误的使用变量或信号 438.2.7 合理使用内部RAM 458.2.8 三态电路设计 458.2.9 异步复位电路设计 468.2.10 时钟电路设计 478.3 设计技巧 488.3.1 合理设计加法电路 488.3.2 巧妙处理比较器 508.3.3 选择IF语句和CASE语句 508.3.4 减少关键路径的逻辑级数 508.3.5 考虑资源共享 508.3.6 流水结构(Pipelining) 538.3.7 组合逻辑和时序逻辑分离 548.3.8 利用电路等价性“分配”延时 548.3.9 复制电路,减少扇出,提高速度 548.3.10 状态机编码及设计技巧 548.4 与工艺相关的设计技巧(以Xilinx为例) 568.4.1 高效利用IOB 568.4.2 存储器的使用 578.4.3 579. 可重用性设计 589.1 基本原则 589.2 原则描述 589.2.1 命名定义 589.2.2 VHDL中Architecture的命名约定 589.2.3 源文件中要有文件头 599.2.4 使用注释 599.2.5 独立成行 599.2.6 行长度 599.2.7 缩进 599.2.8 不要使用HDL的保留字 599.2.9 端口顺序 599.2.10 端口映射和generic映射 609.2.11 使用函数 609.2.12 使用循环、Loop和数组 609.2.13 使用有意思的标号 609.3 可移植性编码准则 609.3.1 只使用IEEE的标准类 609.3.2 不要直接使用数字 619.3.3 使用package 619.3.4 VHDL到Verilog的变换 619.4 时钟和复位信号的编码准则 619.4.1 避免使用混合时钟沿 619.4.2 避免手工例化时钟Buffer 619.4.3 避免门控时钟 629.4.4 避免内部产生复位信号 629.4.5 触发器的时钟使能和低功耗设计 629.5 面向综合的编码准则 629.5.1 寄存器推断 629.5.2 定义完整的敏感表 631. 基于HDL的FPGA设计流程概述1.1 设计流程图(1)设计定义(2)HDL实现逻辑仿真器(3)功能仿真逻辑综合器(4)逻辑综合逻辑仿真器(5)前仿真FPGA厂家工具(6)布局布线(8)静态时序分析逻辑仿真器(7)后仿真(9)在系统测试说明:l 逻辑仿真器主要指modelsim,Verilog-XL等。
l 逻辑综合器主要指LeonardoSpectrum、Precision、Synplify、FPGA Compiler等l FPGA厂家工具指的是Max+PlusII、QuartusII、ISE等1.2 关键步骤的实现1.2.1 功能仿真RTL代码调用模块的行为仿真模型测试程序(test bench)测试数据逻辑仿真器说明: “调用模块的行为仿真模型”指的是RTL代码中引用的由厂家提供的宏模块/IP,如Altera 提供的LPM库中的乘法器、存储器等部件的行为模型,Xilinx提供的各种基本部件的仿真模型、或者是由Synopsys公司提供的SmartModel模型等,当然也可以是设计者自己编写的仿真模型1.2.2 逻辑综合设置综合目标和约束条件调用模块的黑盒子接口RTL代码逻辑综合器HDL网表(netlist)EDIF网表(netlist)说明:“调用模块的黑盒子接口”的导入,是由于RTL代码调用了一些外部模块,而这些外部模块不能被综合或无需综合,但逻辑综合器需要其接口的定义来检查逻辑并保留这些模块的接口1.2.3 前仿真逻辑综合器调用模块的行为仿真模型测试数据测试程序(test bench)HDL网表(netlist)逻辑仿真器说明: 一般来说,只要针对所用的逻辑综合器和所选的FPGA器件来说,RTL设计是完全可综合的,那么前仿真这一步可以跳过不做,这一步主要用于发现综合后有无逻辑功能上的问题,有的话就需要修改源代码或者综合约束。
1.2.4 布局布线逻辑综合器设置布局布线约束条件FPGA厂家工具EDIF网表(netlist)调用模块的综合模型SDF文件(标准延时格式)HDL网表(netlist)下载/编程文件1.2.5 后仿真(时序仿真)测试数据SDF文件(标准延时格式)FPGA基本单元仿真模型测试程序(test bench)FPGA厂家工具HDL网表(netlist)逻辑仿真器3. 逻辑仿真 考虑到性能和易用性,首选的逻辑仿真器是Mentor Graphics的modelsim3.1 测试程序(test bench) 测试程序对于设计功能和时序的验证有着举足轻重的影响,测试激励的完备性和真实性是关键所在,有以下原则须遵循:(1) 测试激励输入和响应输出采集的时序应当兼顾功能仿真(无延时)和时序仿真(有延时)的情况2) 对于周期较多的测试,为提高效率,尽可能采用程序语句来判断响应与标准结果是否一致,给出成功或出错标志,而不是通过观察波形来判断3) 采用基于文件的测试是很好的办法,即由matlab或spw等系统工具产生测试数据,测试程序将其读入产生激励,再把响应结果写入到文件,再交给上述工具进行处理或分析4) 仿真器支持几乎所有的VHDL、Verilog HDL语法,而不仅仅是常用的RTL的描述,设计者在编写测试平台时应当要充分利用这一点,使测试程序尽可能简洁、清楚,篇幅长的要尽量采用procedure 、task来描述。
3.2 使用预编译库 在进行功能仿真和后仿真时都需要某些模块的行为仿真模型和门级仿真模型,如Altera Quartus里的220model.v(LPM模块行为仿真模型)和apex20ke_atoms.v(20KE系列门级仿真模型),为避免在不同的设计目录中多次编译这些模型,应当采用一次编译,多次使用的方法具体做法如下(以20KE门级库为例): 1:在某个工作目录下新建一库名 apex20ke,将apex20ke_atoms.v编译到其中 2:在图形界面中的Load Design对话框中装入仿真设计时,在Verilog 标签下指定预编译库的完整路径见下图) 4. 逻辑综合 目前可用的FPGA综合工具有Mentor Graphics 的 LeonardoSpectrum、Precision,Synplicity的Synplify,Synopsys 的FPGA CompilerII/FPGA ExpressPrecision和Synplify由于性能和速度最好,成为我们首选的综合器,目前在FPGA逻辑综。












