首页 VHDL代码设计规范

VHDL代码设计规范

举报
开通vip

VHDL代码设计规范 文件会签页 文件标题 VHDL编码规范(试用版) 文件编号 授权 分发清单 加盖受控章 签名 签名 编制 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 ...

VHDL代码设计规范
文件会签页 文件标题 VHDL编码 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 (试用版) 文件编号 授权 分发清单 加盖受控章 签名 签名 编制 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 审核 部门 部门 签名 签名 审核 审核 部门 部门 审批 签名 批准 签名 生效日期: 文件历史记录 文件编号 现行版本 V1.0 文件标题 VHDL代码 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 规范 文件履历 版次 编制 日期 更改内容(条款) VHDL代码设计规范 (评审稿) 文件编号: 编 制: 审 核: VHDL代码设计规范 (定稿) 文件编号: 编 制 : 审 核 : 可靠性审核: 标准化: 批 准 : 目 录 11. 目的 2. 范围 1 3. 术语说明 1 4. 规范列表 1 5. 规范 3 5.1. 书写规范 3 5.1.1. 命名规范 3 5.1.2. 注释规范 5 5.1.3. 其他书写规范 6 5.2. 设计规范 6 5.2.1. 复位 6 5.2.2. 时钟 7 5.2.3. 状态机 7 5.2.4. 异步信号 7 5.2.5. 其他设计规范 8 5.3. 设计常识 9 6. 附录 9 6.1. 例子说明(规范详细解释) 9 6.2. 代码模板 18 目的 规范VHDL的设计风格,保证代码的可读性、重用性及与现有EDA工具的一致性,从而形成对设计代码的标准化管理。 范围 本标准 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 了VHDL代码设计规范。 本标准适用于COMBA公司技术中心。 术语说明 本规范使用的术语解释如下: 级别:指该规则遵循的级别,有两个级别,分别为推荐和规定。 推荐:表示在一般情况下必须遵循该规则。 规定:表示必须严格遵守该规则。 说明:对此规则或准则的必要的解释。 示例:对此规则举例进行说明,示例分为正例和反例。 正例:对此规则或准则给出的正确示例。 反例:对此规则或准则给出的反面示例。 规范列表 编号 级别 规 则 书写规范 规定 一个文件只包含一个模块,文件命名、模块命名、实体命名必须相同。文件名及其后缀必须小写. 规定 顶层文件命名方式使用器件型号、工程名与_top结合。第二层文件后缀使用_module,第三层文件使用_block,第四层之后不做定义。 规定 模块使用功能进行划分,第二层文件及下面的模块命名,第一个单词需要与第二层文件一致。 推荐 代码编写之前,以文档的方式,进行命名约定 规定 命名要有实际意义。 规定 命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。信号、变量等的命名最后的也一定要求是字母,中间的可以是数字或者其他合法符号。 规定 模块、信号、变量等的命名不大于64个字符 推荐 实体,结构名用大写标识 推荐 行为级、结构级的结构体命名分别以“BEH_实体名”和“STR_实体名”区分。如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名. 规定 单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。 推荐 模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。 规定 模块内部定义的信号、变量采用首字母大写命名。首字母符合说明的要求 规定 非顶层模块端口信号命名方式采用I_portname、O_portname分别对应输入、输出端口信号。 规定 顶层模块端口信号命名要求与原理图命名一致或者是相关意义的英文单词或者字母 规定 时钟信号必须用后缀“_clk”进行命名 规定 对于微处理器接口的寄存器,必须包含reg标志。用下划线分开该寄存器功能特征 规定 对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。多次采样加数字区分 规定 一些常用的基本信号按说明统一后缀命名 规定 多比特信号,应该使用相同的比特顺序,都采用downto描述。 规定 VHDL的保留字用小写 规定 调用IEEE 标准库时,“IEEE”用大写,其余用小写。 规定 每个VHDL源文件应该在 HYPERLINK \l "_文件头注释文件的基本信息。" 文件头注释文件的基本信息 规定 每个信号,变量和端口的定义都要有注释 规定 每个进程使用“--------”隔开。如果一个功能模块由几个进程组成,使用”--*****”隔开。 推荐 对于内部表,注释说明表的组成、表的内容及作用 规定 用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格 推荐 每行字符数推荐不大于90,最大不能超过120 规定 模块端口每行定义一个。根据端口功能进行区分,类间用空行分开 推荐 调用模块使用 “=>”方式进行端口映射,总线到总线映射时(x downto y)要写全 规定 调用模块进行端口实例时,一行代码只实例一个信号。顺序必须与原模块保持一致 规定 功能集中或有很强的相关性的变量信号声明放在一起,类间用空行或注释分开 规定 端口、信号、变量定义需要对齐,端口实例化需要对齐 规定 运算符与信号之间必须有空格分开 设计规范 规定 全局复位信号使用器件提供的全局信号管脚 推荐 当采用异步复位时,推荐使用同步释放的方式 规定 每个输出管脚和内部定义的信号都应该通过复位信号赋初值 推荐 全局时钟输入在管脚够用的情况下必须使用器件全局时钟输入管脚 推荐 尽量不要在设计中对同一时钟的上升沿和下降沿混合使用,建议使用上升沿,可以考虑使用高频时钟替代时钟沿的混用 推荐 避免使用内部的产生的信号(如分频信号)作为时钟信号 规定 如果一定使用分频时钟的话,必须使用全局布线资源。 规定 避免使用门控时钟 推荐 FPGA的输入时钟至少有一个本地时钟,用作CPU接口或监控时钟。 推荐 逻辑控制推荐使用状态机实现 规定 状态机的各个状态,使用参数表示 推荐 状态机编码:在速度可以满足要求的情况下,不推荐使用one_hot编码;进行二进制编码且状态机的处理流程比较单一时,推荐使用格雷码。 规定 并行信号总线,如果与采样时钟异步,必须进行两次采样比较,才能作为采样的结果使用 规定 对与时钟异步的信号进行沿检测,需要先采样该信号,再对该信号的采样信号进行沿检测 规定 对于异步信号,必须先进行同步,不能直接使用。 推荐 顶层文件只作为内部模块的互联,一般不再包含逻辑 推荐 内部模块间端口尽量避免使用inout类型端口 规定 所有端口禁止使用buffer类型端口 规定 异步进程的敏感列表中一定要列全所有敏感信号 推荐 使用括号表示优先级 推荐 使用参数化设计 规定 所有预留输入管脚与起来送到一个垃圾输出管脚;所有预留输出管脚根据系统要求输出无效电平 规定 计数器(signal)按2的整数次幂方式定义,使用时,注意对不用状态的处理 推荐 模块划分应该以功能为原则 推荐 模块划分区分面积敏感和速度敏感的部分,将它们分在不同模块 推荐 建议每个进程只处理一个信号或只处理一组时序密切相关的信号 规定 组合逻辑中,每一个if语句,必须有一个else语句。如果else不会发生,或不进行操作,else条件下加上空语句 推荐 if嵌套不宜太多 设计常识 推荐 if和case语句 推荐 状态机的设计 推荐 流水线操作 规定 顶层模块的输入输出端口信号的命名采用IO_portname的方式。 规范 本规范分为书写规范、设计规范以及其他设计注意事项,下面分别进行说明。 书写规范 命名规范 一个文件只包含一个模块,文件命名、模块命名、实体命名必须相同。文件名必须小写。 级别:规定 说明:文件类型为.vhd。如果文件名与模块名不一致,有些编译器不能识别,而且名字不一致,也不利于将文件与模块对应,不利于文件的管理。 示例:请参阅例:文件模块命名。 顶层文件命名方式使用器件型号与_top结合。第二层文件后缀使用_module,第三层文件使用_block,第四层之后不做定义。 级别:规定 说明:一般顶层文件命名使用器件名加工程名再加“_top”,如“xc3s1000bga456_rru_top”,第二层文件使用“_module”,如“ad5320_module”,第三层文件使用“_block”,如“ sync_corr_block”。如果是最基本的元件,如DPRAM、FIFO等,按照DPRAM、FIFO命名规则为优先。 第二层模块使用功能进行划分,第二层文件下面的文件命名第一个单词需要与第二层文件一致。 级别:规定 说明:逻辑模块使用功能进行划分,为了每一个模块的文件按照顺序排列在一起,方便文件管理,需要该模块的文件命名全部使用相同的单词作为第一个单词。如 代码编写之前,以文档的方式,进行命名约定。 级别:推荐 说明:命名约定包括模块命名、端口信号命名等。 命名要有实际意义。 级别:规定 说明:具有一定意义的命名比写上好几行的注释要好得多。 示例:如同步模块sync_module,同步模块中的相关子模块sync_corr_block。 命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。 级别:规定 说明:由于某些综合工具对于总线类型的信号,综合的结果为总线名加上数字编号。如果信号/变量名最后一个字母也使用数字的话,容易混扰。 模块、信号、变量等的命名不大于64个字符 级别:规定 说明:太长的命名不方便阅读。 实体,结构名用大写标识 级别:推荐 说明:使用大写容易与一般的信号端口区分。 行为级、结构级的结构命名分别以“BEH_实体名”和“STR_实体名”区分。如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名. 级别:推荐 单口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的作用。 模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。 级别:推荐 说明:因为综合、布线工具的工具,一般都将使用实例标志输出 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 ,如果没有表示模块的名字,不利于阅读报告。其中n表示多次实例化的编号,xx表示模块调用的特性(如用途等)。如果只调用一次,那么就不必使用数字,直接就是‘U_xx_元件名’ 示例:如HDLC发送模块hdlc_trans,调用时例化名可以为:U0_hirs_hdlc_trans,U1_e1_hdlc_trans;对于三态输出单元tri,调用时例化名可以为M_cpuio_tri。 模块内部定义的信号、变量采用首字母大写命名。首字母符合说明的要求。 级别:规定 说明:首字符要求如下表: 例子 说 明 信号 S_cpu_addr 信号使用“S_”开头 变量 V_data_buf 变量使用“V_”开头 常量 C_rssi_addr 常量使用“C_”开头 数组 A_rssi 数组使用“A_”开头 非顶层模块端口信号命名方式采用I_portname、O_portname分别对应输入、输出端口信号。 级别:规定 说明:“I_”表示输入;“O_”表示输出。 顶层模块端口信号命名要求与原理图命名一致或者是相关意义的英文单词或者字母。 级别:规定 说明:由于顶层文件的端口就是外部管脚,如果与原理图命名不一致,不利于理解模块与其它器件的连接关系。 时钟信号必须用后缀“_clk”进行命名。 级别:规定 说明:如果设计当中包括多个时钟,可以加上根据时钟的频率等特性说明,之间以下划线分开,如模块内部的时钟信号采用I _xx_clk(其中xx代表时钟的特性),如I_15_36M_clk表示15.36MHz的时钟信号。 示例:请见例:时钟命名 对于微处理器接口的寄存器,必须包含reg标志。用下划线分开该寄存器功能特征。 级别:规定 示例:如一个版本的寄存器命名为:S_version_reg。 对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。多次采样加数字区分。 级别:规定 示例:多次采样,如:第1次采样命名为S_portname_1buf;第2次采样命名为:S_portname_2buf;依次类推。 一些常用的基本信号按说明统一后缀命名。 级别:规定 说明:以下列出的常用的信号缩写,作为同类信号的后缀。 信号类型 后缀 时钟信号 clk 系统复位信号 rst 数据总线 data 地址总线 addr 读使能 rd 写使能 wr 中断信号 int 写指针 wp 读指针 rp 计数器 cnt 寄存器 reg 请求信号 req 应答信号 ack 多比特信号,应该使用相同的比特顺序,都采用downto描述。 级别:规定 说明:有利于代码的阅读 VHDL的保留字用小写。 级别:规定 调用IEEE 标准库时,“IEEE”用大写,其余用小写。 级别:规定 示例:如:library IEEE; use IEEE.std_logic_1164.all; 注释规范 每个VHDL源文件应该在文件头注释文件的基本信息。 级别:规定 说明:每个VHDL源文件应在开始处注明模块名称、引用模块(顶层模块中不需要说明引用模块)、功能描述、设计时间及版权信息,设计人、修改记录等。顶层模块需指出使用的逻辑器件 示例:请参阅例:文件头注释或代码模板。 每个信号,变量和端口的定义都要有注释。 级别:推荐 说明:对每个信号,变量和端口的作用作个简单说明。 每个进程使用“--------”隔开。如果一个功能模块由几个进程组成,使用”--*****”隔开。 级别:规定 说明:增加代码的可读性 示例:请参阅例:进程间隔注释或代码模板。 对于内部表,注释说明表的组成、表的内容及作用。 级别:推荐 说明:加上注释可以增加对表的理解。 其他书写规范 用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格。 级别:规定 说明:用缩进方式使得代码有层次感,使代码的整洁、美观,便于阅读。由于TAB键在不同编辑器中解释不一定相同,为了避免不同编辑器下缩进混乱,不能使用TAB键 建议:为了编写程序的方便,可以使用Utral_edit等编辑工具,使用TAB键进行编写程序,然后将TAB键转化为空格键,这样,就可以有TAB键的方便,也避免了缩进的问题; 每行字符数推荐不大于90,最大不能超过120。 级别:推荐 说明:以便于在不同的计算机上阅读代码,不需要进行横向移屏才能够阅读。 模块端口每行定义一个。根据端口功能进行区分,类间用空行分开。 级别:规定 说明:端口分类方式根据实际情况决定,只要利于进行端口的理解就可以。 调用模块使用 “=>”方式进行端口映射,总线到总线映射时(x downto y)要写全。 级别:规定 说明:有利于代码的阅读和查错。 调用模块进行端口映射时,一行代码只映射一个信号。顺序必须与原模块保持一致 级别:规定 说明:有利于代码的阅读。 功能集中或有很强的相关性的变量信号声明放在一起,类间用空行或注释分开。 级别:规定 说明:有利于代码的阅读。 示例:请见例:变量信号声明 端口、信号、变量定义需要对齐;模块实例化时,端口映射需要对齐。 级别:规定 说明:有利于代码的阅读。 示例:请见例:信号端口定义对齐 运算符与信号之间必须有空格分开 级别:规定 说明:有利于代码的阅读。 示例:如:S_a <= S_b + S_c; 设计规范 复位 全局复位信号使用器件提供的全局信号管脚 级别:规定 说明:全局信号使用全局信号管脚。 当采用异步复位时,推荐使用同步释放的方式。 级别:推荐 说明:这种方式可以具有异步复位的优点,同时可以避免异步复位的缺点。 示例:请参阅:异步复位的同步释放。 每个输出管脚和内部定义的信号都应该通过复位信号赋初值 级别:规定 说明:避免系统上电进入不稳定工作状态。 时钟 全局时钟输入在管脚够用的情况下必须使用器件全局时钟输入管脚 级别:推荐 说明:保证时钟信号具有最小Skew。 尽量不要在设计中对同一时钟的上升沿和下降沿混合使用,建议使用上升沿,可以考虑使用高频时钟替代时钟沿的混用; 级别:推荐 避免使用内部的产生的信号(如分频信号)作为时钟信号 级别:推荐 说明:因为这些信号并非全局信号,容易造成到达各寄存器的时间不一致。建议考虑内部分频信号作为控制信号使用 示例:请见例:分频时钟的实现方法 如果一定使用分频时钟的话,必须使用全局布线资源。 级别:规定 说明:使用全局布线资源可以减少分频时钟信号到达各寄存器时间的偏差。对于Xilinx器件,可以使用BUFG驱动。 避免使用门控时钟 级别:规定 说明:门控时钟容易产生毛刺。建议考虑内部信号作为控制信号使用 示例:请见例:门控时钟的实现方法 FPGA的输入时钟至少有一个本地时钟,用作CPU接口或监控时钟。 级别:推荐 说明:这是因为本地时钟比较稳定,不会受到其他单板的影响。当外部时钟不稳定或丢失时,保证FPGA的可测可维性。 状态机 逻辑控制推荐使用状态机实现 级别:推荐 说明:状态处理的过程比较清晰,方便理解 状态机的各个状态,使用参数表示 级别:规定 说明:状态机的状态使用参数表示,可以提高代码的可读性。 示例:可以参阅例:状态机状态参数表示 状态机编码:在速度可以满足要求的情况下,不推荐使用one_hot编码;进行二进制编码且状态机的处理流程比较单一时,推荐使用格雷码。 级别:推荐 说明:one_hot必须考虑未用状态的处理,容易引起一些错误; 异步信号 并行信号总线,如果与采样时钟异步,必须进行两次采样比较,才能作为采样的结果使用。 级别:规定 说明:避免采到错误的数据。 示例:请参阅:并行数据的异步采样 对与时钟异步的信号进行沿检测,需要先采样该信号,再对该信号的采样信号进行沿检测 级别:规定 说明:避免保持时间/建立时间不足引起错误。 示例:请参阅例:异步信号的沿检测 对于异步信号,必须先进行同步,不能直接使用。 级别:规定 说明:因为当异步的信号与触发器的时钟的沿很接近的情况下,就有可能产生在该时钟周期有些触发器能够满足建立时间的要求而产生翻转,有些还没有满足建立时间的要求而没有变化,出现错误的结果。 示例:请参阅例:异步的信号驱动多个触发器 其他设计规范 顶层文件只作为内部模块的互联,一般不再包含逻辑。 级别:推荐 内部模块间端口不推荐使用inout类型端口。 级别:规定 说明:使用inout类型端口容易引入错误。 所有端口禁止使用buffer类型端口 级别:规定 说明:使用buffer类型端口容易引入一些不容易排查的错误。 示例:如何使用out端口类型实现buffer端口类型请参阅例:buffer端口类型的实现 异步进程的敏感列表中一定要列全所有敏感信号。 级别:规定 说明:避免前后仿真的不一致,避免出现warning。顺序按照在进程中出现的先后次序排列。 使用括号表示优先级。 级别:推荐 说明:括号可以用于定义逻辑分组,从而实现控制设计的结构,提高逻辑的效率。 示例:请参阅例:括号的使用。 使用参数化设计。 级别:推荐 说明:设计当中使用常数而不直接使用数字,减少维护修改的工作量和难度。 示例:请参阅:参数化设计。 所有预留输入管脚与起来送到一个垃圾输出管脚;所有预留输出管脚根据系统要求输出无效电平。 级别:规定 说明:避免出现管脚锁定出错或将影响其它连接到该信号线的器件的工作;其它无用信号不要引入module 内部,尽量避免在elaborate 和compile 时产生warning,干扰错误定位。避免系统存在隐患,工作不正常。 计数器(signal)按2的整数次幂方式定义,使用时,注意对不用状态的处理。 级别:规定 模块划分应该以功能为原则 级别:推荐 说明:一般一个模块实现一个功能,方便模块的重复应用 模块划分区分面积敏感和速度敏感的部分,将它们分在不同模块 级别:推荐 说明:不同要求的模块所要求的约束也不一样,方便给模块加约束。 建议每个进程只处理一个信号或只处理一组时序密切相关的信号 级别:推荐 说明:方便维护与修改 组合逻辑中,每一个if语句,必须有一个else语句。如果else不会发生,或不进行操作,else条件下加上空语句 级别:规定 说明:易于查错 if嵌套不宜太多 级别:推荐 说明:以免引入太大的延时 设计常识 if和case语句 级别:推荐 说明: if-else语句有隐含的优先级,case语句没有优先级 一般情况下,if语句延时比较大,使用逻辑面积比较小,case语句延时比较小,使用逻辑面积比较大;使用时根据面积和速度的需求进行选择 状态机的设计 级别:推荐 说明: 状态机编码方式有二进制编码,one-hot编码,枚举编码。其中二进制编码需要较少的寄存器,但是需要对状态机译码,因此需要比较多的组合逻辑。One-hot需要比较多的寄存器,但是状态之间需要的组合逻辑资源比较少,而且因为状态之间的组合逻辑减少,能够提高逻辑的速度。 当状态机的处理流程比较单一,在使用二进制编码的时候,建议考虑格雷码的方式安排状态机的处理流程 对于one hot设计,由于存在大量的未使用状态,如果使用when others状态跳转实现状态机的容错性,可能消耗的逻辑资源比较多。因此建议,在使用one hot设计时,状态比较多(大于8位),when others不做容错性跳转,使用外加检测状态机有效位检测来进行容错处理,如当检测到状态机当中的1超过1个,就将状态机复位或其它保护操作;另外,在速度满足要求的条件下,不推荐使用one_hot编码。 使用二进制编码时,建议在when others实现容错跳转。注意,在Synplify中使用状态机综合时,会把容错机制优化掉。 状态机建议使用同步实现。 流水线操作 级别:推荐 说明: 将一个周期处理的逻辑进行分解,在多个周期内实现,就是流水线操作。 流水线操作可以提高逻辑的工作频率。因为触发器之间存在多级组合逻辑,其延时为源触发器的延时、多级组合逻辑的延时、目的触发器的建立时间的总和。如果多级组合逻辑的级数太大,使延时增加,限制了触发器的工作时钟频率上限。 此时,将组合逻辑分解,在其中加触发器,降低触发器之间的延时,因此提高了时钟频率上限。 流水线操作,增加了寄存器资源的需求, FPGA的寄存器资源比较丰富,在一个逻辑可以在几个时钟周期内完成的条件下,可以考虑使用该方法提高工作时钟频率。 顶层模块的输入输出端口信号的命名采用IO_portname的方式。 级别:规定 说明:“IO_”表示输入输出。 附录 例子说明(规范详细解释) 文件模块命名 文件名是ser_tsp.vhd,那么文件内部实体的命名就是 entity SER_TSP is port( …… ) ; end SER_TSP; ---------------------------------------- architecture ARC_SER_TSP of SER_TSP is …… end ARC_SER_TSP; 时钟命名 解释 I_16chip_clk 16chip时钟信号; I_sys_clk 系统时钟 I_66_7M_clk 如果时钟信号是66.7MHz,那么就使用66_7M表示,小数点后最多保留3位。使用频率标记与chip时钟进行区分: ‘G’表示GHz; ‘M’表示MHz; ‘K’表示KHz; ‘Hz’表示Hz; I_pp2s PP2s必须使用‘pp2s’作为结尾,最好是完全使用。 I_16chip_ph90_clk 16chip,相位90度, 90度是:‘ph90’; 180度是:‘ph180’; 270度是:‘ph270’; 文件头注释 --***************************************************************************** --MODULE NAME:ARM_INTERFACE_MODULE.VHD --Called by: --Description: --Version:0.1 --IC:XC3S1000-4FG456 --Copyright 2003 by LONGJIANBIAO,All rights reserved. --Author:LONG JIANBIAO --Date:2005.06.14 --Note: --Update: --***************************************************************************** 进程间隔注释 -***************************************************************************** -- 功能模块注释 ------------------------------- -- 进程注释 ------------------------------- process …… end process ; ------------------------------- --进程注释 ------------------------------- process …… end process ; ………… --***************************************************************************** 信号端口定义对齐 信号定义 signal S_clk :std_logic; signal S_rst :std_logic; 端口定义: port( I_clk :in std_logic; O_clk :out std_logic; ); 元件或模块调用: component SER_TSP port( I_16_clk : in std_logic ; --注释 I_32_clk : in std_logic ; --注释 I_rst : in std_logic ; --注释 O_data : out std_logic_vector(7 downto 0) ; --注释 O_begin : out std_logic --注释 end component ; 元件或模块端口映射 U0_ser_tsp : SER_TSP port map( I_16_clk => I_16_clk, --注释 I_32_clk => I_32_clk, --注释 I_rst => I_rst, --注释 O_data(7 downto 0) => S_data(7 downto 0), --注释 O_begin => S_begin --注释 ) ; 端口名要对齐。冒号要对齐,in或out类属要对齐,矢量定义要对齐。 异步复位的同步释放 异步复位的好处为:异步复位可以直接利用FPGA内部寄存器的硬复位管脚来复位寄存器,同时复位信号不再参与到组合逻辑电路中,不影响逻辑的速度。但异步复位也会引来一些问题,当复位信号正好在时钟沿附近释放,寄存器的输出将出现亚稳态。 可以采用异步复位的同步释放方式来避免。如下: process (I_sys_rst, I_sys_clk) begin if (I_sys_rst = '0') then S_master_rst <= '0'; S_rst_buf <= '0'; elsif rising_edge(I_sys_clk) then S_rst_buf <= '1'; if (S_rst_buf = '1') then S_master_rst <= '1'; end if; end if; end process; process (S_master_rst, I_sys_clk) begin if (S_master_rst = '0') then ---开始复位。。。。 elsif rising_edge(I_sys_clk) then ---正常工作 end if; end process; 分频时钟的实现 如下: S_clk_div是I_clk四分频产生的信号,高电平脉冲为一个I_clk周期,可以采用如下的语句: 正例: if rising_edge(I_clk) then if S_clk_div = ’1’ then … end if; end if; 不使用如下语句: 反例: if rising_edge(S_clk_div) then … end if; 门控时钟的实现 不推荐直接使用门控时钟,如下例,系统工作不稳定: 反例: S_clk_con <= I_clk and I_clk_ctl; Process(I_rst, S_clk_con) begin if I_rst =’0’ then O_do <= ’0’; elsif rising_edge(S_clk_con) then O_do <= I_di; end if; end process; 此时为了避免产生毛刺,要求I_clk_ctl在时钟的I_di有效期间维持稳定。 推荐改为下面的方式: 正例: process(I_rst,I_clk) begin if I_rst = ’0’ then O_do <= ’0’; elsif rising_edge(I_clk) then if I_clk_ctl =‘1’ then O_do <= I_di; end if; end if; end process; 这时只需要I_clk_ctl在I_clk的时钟上升沿维持稳定就可以。 状态机状态参数表示 entity demo is port(……) ; end ; ------------------------------------------ architecture ARC_DEMO of DEMO is signal S_disbus_st : std_logic_vector(1 downto 0); --signal of bus state constant C_idle_st : std_logic_vector := "00"; --注释 constant C_BUSY_ST : std_logic_vector := "10"; --注释 constant C_NORMAL_ST: std_logic_vector := "11"; --注释 constant C_END_ST : std_logic_vector := "10"; --注释 并行数据的异步采样 如下例: 反例: signal S_di_buf :std_logic_vector(7 downto 0); … process(I_rst,I_clk) begin if I_rst='0' then S_di_buf<= x"00"; elsif rising_edge(I_clk) then S_di_buf(7 downto 0)<=I_di(7 downto 0); end if; end process; process(I_rst,I_clk) begin if I_rst='0' then O_do<='0'; elsif rising_edge(I_clk) then if S_di_buf=x"01" then O_do<='1'; else null; end if; end if; end process; 该程序本来是希望检测到输入I_di为1的时候,给出O_do标志信号为1,但是由于I_di与I_clk的不同步,就会造成如下的仿真结果: 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 原因,主要是I_di的最低位由0变1的时间比其它位的信号线块,因此在由0到F的变化过程中,会出现一个很短时间的1,时钟上升沿正好采样到这个1,造成错误。 如果采用两次采样去抖的方式:如下: 正例: signal S_di_1buf :std_logic_vector(7 downto 0); signal S_di_2buf :std_logic_vector(7 downto 0); … process(I_rst,I_clk) begin if I_rst='0' then S_di_1buf<= x"00"; S_di_2buf<= x"00"; elsif rising_edge(I_clk) then S_di_1buf(7 downto 0)<=I_di(7 downto 0); if S_di_1buf(7 downto 0)=I_di(7 downto 0) then S_di_2buf<=S_di_1buf; else null; end if; end if; end process; process(I_rst,I_clk) begin if I_rst='0' then O_do<='0'; elsif rising_edge(I_clk) then if S_di_2buf(7 downto 0)=x"01" then O_do<='1'; else null; end if; end if; end process; 从仿真图可知,就算第一次采样错误,也可以通过比较两次采样结果的方式消除影响。因此,我们的设计当中,如果需要采样的并行信号,与采样时钟异步,有效时间必须设计为超过一个时钟周期才能可靠采样。 异步信号的沿检测 如下例子说明异步信号沿检测在不进行同步的情况下丢失沿的原因: 反例: signal S_di_buf :std_logic; … process(I_rst,I_clk) begin if I_rst='0' then O_do<='0'; S_di_buf<='1'; elsif rising_edge(I_clk) then S_di_buf<=I_di; if I_di='0' and S_di_buf='1' then O_do<='1'; else O_do<='0'; end if; end if; end process; 该进程实现的功能是检测到I_di的下降沿,O_do输出高电平。该进程实现如下: 假设I_di->s1的延时为T1,I_di->S_di_buf的延时为T2,与门延时为T3,触发器的建立时间为Tsetup,输入I_di与时钟上升沿的时间间隔为T。如下: 当T>Tsetup,则在时钟沿后T2输出S_di_buf为0,I_di经过反向器延时T1产生S1,S1与S_di_buf经过与门就产生S3的脉冲,该脉冲与输入的延时为T1+T3,与时钟的时间间隔为(T-T1-T3)。如果T-T1-T3小于触发器的建立时间,触发器就没有办法采样到S3脉冲,产生O_do的脉冲,最后导致沿丢失。 如果先对输入信号采样,由于采样信号与时钟上升沿的时间间隔T保持为一个时钟周期,可以保证T-T1-T3能够满足触发器的建立时间,肯定能够采样到S3脉冲从而输出O_do。 正例: signal S_di_1buf :std_logic; signal S_di_2buf :std_logic; … process(I_rst,I_clk) begin if I_rst='0' then O_do <= '0'; S_di_1buf <= '1'; S_di_2buf <= '1'; elsif rising_edge(I_clk) then S_di_1buf <= I_di; S_di_2buf <= S_di_1buf; if S_di_1buf = '0' and S_di_2buf = '1' then O_do<='1'; else O_do<='0'; end if; end if; end process; 异步信号驱动多个触发器 例子如下: 反例: process (I_rst,I_clk) begin if I_rst = '0' then S_count <= 15; elsif rising_edge(I_clk) then if I_enable = '1' then S_count <= S_count + 1; else S_count <= S_count; end if; end if; end process; 如下的仿真图,就是第0、3比特的触发器没有满足建立时间要求,而1、2比特满足建立时间要求造成的由F->6的错误结果。 正例: signal S_enable_buf : std_logic ; … process(I_rst , I_clk) begin if I_rst = ‘0’ then S_enable_buf <= ‘0’ ; elsif rising_edge(I_clk) then S_enable <= I_enable ; else null ; end if ; end process ; process (I_rst,I_clk) begin if I_rst = '0' then S_count <= 15; elsif rising_edge(I_clk) then if S_enable = '1' then S_count <= S_count + 1; else S_count <= S_count; end if; end if; end process; 这样可以保证到各个触发器的时间都是足够大的,避免了异步的问题。 buffer端口类型的实现 使用out端口类型实现buffer端口类型的例子如下: port(.... O_dpram_rd : out std_logic; --注释 .... ); ... signal S_dpram_rd : std_logic; --注释 ... O_dpram_rd <= S_dpram_rd; ..... if (S_cobus_st = BUSY_ST) then S_dpram_rd <= '1'; else S_dpram_rd <= '0'; end if; ..... if (S_dpram_rd = '1') then .... 括号的使用 下面的例子描述了一个4输入的加法器分组及其实现结果。 例、 Z <= A + B + C + D; 用圆括号重新构造的加法器分组如下所示。 例、 Z <= (A + B) + (C + D); 上述两种方法的在速度和面积上的区别是: 第一种方法(不带括号):面积小,但整体速度慢。但是,如果信号D是关键路径,其它信号是非关键路径;或者,设计中关键路径与A、B、C、D无关,则应当采用这种方法。 第二种方法(带括号):面积大,但整体速度快。如果对A、B、C、D的时序要求都比较苛刻,应当采用这种方法 参数化设计 参数化设计可以提高代码的可读性。如对于一个双口RAM的读信号,假设低电平读有效,可以定义C_DP_RD_VALID为读有效,C_DP_RD_INVALID读无效,如下定义: .... signal S_dpram_rd : std_logic; constant C_dp_rd_valid : std_logic_vector := '0'; constant C_dp_rd_invalid : std_logic_vector := '1'; ..... if (S_cobus_st = C_busy_st) then O_dpram_rd <= C_dp_rd_valid; else O_dpram_rd <= C_dp_rd_invalid; end if; 变量信号声明 功能集中或有很强的相关性的变量信号声明放在一起,类间用空行或注释分开,可以提高代码的可读性,如下定义: --------------------------------------- -- rom signal S_6_rom_low_addr_cnt : std_logic_vector(5 downto 0) ; signal S_5_rom_high_addr_cnt : std_logic_vector(4 downto 0) ; constant C_rom_in_data : std_logic_vector(3 downto 0) := "0000" ; signal S_rom_out_data : std_logic_vector(3 downto 0) ; ------------------------------------ -- dpram constant C_dpram_wr_en : std_logic := '1' ; signal S_3_dpram_wr_addr_cnt : std_logic_vector(3 downto 0) ; signal S_3_dpram_rd_addr_cnt : std_logic_vector(3 downto 0) ; signal S_0_dpram_wr_out_data : std_logic_vector(4 downto 0) ; signal S_1_dpram_wr_out_data : std_logic_vector(4 downto 0) ; ------------------------------------ signal S_0_filter_data_en : std_logic ; signal S_1_filter_data_en : std_logic ; ------------------------------------ signal S_3_div_cnt : std_logic_vector(2 downto 0) ; signal S_3_sample_cnt : std_logic_vector(2 downto 0)
本文档为【VHDL代码设计规范】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_884581
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:26
分类:互联网
上传时间:2012-10-23
浏览量:21