VHDL代码设计规范_第1页
VHDL代码设计规范_第2页
VHDL代码设计规范_第3页
VHDL代码设计规范_第4页
VHDL代码设计规范_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文献会盖页

文献标题VHDL编码规范(试用版)文献编号

授权分发清单

签名签名

编制审核

部门部门

加盖受控章

签名签名

审核审核

部门部门

签名签名

审核审核

部门部门

签名签名

审核审核

部门部门

签名签名

审核审核

部门部门

签名签名

审核审核

部门部门

签名签名

审核审核

部门部门

审批签名

同意签名

生效日期:

文献历史记录

文献编号

现行版本VI.0

文献标题VHDL代码设计规范

文献履历

版次编制日期更改内容(条款)

VHDL代码设计规范

(评审稿)

文献编号:

编制:_____________________

审核:

目录

1.目的错误未定义书签。

2.范围错误未定义书签。

术语阐明错误未定义书签。

4.规范列表错误未定义书签。

5.规范....错误未定义书签。

5.1.书写规范错误!未定义书签。

5.1.1.命名规范.错误!未定义书签。

5.1.2.注释规范.错误!未定义书签。

5.1.3.其他书写规范.错误!未定义书签。

5.2.设计规范错误!未定义书签。

5.2.1.复位.错误!未定义书签。

5.2.2.时钟.错误!未定义书签。

5.2.3.状态机错误!未定义书签。

5.2.4.异步信号,错误!未定义书签。

5.2.5.其他设计规范.错误!未定义书签。

5.3.设计常识错误!未定义书签。

6.附录错误未定义书签。

6.1.例子阐明(规范详细解释)错误!未定义书签。

6.2.代码模板错误!未定义书签。

1.目的

规范VHDL的设计风格,保证代码的可读性、重用性及与既有EDA工具的•致性,从而形成对设计

代码的原则化管理。

2.范围

本原则规定了VHDL代码设计规范。

本原则合用于COMBA企业技术中心。

3.术语阐明

本规范使用H勺术语解释如下:

级别:指该规则遵照向级别,有两个级别,分别为推荐和规定。

推荐:表达在一般状况下必须遵照该规则。

规定:表达必须严格遵守该规则。

阐明:对此规则或准则的必要的解释。

示例:对此规则举例进行阐明,示例分为正例和反例。

正例:对此规则或准则给出口勺对口勺示例。

反例:对此规则或准则给出口勺背面示例。

4.规范列表

编号级别规则

书写规范

R1.规定一种义献只包括一种模块,义帧命名、模块命名、实体命名必须相似。义

献名及其后缀必须小写.

R2.规定顶层文献定名方式使用器件型号、工程名与lop结合。第二层文献后•缀使

用module,第三层文献使用Kock,第四层之后不做定义。

规定模块使用功能进行划分,第二层文献及卜.面日勺模块命名,第•种单词需要

荐代码编写之前;菽档的方式,进行命名约定

R4定

R5规命名要有实际意义。

R6命名标识符的首字符必须是字母,包括多种单词的标志符单词之间使用下

划线分开。信号、变量等日勺命名最终的也一定规定是字母,中间的可以是

数字或者其他合法符号。

R7.规定模块、信号、变量等H勺命名不不小于64个不符

R8.推荐实体,构造名用大写标识

R9.推荐行为级、构造级的构造体命名分别以“BEH实体名”和“STR实体名”辨

别。假如是混合使用,或者是分不清使用了那•种构造,那么就是用“ARC

实体名”命名.

R10.规定单口RAM模块命名以SPRAM作后缀:双口RAM模块命名以DPRAM作后缀;

ROM模块命名以ROM作后缀:FIFO模块命名以FIFO作后缀:数字时钟管理

模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以

MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;

减法模块命名以SUB作后缀。

RU.推荐模块实例化时,采用'Unxx元件名‘标识,cell实例化时使用'Mnxx

元件名'标识。

R12.规定模块内部定义的信号、变量采用首字母大写命名。首字母符合阐明的规定

R13.规定非顶层模块端11信号命名方式采用Iportname、。portname分别对应输入、

输出端口信号。

R14.规定顶层模块端口信号命名规定与原理图命名一致或者是有关意义口勺英文单词

或者字母

R15.规定时钟信号必须用后缀“elk”进行命名

R16.规定对于微处理器接口的寄存器,必须包括reg标志。用下划线分开该寄存器

功能特性

R17.规定对于输入管脚时钟采样同步的信号命名规定后缀加“buf”表达。多次采

样加数字辨别

R18.规定某些常用的基本信号按阐明统•后缀命名

R19.规定多比特信号,应当使用相似的J比特次序,都采用downto描述。

R20.规定VHDL的保留字用小写

R21.规定调用IEEE原则库时,“IEEE”用大写,其他用小写。

R22.规定每个VHDL源文献应当在文献头注释文献的基本信息

R23.规定每个信号,变量和端II日勺定义都要有注释

R24.规定每个进程使用“--------”隔开。假如一种功能模块由几种进程构成,使

用”-*****力

R25.推荐对于•内部表,注释阐明表的构成、表的内容及作用

R26.规定用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格

R27.推荐每行字符数推荐不不小于90,最大不能超过12。

R28.规定模块端口每行定义一种.根据端口功能进行辨别,类间用空行分升

R29.推荐调用模块便用“=>”方式进行端口映射,总线到总线映射时(xdowntoy)

要写金

R30.规定调用模块进行端口实例时,一行代码只实例一种信号。次序必须与原模块

保持一致

R31.规定功能集中或有很强口勺有关性的变量信号申明放在一起,类间用空行或注释

分开

R32.规定端口、信号、变量定义需要对齐,端II实例化需要对死

R33.规定运算符与信号之间必须有空格分开

设计规范

R34.规定全局更位信号使用器件提供的全局信号管脚

R35.推荐当采用异步复位时,推荐使用同步释放的方式

R36.规定每个输出管脚和内部定义U勺信号都应当通过复位信号赋初值

R37.推荐全局时钟输入在管脚够用日勺状况下必须使用器件全局时钟输入管脚

R38.推荐尽量不要在设计中对同•时钟的上升沿和下降沿混合使用,提议使用上升

沿,可以考虑使用高频时钟替代时钟沿的混用

R39.推荐防止使用内部的J产生口勺信号(如分频信号)作为时钟信号

R40.规定假如一定便用分频时钟日勺话,必须使用全局布线资源。

R41.规定防止使用门控时姓

R42.推荐FPGA的输入时钟至少有一种当地时钟,用作CPU接口或监控时钟。

R43.推荐逻辑控制推荐使用状态机实现

R44.规定状态机H勺各个状态,使用参数表达

R45.推荐状态机编码:在速度可以满足规定的状况下,不推荐使用onehot编码;

进行二进制编码且状态机口勺处理流程比较单一时,推荐使用格雷码。

R46.规定并行信号总线,假如与采样时钟异步,必须进行两次采样比较,才能作为

采样U勺成果使用

R47.规定对与时钟异步的信号进行沿检测,需要先采样该信号,再对该信号的采样

信号进行沿检测

R48.规定对于异步信号,必须先进行同步,不能直接使用。

R49.推荐顶层文献只作为内部模块的互联,一般不再包括逻辑

R50.推荐内部模块间端11尽量防止使用inout类型端11

R51.规定所有端11严禁使用buffer类型端11

R52.规定异步进程的敏感列表中一定要列全所有敏感信号

R53.推荐使用括号表达优先级

R54.推荐使用参数化设计

R55.规定所有预留输入管脚与起来送到一种垃圾输出管脚;所有预留输出管脚根据

系统规定输出无效电平

R56.规定计数器(signal)按2时整多次幕方式定义,使用时,注意对不用状态口勺

处理

R57.推荐模块划分应当以功能为原则

R58.推荐模块划分辨别面积敏感和速度敏感的部分,将它们分在不一样模块

R59.推荐提议每个进程只处理一种信号或只处理一组时序亲密有关的信号

R60.规定组合逻辑中,每一种if语句,必须有一和else语句。假如else不会发生,

更不进行操作,else条件E加上空语包

R61.推荐if嵌套不适宜太多

设计常识

R62.推荐if和case语句

R63.推荐状态机11勺设计

R64.推荐流水线操作

R65.规定顶层模块的输入输出端口信号的J命名采用10portname的方式。

5.规范

本规范分为书写规范、设计规范以及其他设计注意事项,下面分别进行阐明。

5.1.书写规范

5.1.1.命名规范

R1.一种文献只包括一种模块,文献命名、模块命名、实体命名必须相似。文献名必须小写。

级别:规定

阐明:文献类型为.Vhd.假如文献名与模块名不一致,有些编译器不能识别,并且名字不i致,也

不利于将文献与模块对应,不利于文献H勺管理。

示例:请参阅例:文献模块命名。

R2.顶层文献命名方式使用器件型号与_top结合。第二层文献后缀使用.module,第三层文献使用

_block,第四层之后不做定义。

级别:规定

阐明:一般顶层文献命名使用器件名加工程名再加“_tcp”,如“xc3sl000bga456_rru_top",第二层

文献使用'[module”,如“ad5320_module",第三层文献使用“_block",如"sync_corr_block”。

假如是最基本的元件,如DPRAM、FIFO等,按照DPRAM、FIFO命名规则为优先。

R3.第二层模块使用功能进行划分,第二层文献下面的文献命名第一种单词需要与第二层文献一致。

级别:规定

阐明:逻辑模块使用功能进行划分,为了每一种模块的文献按照次序排列在一起,以便文献管理,需

要该模块的文献命名所有使用相似口勺单词作为第一种单词。如

R4.代码编写之前,以文档的方式,进行命名约定。

级别:推荐

阐明:命名约定包括模块命名、端口信号命名等。

R5.命名要有实际意义。

级别:规定

阐明:具有一定意义R勺命名比写上好儿行日勺注释要好得多。

示例:如同步模块syncjnodule,同步模块中II勺有关子模块sync_corr_block。

R6.命名标识符的首字符必须是字母,包括多种单词的标志符单词之间使用下划线分开。信号、变

量等的I命名最终字符也一定规定是字母,中间时可以是数字或者其他合法符号。

级别:规定

阐明:由于某些综合工具对于总线类型的信号,综合H勺成果为总线名加上数字编号。假如信号/变量

名最终一种字母也使用数字的话,轻易混扰。

R7.模块、信号、变量等的命名不不小于64个字符

级别:规定

阐明:太长的命名不以便阅读。

R8.实体,构造名用大写标识

级别:推荐

阐明:使用大写轻易与一般的信号端口辨别。

R9.行为级、构造级的构造命名分别以“BEH_实体名”和“STR_实体名”辨别。假如是混合使用,

或者是分不清使用了那一种构造,那么就是用“ARC一实体名”命名.

级别:推荐

R10.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM

作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命

名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以

ADD作后缀;减法模块命名以SUB作后缀。

级别:规定

示例:如大小为512X8口勺双口RAM(其中512为数据深度,8为数据宽度),命名为Xx_512x8_dpram,

调用时,例化名可认为U_xx_512x8_dpram,其中xx阐明双口RAM的作用。

R11.模块实例化时,采用'Un_xx_元件名'标识,cell实例化时使用'Mn_xx_元件名'标识。

级别:推荐

阐明:由于综合、布线工具的工具,一般都将使用实例标志输出汇报,假如没有表达模块名字,

不利于阅读汇报。其中n表达多次实例化的编号,xx表达模块调用的特性(如用途等)。假

如只调用一次,那么就不必使用数字,直接就是'U_xx_元件名'

示例:如HDLC发送模块hdlc_lrans,调用时例化名可认为:UO_hirs_hdlc_trans,Ul_el_hdlc_trans;

对于三态输出单元tri,调用时例化名可认为M_cpuio_tri<)

R12.模块内部定义的信号、变量采用首字母大写命名。首字母符合阐明的规定。

级别:规定

阐明:首字符规定如下表:

例子说明

信号S_cpu_addr信号使用“s_”开头

变量V_data_buf变量使用“v_”开头

常量C_rssi_addr常量使用“c_”开头

数组A_rssi数组使用“A_”开头

R13.非顶层模块端口信号命名方式采用I_portname、O_portname分别对应输入、输出端口信号。

级别:规定

阐明:表达输入:“0_”表达输出。

R14.顶层模块端口信号命名规定与原理图命名一致或者是有关意义的英文单词或者字母。

级别:规定

阐明:由于顶层文献口勺端口就是外部管脚,假如与原理图命名不一致,不利于理解模块与其他器件

口勺连接关系。

R15.时钟信号必须用后缀“_clk”进行命名。

级别:规定

阐明:假如设计当中包括多种时钟,可以加上根据时钟日勺频率等特性阐明,之间如下划线分开,如

模块内部的时钟信号采用I_xx_clk(其中XX代表时钟日勺特性),如I」5_36M_cl4表达15.36MHz

的I时钟信号。

示例:请见例:时钟命名

R16.对于微处理器接口的寄存器,必须包括reg标志。用下划线分开该寄存器功能特性。

级别:规定

示例:如一种版本口勺寄存器命名为:S_vorsion_reg0

R17.对于输入管脚时钟采样同步的信号命名规定后缀加“_buf”表达。多次采样加数字辨别。

级别:规定

示例:多次采样,如:第1次采样命名为S_portname_lbuf;第2次采样命名为:S_portname_2buf;

依次类推。

R18.某些常用的基本信号按阐明统一后缀命名。

级别:规定

阐明:如下列出的常用H勺信号缩写,作为同类信号的后缀。

信号类型后缀

时钟信号elk

系统复位信号rst

数据总线data

地址总线addr

读使能rd

写使能wr

中断信号int

写指针wp

读指针rp

计数器ent

寄存器reg

祈求信号req

应答信号ack

R19.多比特信号,应当使用相似的比特次序,都采用downto描述。

级别:规定

阐明:有助于代码的)阅读

R20.VHDL的保留字用小写。

级别:规定

R21.调用IEEE原则库时,“IEEE”用大写,其他用小写。

级别:规定

示例:如:libraryIEEE;

useIEEE.std_logic_l164.al1;

5.1.2.注释规范

R22.每个VHDL源文献应当在文献头注释文献的基本信息。

级别:规定

阐明:每个VHDL源文献应在开始处注明模块名称、引用模块(顶层模块中不需要阐明引用模块)、

功能描述、设计时间及版权信息,设计人、修改记录等。顶层模块需指出使用口勺逻辑器件

示例:请参阅例:文献头注释或代码模板。

R23.每个信号,变量和端口的定义都要有注释。

级别:推荐

阐明:对每个信号,变量和端口的作用作个简朴阐明。

R24.每个进程使用“--------”隔开。假如一种功能模块由几种进程构成,使用”一*****”隔开。

级别:规定

阐明:增长代码的I可读性

示例:请参阅例:进程间隔注释或代码模板。

R25.对于内部表,注释阐明表的构成、表的内容及作用。

级别:推荐

阐明:加上注释可以增长对表的理解。

5.1.3.其他书写规范

R26.用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格。

级别:规定

阐明:用缩进方式使得代码有层次感,使代码日勺整洁、美观,便于阅读。由于TAB键在不•样编辑

器中解释不一定相似,为了防止不一样编辑器下缩进混乱,不能使用TAB键

提议:为了编写程序H勺以便,可以使用UtraLedil等编辑工具,使用TAB键进行编写程序,然后将

TAB键转化为空格键,这样,就可以有TAB键的以便,也防止了缩进的问题;

R27.每行字符数推荐不不小于90,最大不能超过120。

级别:推荐

阐明:以便于在不一样H勺计算机上阅读代码,不需要进行横向移屏才可以阅读。

R28.模块端口每行定义一种。根据端口功能进行辨别,类间用空行分开。

级别:规定

阐明:端口分类方式根据实际状况决定,只要利于进行端口的理解就可以。

R29.调用模块使用“券”方式进行端口映射,总线到总线映射时(xdowntoy)要写全。

级别:规定

阐明:有助于代码的阅读和查错。

R30.调用模块进行端口映射时,一行代码只映射一种信号。次序必须与原模块保持一致

级别:规定

阐明:有助于代码的阅读。

R31.功能集中或有很强的有关性的变量信号申明放在一起,类间用空行或注释分开。

级别:规定

阐明:有助于代码的阅读。

示例:请见例:变量例号申明

R32.端口、信号、变量定义需要对齐;模块实例化时,端口映射需要对齐。

级别:规定

阐明:有助于代码的阅读。

示例:请见例:信号端口定义对齐

R33.运算符与信号之间必须有空格分开

级别:规定

阐明:有助于代码的阅读。

示例:如:S_a<=S_b+S_c;

5.2.设计规范

5.2.1.复位

R34.全局复位信号使用器件提供的全局信号管脚

级别:规定

阐明:全局信号使用全局信号管脚。

R35.当采用异步复位时,推荐使用同步释放的方式。

级别:推荐

阐明:这种方式可以具有异步复位的长处,同步可以防止异步复位口勺缺陷。

示例:请参阅:异步复位的同步释放。

R36.每个输出管脚和内部定义的信号都应当通过复位信号赋初值

级别:规定

阐明:防止系统上电进入不稳定工作状态。

5.2.2.时钟

R37.全局时钟输入在管脚够用的状况下必须使用器件全局时钟输入管脚

级别:推荐

阐明:保证时钟信号具有最小Skew,,

R38.尽量不要在设计中对同一时钟的上升沿和下降沿混合使用,提议使用上升沿,可以考虑使用高

频时钟替代时钟沿的混用;

级别:推荐

R39.防止使用内部的产生的信号(如分频信号)作为时钟信号

级别:推荐

阐明:由于这些信号并非全局信号,轻易导致抵达各寄存器的时间不一致。提议考虑内部分频信号

作为控制信号使用

示例:请见例:分频时钟时实现措施

R40.假如一定使用分频时钟的话,必须使用全局布线资源。

级别:规定

阐明:使用全局布线资源可以减少分频时钟信号抵达各寄存器时间H勺偏差。对于Xilinx器件,可以

使用BUFG驱动。

R41.防止使用门控时钟

级别:规定

阐明:门控时钟轻易产生毛刺。提议考虑内部信号作为控制信号使用

示例:请见例:门控时钟H勺实现措施

R42.FPGA的输入时钟至少有一种当地时钟,用作CPU接口或监控时钟。

级别:推荐

阐明:这是由于当地时钟比较稳定,不会受到其他单板的影响。当外部时钟不稳定或丢失时,保证

FPGA时可测可维性。

5.2.3.状态机

R43.逻辑控制推荐使用状态机实现

级别:推荐

阐明:状态处理的过程比较清晰,以便理解

R44.状态机的各个状态,使用参数表达

级别:规定

阐明:状态机的状态使用参数表达,可以提高代码的可读性。

示例:可以参阅例:状态机状态参数表达

R45.状态机编码:在速度可以满足规定的状况下,不推荐使用one_hot编码;进行二进制编码且状

态机的处理流程比较单一时,推荐使用格雷码。

级别:推荐

阐明:one_hot必须考虑未用状态的处理,轻易引起某些错误;

5.2.4.异步信号

R46.并行信号总线,假如与采样时钟异步,必须进行两次采样比较,才能作为采样的成果使用。

级别:规定

阐明:防止采到错误的数据。

示例:请参阅:并行数据H勺异步采样

R47.对与时钟异步的信号进行沿检测,需要先采样该信号,再对该信号时采样信号进行沿检测

级别:规定

阐明:防止保持时间/建立时间局限性引起错误。

示例:请参阅例:异步信号的沿检测

R48.对于异步信号,必须先进行同步,不能直接使用。

级别:规定

阐明:由于当异步的信号与触发器日勺时钟的沿很靠近的状况下,就有也许产生在该时钟周期有些触

发器可以满足建立时间H勺规定而产生翻转,有些还没有满足建立时间H勺规定而没有变化,出现

错误的成果。

示例:请参阅例:异步的信号驱动多种触发器

5.2.5.其他设计规范

R49.顶层文献只作为内部模块的互联,一般不再包括逻辑。

级别:推荐

R50.内部模块间端口不推荐使用inout类型端口。

级别:规定

阐明:使用inout类型端LJ轻易引入错误。

R51.所有端口严禁使用buffer类型端口

级别:规定

阐明:使用buffer类型端口轻易引入某些不轻易排查的错误。

示例:怎样使用。ut端口类型实现buffer端口类型请参阅例:buffer端II类型的实现

R52.异步进程的敏感列表中一定要列全所有敏感信号。

级别:规定

阐明:防止前后仿真的不一致,防止出现*arning。次序按照在进程中出现的先后次序排列。

R53.使用括号表达优先级。

级别:推荐

阐明:括号可以用于定义逻辑分组,从而实现控制设计的构造,提高逻辑的效率。

示例:请参阅例:括号的使用。

R54.使用参数化设计。

级别:推荐

阐明:设计当中使用常数而不直接使用数字,减少维护修改的工作量和难度。

示例:请参阅:参数化设计。

R55.所有预留输入管脚与起来送到一种垃圾输出管脚;所有预留输出管脚根据系统规定输出无效电

平。

级别:规定

阐明:防止出现管脚锁定出错或将影响其他连接到该信号线的器件II勺工作;其他无用信号不要引入

module内部,尽量防止在elaborate和compile时产生warning,干扰错误定位。防止系统

存在隐患,工作不正常。

R56.计数器(signal)按2时整多次塞方式定义,使用时,注意对不用状态的处理。

级别:规定

R57.模块划分应当以功能为原则

级别:推荐

阐明:一般一种模块实现•种功能,以便模块日勺反复应用

R58.模块划分辨别面积敏感和速度敏感的部分,将它们分在不一样模块

级别:推荐

阐明:不一样规定的模块所规定的约束也不一样样,以便给模块加约束。

R59.提议每个进程只处理一种信号或只处理一组时序亲密有关的信号

级别:推荐

阐明:以便维护与修改

K60.组合逻辑中,每一种if语句,必须有一种else语句。假如else不会发生,或不进行操作,else

条件下加上空语句

级别:规定

阐明:易于查错

R61.if嵌套不适宜太多

级别:推荐

阐明:以免引入太大的延时

5.3.设计常识

R62.if和case语句

级别:推荐

阐明:

1.ifelse语句有隐含的优先级,case语句没有优先级

2.一般状况下,if语句延时比较大,使用逻辑面积比较小,case语句延时比较小,使用逻辑面积

比较大;使用时根据面积和速度日勺需求进行选择

R63.状态机的设计

级别:推荐

阐明:

1.状态机编码方式有二进制编码,。nc-hot编码,枚举编码。其中二进制编码需要较少日勺寄存器,

不过需要对状态机译码,因此需要比较多H勺组合逻辑。One-hot需要比较多的寄存器,不过状

态之间需要的组合逻辑资源比较少,并且由于状态之间的组合逻辑减少,可以提高逻辑的速度。

2.当状态机日勺处理流程比较单一,在使用二进制编码日勺时候,提议考虑格雷码的方式;安排状态机的

处理流程

3.对于。nehot设计,由于存在大量的未使用状态,假如使用whenothers状态跳转实现实状况态

机的容错性,也许消耗的逻辑资源比较多。因此提议,在使用onehoi设计时,状态比较多(不

小于8位),whenothers不做容错性跳转,使用外加检测状态机有效位检测来进行容错处理,

如当检测到状态机当中的1超过1个,就将状态机好位或其他保护操作;此外,在速度满足规定

的I条件下,不推荐使用。ne_hot编码。

4.使用二进制编码时,提议在whenothers实现容错跳转。注意,在Synplify中使用状态机综合

时,会把容错机制优化掉。

5.状态机提议使用同步实现。

R64.流水线操作

级别:推荐

阐明:

1.将一种周期处理口勺逻辑进行分解,在多种周期内实现,就是流水线操作。

2.流水线操作可以提高逻辑的JT作频率。由于触发器之间存在多级组合逻辑,其延时为源触发器的

延时、多级组合逻辑的延时、目口勺触发器的建立时间口勺总和。假如多级组合逻辑的级数太大,使

延时增长,限制了触发器的工作时钟频率上限。

3.此时,将组合逻辑分解,在其中加触发器,减少触发器之间的延时,因此提高了时钟频率上限。

4.流水线操作,增长了寄存器资源日勺需求,FPGA的寄存器资源比较丰富,在一种逻辑可以在几种

时钟周期内完毕口勺条件下,可以考虑使用该措施提高工作时钟频率。

R65.顶层模块的输入输出端口信号的命名采用IO_portname的方式。

级别:规定

阐明:“10_”表达输入输出。

6.附录

6.1.例子阐明(规范详细解释)

例1.文献模块命名

文献名是ser_tsp.vkd,那么文献内部实体的命名就是

entitySER_TSPis

port(

);

endSER.TSP;

architectureARCSERTSPofSERTSPis

endARCSERTSP;

例2.时钟命名

解释

I_16chip_clk16chip时钟信号;

I_sys_clk系统时钟

I_66_7M_clk假如时钟信号是66.7MHz,那么就使用66_7M表达,小数点

后最多保留3位。使用频率标识与chip时钟进行辨别:

,G'表达GHz;

'M'表达MHz;

'K'表达KHz;

表达Hz;

I_pp2sPP2s必须使用‘pp2s'作为结尾,最佳是完全使用。

I_16chip_ph90_16chip,相位90度,

elk90度是:'ph90';

180度是:<phl80,;

270度是:<ph270,;

例3.文献头注释

-*****************************************************************************

—MODULENAME:/\RM_IKTERFACE_MODULE.VHD

-Calledby:

-Description:

-Version:0.1

-IC:XC3S1000-4FG456

-Copyright2023byI.ONGJTANRIAO,AlIrightsreserved.

-Author:LONGJ1ANB1A0

-Note:

-Update:

-*****************************************************************************

例4.进程间隔注释

-*****************************************************************************

-功能模块注释

-进程注释

process

endprocess;

一进程注释

process

endprocess;

——********************************************糅*******************************

例5.信号端口定义对齐

信号定义

signalS_clkstd_logic;

signalS_rst:std_logic;

端口定义:

port(

1elk:instdlogic;

0elk:outstdlogic;

元件或模块调用:

componentSER_TSP

port(I_16_clk:instd_logic;一注释

I32_clk:instd_logic;一注释

Irst:instd_logic;一注释

0_data:outstd_logic_vector(7downto0);一注释

0begin:outstd_logic-注释

endcomponent;

元件或模块端口映射

UO_ser_tsp:SER_TS?

portmap(

I_16_clk=>I」6_clk,--注释

I_32_clk=>I_32_clk,一注释

I_rst=>Irst,一注释

□data(7downto0)=>S_data(7downto0),一注释

0_begin=>S_begin-注释

);

端口名要对齐。冒号要对齐,in或。ut类属要对齐,矢量定义要对齐。

例6.异步复位的同步释放

异步复位IJ勺好处为:异步复位可以直接运用FPGA内部寄存器的硬复位管脚来复位寄存器,

同步复位信号不再参与到组合逻辑电路中,不影响逻辑口勺速度。但异步复位也会引来某些问题,

当复位信号恰好在时钟沿附近释放,寄存器的输出将出现亚稳态。

可以采用异步复位的同步释放方式来防止。如下:

process(I_sys_rst,l_sys_clk)

begin

if(I_sys_rst='O')then

S_master_rst<='O';

S_rst_buf<='O';

elsifrisingedge(I_sysc1k)then

S_rst_buf<='1';

if(S_rst_buf=*I*)then

Smas:errst<='1

endif;

endif;

endprocess;

process(Smasterrst,Isysclk)

begin

if(S_master_rst='O')then

--开始复位。。。.

elsifrisingedge(I_sys_c1k)then

一-正常工作

endif;

endprocess;

例7.分频时钟的实现

如下:

S_clk_div是I_clk四分频产生口勺信号,高电平脉冲为一种I_clk周期,可以采用如下H勺语句:

正例:

ifrising_edge(I_c1k)then

ifS_clk_div='1'then

♦••

endif;

endif;

不使用如下语句:

反例:

ifrising_edge(S„clkdiv)then

endif;

例8.门控时钟的实现

不推荐直接使用门控时钟,如下例,系统工作不稔定:

反例:

S_clk_con<=I_clkandI_clk_ctl;

Process(Irst,Selkcon)

begin

ifI_rst='O'then

0_do<='O';

elsifrisingedge(Selkcon)then

0_do<=I_di;

endif;

endprocess;

此时为了防止产生毛刺,规定I_clk_ctl在时钟的I_di有效期间维持稳定。

推荐改为下血H勺方式;

正例:

process(Irst,1elk)

begin

ifI_rst='O'then

Odo<='O';

elsifrisingedge(Iclk)then

ifI_clk_ctl=Tthen

0_do<=I_di;

endif;

endif;

endprocess;

这时只需要I_clk_ctl在I_clk的I时钟上升沿维持稳定就可以。

例9.状态机状态参数表达

entitydemois

poit(...),

end;

architectureARCDEYOofDEMOis

signalS_disbus_st:std_logic_vector(1downto0);―signalofbusstate

constantCidlest:sld」ogic_vector:="00";一注释

constantCBUSYST:std_1ogic_vector:="10";一注释

constantC_N()KM?\L_ST:std_1ogic_vector:="11";一注释

constantC_ENDST:std_logic_vector:="10";一注释

例10.并行数据的异步采样

如下例:

反例:

signalS_di_buf:std_logic_vector(7downto0);

process(1rst,1elk)

begin

ifI_rst=,C1*then

S_di_buf<=x〃00”;

elsifrisirgedge(I_c1k)then

Sdituf(7downto0)<=I_di(7down:o0);

endif;

endprocess;

process(I_rst,I_clk)

begin

ifI_rst=,Cthen

0_do<=,0,;

elsifrisirg_edge(I_clk)then

ifSdibuf=x"01"then

ojo<=>r;

else

null;

endif;

endif;

endprocess;

该程序本来是但愿检测到输入I_di为1的时候,给出0_d。标志信号为1,不过由于I_di与

I_clkB勺不一样步,就会导致如下口勺仿真成果:

JLJ

I_rst1

I_clk1

I_di

H00_00_____IOFX_____

S_di_bufH0000X01I___

0_do1

分析原因,重要是I_di的最低位由0变1的时间比其他位日勺信号线块,因此在由0到F的)变化过

程中,会出现一种很短时间的II,时钟上升沿恰好采样到这个1,导致错误。

假如采用两次采样去抖的方式:如下:

正例:

signalS_di_lbuf:std_logic_vector(7downto0);

signalS_di_2buf:stdlogic_vector(7downto0);

process(I_rst,I_clk)

begin

ifI_rst=,O'then

S_di_lbuf<=x"00";

S_di_2buf<=x"00";

elsifrising_edge(I_clk)then

S_di_lbuf(7downto0)<=I_di(7clownto0);

ifSdiIbcf(7downto0)=1di(7downto0)then

Sdi2buf<=SdiIbuf;

else

null;

endif;

endif;

endprocess;

process(Irst,I_clk)

begin

ifI_rst=>0*then

0_do<='O';

elsifrisingedge(I_c1k)then

ifS_di_2buf(7downto0)=x"01"then

0_do<=r;

else

null;

endif;

endif:

endprocess;

设计当中,假如需要采样的并行信号,与采样时钟异步.有效时间必须设计为超过一种时钟周期才能

可靠采样。

例11.异步信号的沿检测

如下例子阐明异步信号沿检测在不进行同步日勺状况下丢失沿的原因:

反例:

signalS_di_buf:std_logic;

process(l_rst,1elk)

begin

ifI_rst=,C*then

0do7'0,;

S_di_buf<=f;

elsifrisirg_edge(I_clk)then

S_di_buf<=I_di;

ifI_di=0*andS_di_buf=1*then

0_do<=*1>;

else

0_do<='O';

endif;

endif;

endprocess;

该进程实现的功能是检测到l_diH勺下降沿,0_do输出高电平。该进程实现如下:

假设I_di->sl的延时为Tl,I_di->S_di_buf的延时为T2,与门延时为T3,触发器的J建立时

间为Tsetup,输入I_di与时钟上升沿的时间间隔为T。如下:

O_do

当T>Tsetup,则在时钟沿后T2输出S_di_buf为0,I_di通过反向器延时T1产生SI,S1与

S_di_buf通过与门就产生S3的脉冲,该脉冲与输入的延时为T1+T3,与时钟的时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论