HDL概述与设计技巧

来源:本站
导读:目前正在解读《HDL概述与设计技巧》的相关信息,《HDL概述与设计技巧》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《HDL概述与设计技巧》的详细说明。
简介:HDL概述与设计技巧

随着电子设计技术的飞速发展,专用集成电路(ASIC)和用户现场可编程门阵列(FPGA)的复杂度越来越高。数字通信、工业自动化控制等领域所用的数字电路及系统其复杂程度也越来越高,特别是需要设计具有实时处理能力的信号处理专用集成电路,并把整个电子系统综合到一个芯片上。HDL(HardwareDescriptionLanguage),是硬件描述语言。顾名思义,硬件描述语言就是指对硬件电路进行行为描述、寄存器传输描述或者结构化描述的一种新兴语言。

随着EDA技术的发展,使用硬件语言设计PLD/FPGA成为一种趋势。目前最主要的硬件描述语言是VHDLVerilog

HDLVHDL发展的较早,语法严格,而VerilogHDL是在C语言的基础上发展起来的一种硬件描述语言,语法较自

由。VHDLVerilogHDL两者相比,VHDL的书写规则比Verilog烦琐一些,但verilog自由的语法也容易让少数初学

者出错。国外电子专业很多会在本科阶段教授VHDL,在研究生阶段教授verilog。从国内来看,VHDL的参考书很多,

便于查找资料,而VerilogHDL的参考书相对较少,这给学习VerilogHDL带来一些困难。EDA技术的发展上看,

已出现用于CPLD/FPGA设计的硬件C语言编译软件,虽然还不成熟,应用极少,但它有可能会成为继VHDLVerilog

之后,设计大规模CPLD/FPGA的又一种手段。

一、选择VHDL还是verilogHDL

这是一个初学者最常见的问题。其实两种语言的差别并不大,他们的描述能力也是类似的。掌握其中一种语言以

后,可以通过短期的学习,较快的学会另一种语言。选择何种语言主要还是看周围人群的使用习惯,这样可以方

便日后的学习交流。当然,如果您是集成电路(ASIC)设计人员,则必须首先掌握verilog,因为在IC设计领域,

90%以上的公司都是采用verilog进行IC设计。对于PLD/FPGA设计者而言,两种语言可以自由选择

二、学习HDL的几点重要提示

1.了解HDL的可综合性问题:

HDL有两种用途:系统仿真和硬件实现。如果程序只用于仿真,那么几乎所有的语法和编程方法都可以使用。

如果我们的程序是用于硬件实现(例如:用于FPGA设计),那么我们就必须保证程序可综合(程序的功能可以

用硬件电路实现)。不可综合的HDL语句在软件综合时将被忽略或者报错。我们应当牢记一点:所有的HDL

描述都可以用于仿真,但不是所有的HDL描述都能用硬件实现。

2.用硬件电路设计思想来编写HDL:

学好HDL的关键是充分理解HDL语句和硬件电路的关系。编写HDL,就是在描述一个电路,我们写完一段程序以后,

应当对生成的电路有一些大体上的了解,而不能用纯软件的设计思路来编写硬件描述语言。要做到这一点,需要

我们多实践,多思考,多总结。

3.语法掌握贵在精,不在多

30%的基本HDL语句就可以完成95%以上的电路设计,很多生僻的语句并不能被所有的综合软件所支持,在程序移植或

者更换软件平台时,容易产生兼容性问题,也不利于其他人阅读和修改。建议多用心钻研常用语句,理解这些语句

的硬件含义,这比多掌握几个新语法要有用的多。

三、HDL与原理图输入法的关系

HDL和传统的原理图输入方法的关系就好比是高级语言和汇编语言的关系。HDL的可移植性好,使用方便,但效率

不如原理图;原理图输入的可控性好,效率高,比较直观,但设计大规模CPLD/FPGA时显得很烦琐,移植性差。在

真正的PLD/FPGA设计中,通常建议采用原理图和HDL结合的方法来设计,适合用原理图的地方就用原理图,适合用

HDL的地方就用HDL,并没有强制的规定。在最短的时间内,用自己最熟悉的工具设计出高效,稳定,符合设计要

求的电路才是我们的最终目的。

四、HDL开发流程

VHDL/VerilogHD语言开发PLD/FPGA的完整流程为:

1.文本编辑:用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。通常VHDL文件保存为.vhd文件,

Verilog文件保存为.v文件

2.功能仿真:将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以

跳过这一步,只在布线完成以后,进行时序仿真)

3.逻辑综合:将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式和信号的连接关系。

逻辑综合软件会生成.edfedif)的EDA工业标准文件。

4.布局布线:.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到PLD/FPGA

5.时序仿真:需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。(也叫后仿真)

6.编程下载:确认仿真无误后,将文件下载到芯片中

通常以上过程可以都在PLD/FPGA厂家提供的开发工具(如MAXPLUSIIFoundationISE)中完成,但许多集成的

PLD开发软件只支持VHDL/Verilog的子集,可能造成少数语法不能编译,如果采用专用HDL工具分开执行,效果

会更好,否则这么多出售专用HDL开发工具的公司就没有存在的理由了。

五、开发技巧与验证

设计并验证这样复杂的电路及系统已不再是简单的个人劳动,而需要综合许多专家的经验和知识才能够完成。由于电路制造工艺技术进步非常迅速,电路设计能力赶不上技术的进步。在数字逻辑设计领域,迫切需要一种共同的工业标准来统一对数字逻辑电路及系统的描述,这样就能把系统设计工作分解为逻辑设计(前端)和电路实现(后端)两个互相独立而又相关的部分。由于逻辑设计的相对独立性就可以把专家们设计的各种常用数字逻辑电路和系统部件(如FFT算法、DCT算法部件)建成宏单元(Megcell)或软核(Soft-Core)库供设计者引用,以减少重复劳动,提高工作效率。电路的实现则可借助于综合工具和布局布线工具(与具体工艺技术有关)来自动地完成。

1.时钟和RESET信号设计指南

1.避免使用混合时钟沿:(1)在你的设计中,要避免同时使用上升沿触发和下降沿触发这两种触发方式的寄存器。若设计中必须同时使用上升沿和下降沿进行触发,则必须确保综合和时序分析后的该模块的时序周期在最坏状态下也是正确的,必须在给用户的文档中详细描述对该设计中时序信号占空比的要求;(2)如果在你的设计中必须同时使用大量的上升沿和下降沿出发的触发器,那么应该把他们放在不同的模块中。

2,避免使用时钟缓冲器:避免在RTL代码中直接引入时钟缓冲器。时钟缓冲器通常是在综合完成之后,作为物理设计中的部分工作插入到设计中的。

3.避免使用门控时钟:避免在RTL代码中直接使用门控时钟。门控时钟电缆是一种工艺相关和时序相关的电路。

4.避免在模块内部产生时钟:在你的设计中,避免使用内部产生时钟的方法。内部产生的时钟可能导致可测性限制。

5.门控时钟和低功耗设计:(1)如果必须使用门控时钟或内部时钟,或者RESET信号,就应该把内部时钟电路或RESET电路分离出来,将它们作为顶层下的独立模块进行设计。将设计细分。保证所有单一模块,只使用一个时钟和一个RESET信号。(2)如果你的设计中需要门控时钟,那么就要在RTL代码中使用同步加载寄存器。

6.避免在模块内部产生RESET信号:(1)如果可能,尽量避免在模块内部产生RESET信号,或者避免用其它条件逻辑产生RESET信号;(2)如果确实需要条件RESET信号,那么可以创建一个独立的RESET信号,再创建一个独立的条件RESET产生逻辑模块。

7RESET逻辑功能:RESET信号的逻辑功能应该是直接清除所有的寄存器。不要把RESET信号作为状态机的输入。

8.一位同步器:使用两级触发,在两个时钟域之间传递一位数据。如图所示。把这些触发器用不同名字区别开,这样有利于集成时对这些亚稳态的触发器特性进行分析。为了防止毛刺的传播,不要将组合逻辑从一个时钟域连接到另一个时钟域。

9.多位同步器:在传输两个时钟域之间的多位数据时,不要使用上述的一位同步器传输方法,而应该使用一种可靠的握手电路或者像格雷码那样的多位编码方式。

2可移植性编码

1.只使用IEEE标准类型(VHDL):(1)使用STD_LOGIC类型,而不是STD_ULOGIC类型;(2)设计中不要创建过多的的子类型;(3)不要使用BITBIT_VECTOR类型。

2.不使用立即数:在设计中,不要使用立即数(但作为例外,可使用01),推荐使用常量。使用常量有以下优点:(1)常量对于一个设计具有更多的灵活性;(2)常量值只需要在一个地方修改;(3)编译器可能只支持常量类型,不支持立即数。

3.对于VHDL程序,把常数和参数定义在由1个或多个文件组成的程序包中。

4对于Verilog程序,把常数和参数定义在1个或多个小文件中。例如,文件名称为DesignName_Constant.VDesignName_Parameters.v

5.避免在代码中嵌入综合命令。

6.使用工艺无关库:(1)对于算法元件,使用DesignwareFoundationLibrary;(2)设计中应避免使用实体化的门设计;(3)如果设计中必须使用某些特殊工艺门,那么你可以将它隔离在某个单独模块中;(4)如果必须实例化门电路,可以使用SYNOPSYS通用工艺库GTECH

7.注意Verilog程序和VHDL程序的差异性,保证编码的可转换性:(1Verilog程序转换到VHDL程序:在Verilog程序设计中,元件端口映射时,不要使用任何逻辑表达式;不同的状态机之间,使用惟一状态名命名;函数在调用时,只能传递函数名、函数参数和局部寄存器变量;任务在调用时,只能传递任务参数和任务内部寄存器变量。(2VHDL程序转换到Verilog程序:在VHDL程序设计中,不要使用GENERATE声明;不要使用BLOCK块;不要用代码修改CONSTANT声明的变量。

3可综合划分

好的可综合划分会给你带来许多优势,它包括:(1)更好的综合结果;(2)更少的编程运行时间;(3)只要使用更简单的综合策略就可以满足设计的时序要求。

1.所有输出采用寄存器输出:对于采用层次化结构的核设计,子模块中所有的输出信号都应该使用寄存器输出方式。

2.将相关的组合逻辑放在同一模块:当把相关的组合逻辑放在同一模块中后,综合可以为你的设计提供更大可优化性。因为,在一般默认的综合方法中,综合工具对模块的优化只是在模块内部进行,不会跨越到多个模块之间。

3.将具有不同设计目标的部分分配到不同模块中:如将关键逻辑和非关键路径逻辑被分配到两个不同的模块中,这时综合工具可以专门对关键路径逻辑进行速度优化,而对非关键路径逻辑进行面积优化。

4.避免使用异步逻辑:(1)设计中的异步逻辑不仅难以正确实现,同时也难一验证。(2)如果设计中必须要有异步逻辑电路存在,那么将异步逻辑电路与同步逻辑电路分配到不同的模块中。

5.合并算术单元:为了让综合工具能够在资源共享方面进行优化,就需要所有相关的共享资源都必须在同一层次结构中,也就是说在同一模块中。

6.正确划分模块,提高综合速度:随着综合工具性能的改善,在划分模块时,更重要考虑的方面应该是逻辑功能、设计目标、时序的面积需求。将功能相关的模块划分在一起,而不是把它们人为分开,加剧模块之间的时序相关。

7.避免时序设计中的例外情况:(1)在设计中,避免出现多时钟周期路径和其它时序例外情况。(2)如果在设计中必须用到时序例外情况,那么应该保证:该例外路径的起点和终点在芯片级仍然是不变的。(3)在设计中,避免出现伪路经。

8.消除顶层模块中的胶连逻辑电路:在核的顶层结构中,不要再有实例化的门级逻辑电路出现。

9.芯片划分:确保设计的顶层中包含I/OPAD环和时钟发生器电路模块。

4可综合性编码

1.寄存器描述:时序逻辑电路最好采用寄存器(触发器)传输的方式设计。

2.避免产生锁存器:(1)在你的设计中,避免使用任何锁存器。但可以使用工艺无关的GETCHD锁存器。(2)通过使用下列编码技术,可以避免产生锁存器:在VHDL程序中,将默认值赋值语句写在过程的开始;在VERILOG程序中,对所有可能的输入条件,都有明确的输出;在VHDL程序中,对于条件语句的最后一个分支,使用ELSE语句(而不时使用ELSIF语句)。

3.如果必须使用锁存器:可使用多选的方法,提供一般功能或I/O借口的数据。多选器的选择控制位来自于扫描控制使能的测试模式管脚。

4.避免产生组合逻辑电路反馈:组合电路反馈是指组合逻辑电路形式的反馈环路。组合反馈环路会引起一系列问题,包括会使精确静态时序分析难以实现。

5.完整的敏感信号列表:(1)规则:每个processVHDL)和alwaysVerilog)模块中的敏感信号列表必须完整。(2)对于组合逻辑模块(模块中不包括寄存器或锁存器),敏感信号列表必须包括过程中用到的每个信号,也就是出现在赋值语句右侧的信号或条件表达式中用到的信号,都应该列在敏感信号列表中。(3)对于时序逻辑模块,敏感信号列表必须包括过程中用到的时钟信号。如果时序过程模块还要用到异步RESET信号,那么敏感信号列表中还应该包括RESET信号。(4)确保过程模块敏感信号列表中的信号是必需的。敏感信号列表中没必要出现的信号会降低仿真速度。

6.阻塞和非阻塞赋值(Verilog):在书写Verilog可综合代码时,在always@posedgeclk)模块中,总是使用非阻塞赋值方式,否则会产生RTL级仿真和门级仿真功能不一样的现象。

7.信号和变量赋值(VHDL):在书写VHDL可综合代码时,建议使用信号量,而不时使用变量,以确保综合前的仿真与综合后的仿真相一致。如果你觉得使用了变量后,仿真速度得到了非常显著的提高,那么也可以使用变量。

8CASE语句和IF-THEN-ELSE语句:(1VHDL语言和Verilog语言中的CASE语句对应一个单级的多选电路,IF-THEN-ELSE语句对应于一个优先编码的多级组合选择电路。(2)多选器是一个相对更快的电路,因此,在不需要使用优先级编码结构时,推荐使用CASE语句,而不要使用IF-THEN-ELSE语句进行描述。如果你有一个迟到的信号时,使用IF-THEN-ELSE语句可能会有用。

9.时序逻辑电路的HDL语言描述:(1)包括像状态机这样的时序逻辑,都可以用一个时序过程进行描述。为了提高程序的可读性,应该把一些对中间变量赋值的语句移到时序逻辑描述的过程之外。(2)在VHDL语言中,把各状态变量定义为类型。在Verilog语言中,用DEFINE命令定义各状态变量。(3)队员包含FSM(有限状态机)和非FSM逻辑的模块,在综合时有不同的要求,应该把它们单独放在不同的模块中。

10.对关键信号的描述:让后到达信号尽量靠近模块的输出端口。例如,在IF-THEN-ELSE模块中,让后到达信号具有较高优先级。

11.避免使用延迟语句:在RTL编码中,不要使用任何延迟语句。

12.避免使用FULL_CASEPARALLEL_CASE结构编程:以VHDL语句中的CASE语句的使用方法书写VERILOG语言中的CASE语句结构。

提醒:《HDL概述与设计技巧》最后刷新时间 2024-03-14 01:18:04,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《HDL概述与设计技巧》该内容的真实性请自行鉴别。