VHDL代码书写规范

合集下载

第3节VHDL的数据及文字规则

第3节VHDL的数据及文字规则

四、文件
文件是传输大量数据的对象,可以包含一些专门数据类型 的数值。在系统仿真测试时,为方便控制及观察,测试的 输入激励数据和仿真结果的输出都要用文件来进行
IEEE STD1076-1987中定义了TEXTIO程序包, STD1076-1987中定义了TEXTIO程序包, 它定义了几种文件I 它定义了几种文件I/O传输的方式。例如:
这些文件I 这些文件I/O传输方式实际上是对一些过程的定 义,调用这些过程就能完成数据的传递。
4.3.3
VHDL数据类型( VHDL数据类型(DATA TYPES) 数据类型
四种基本数据类型: 四种基本数据类型: 标量类型( (1)标量类型( Scalar Type) 复合类型(Complex (2)复合类型(Complex Type) 存取类型(Access (3)存取类型(Access Type) 文件类型(File (4)文件类型(File Type) 重点介绍: 重点介绍: • VHDL的预定义数据类型 VHDL的预定义数据类型 • IEEE标准数据类型 IEEE标准数据类型 • 用户自定义数据类型方式
二、 IEEE标准数据类型 IEEE标准数据类型
数据类型STD_LOGIC共定义了九种值,具体如下: 数据类型STD_LOGIC共定义了九种值,具体如下: 共定义了九种值
‘U’ ‘X‘ '0‘ '1‘ 'Z‘ 'W‘ 'L‘ 'H‘ '-'
--未初始化 --未初始化 --强未知 --强未知 --强0 --强 --强1 --强 --高阻态 --高阻态 --弱未知 --弱未知 --弱0 --弱 --弱 1 --弱 --忽略 --忽略
四、段名
Swap A, 0feh 多个下标的组合 A, 0efh 标识符(表达式 方向 表达式) 标识符( 表达式) 方向----方向----- To 由低到高 DOWNTO 由高到低 7); 如:signal a, z: bit_vector(0 to 7);-- 8位位矢量 z(0 to 3)<=a(4 t0 7); 7); z(4 to 7)<=a(0 to 3); 3); a

实验五理论(二)VHDL文字规则

实验五理论(二)VHDL文字规则

2 字符串
(1)文字字符串
"ERROR" , "Both S and Q equal to 1" , "BB$CC"
(2)数位字符串
B:二进制基数符号,表示二进制位0或1,在字符串 中的每位表示一个Bit。 O:八进制基数符号,在字符串中的每一个数代表一 个八进制数,即代表一个3位(BIT)的二进制数。 X:十六进制基数符号(0~F),代表一个十六进制数, 即一个4位的二进制数。
data1 <= B"1_1101_1110" 矢数组长度是9 data2 <= O"15" 矢数组长度是6 data3 <= X"AD0" 位矢数组长度是12 data4 <= B"101_010_101_010" 矢数组长度是12 data5 <= "101_010_101_010" data6 <= "0AD0"
-- 二进制数数组,位 -- 八进制数数组,位
-- 十六进制数数组,
-- 二进制数数组,位 --表达错误,缺B。 --表达错它可以是常量、变量 、信号、端口、子程序或参数的名字。
规则: •有效的字符:包括26个大小写英文字母,数字包括0 ~9 以及下划线“_”。 •任何标识符必须以英文字母开头。 •必须是单一下划线“_”,且其前后都必须有英文字 母或数字。 •标识符中的英语字母不分大小写。 •允许包含图形符号(如回车符、换行符等),也允许 包含空格符。
C、物理量文字(VHDL综合器不接受此类文字)。如: 60s (60秒), 100m (100米), k (千欧姆), 177A (177安培)

VHDL代码设计规范

VHDL代码设计规范

签名签名编制审核部门部门签名审核签名审核加盖受控章部门部门签名签名审核审核部门部门签名签名审核审核部门部门签名签名审核审核部门部门签名签名审核审核部门部门签名签名审核审核部门部门审批批准生效日期:签名签名文件编号文件标题现行版本VHDL 代码设计规范V1.0版次编制日期更改内容(条款)文件编号:编制:审核:文件编号:编制:审核:可靠性审核:标准化:批准:........................................................................................................................................................................................................................................................................................................................................................................................................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.1. 例子说明(规范详细解释) (9)6.2. 代码模板 (18)规范 VHDL 的设计风格,保证代码的可读性、重用性及与现有 EDA 工具的一致性,从而形成对设计代码的标准化管理。

VHDL代码规范

VHDL代码规范

3
3.1
代码风格 .........................................................................................11
移植与可读性要求 ....................................................................................... 11
3.1.1 3.1.2 3.1.3 3.1.4 3.1.5
3.1.6 3.1.7 3.1.8 3.1.9
常数之间有确定的关系时,使用关系定义 ...............................................................12 定义地址时,使用基址+偏移方式 .............................................................................13 常数可能变动的情况下使用generic map方式传递,而不是在模块中定义 ...............13 表达式使用括号表示优先级 .......................................................................................13
3.2
3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9
语句使用 .......................................................................................................13

VHDL代码设计规范

VHDL代码设计规范

质量记录编号:第 1 页共1页文件历史记录质量记录编号:第 1 页共1页VHDL代码设计规范(评审稿)文件编号:编审制:核:VHDL代码设计规范(定稿)文件编号:编审制:核:可靠性审核:标准化:批准:目录1. 2. 3. 4. 5.目的 (1)范围 (1)术语说明 (1)规范列表 (1)规范 (3)5.1.书写规范 (3)5.1.1.5.1.2.5.1.3.命名规范 (3)注释规范 (5)其他书写规范 (6)5.2.设计规范 (6)5.2.1.5.2.2.5.2.3.5.2.4.5.2.5.复位 (6)时钟 (7)状态机 (7)异步信号 (7)其他设计规范 (8)5.3.设计常识 (9)6.附录 (9)6.1.6.2.例子说明(规范详细解释) (9)代码模板 (18)- 1 -1. 目的规范VHDL的设计风格,保证代码的可读性、重用性及与现有EDA工具的一致性,从而形成对设计代码的标准化管理。

2. 范围本标准规定了VHDL代码设计规范。

本标准适用于COMBA公司技术中心。

3. 术语说明本规范使用的术语解释如下:级别:指该规则遵循的级别,有两个级别,分别为推荐和规定。

推荐:表示在一般情况下必须遵循该规则。

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

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

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

正例:对此规则或准则给出的正确示例。

反例:对此规则或准则给出的反面示例。

4. 规范列表编号级别书写规范规则R1.R2. R3.R4. R5. R6.R7. R8. R9.规定规定规定推荐规定规定规定推荐推荐一个文件只包含一个模块,文件命名、模块命名、实体命名必须相同。

文件名及其后缀必须小写.顶层文件命名方式使用器件型号、工程名与_top 结合。

第二层文件后缀使用_module,第三层文件使用_block,第四层之后不做定义。

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

VHDL语言编写规范

VHDL语言编写规范

VHDL语言编写规范目录目录 (1)1 目的 (2)2 范围 (2)3 定义 (2)4 规范内容:VHDL编码风格 (2)4.1 标识符(Identifiers)命名习惯 (2)4.2 数据对象和类型 (4)4.3 信号和变量 (5)4.4 实体 (5)4.5 语句 (7)4.6 运算符(Operator) (10)4.7 function (10)4.8 procedure (11)4.9 类属( generics) (11)4.10 package (12)4.11 FSM(有限状态机) (12)4.12 Comments (12)4.13 TAB键间隔 (12)4.14 语句书写规范规定 (13)5 程序中的注释 (13)6 代码模块划分 (14)7 代码编写中容易出现的问题 (15)7.1 资源共享问题 (15)7.2 组合逻辑描述的多种方式 (15)7.3 考虑综合的执行时间 (16)7.4 避免使用Latch (16)7.5 多赋值语句案例:三态总线 (16)附录一VHDL保留字 (18)附录二函数书写实例 (19)附录三参数化元件实例 (20)附录四程序包书写实例 (21)1 目的编写该规范的目的是提高书写VHDL代码的可读性、可修改性、可重用性;优化代码综合和仿真结果,指导设计工程师使用VHDL 规范代码和优化电路,规范化公司的ASIC/FPGA 设计输入,从而做到:a、逻辑功能正确;b、可快速仿真;c、综合结果最优;d、可读性最好。

2 范围该规范设计VHDL编码风格、规定,编码中应注意的问题,VHDL代码书写范例等,适用于所有的采用VHDL代码进行设计的项目。

3 定义VHDL:Very high speed IC Hardware Description Language,甚高速集成电路的硬件描述语言。

FSM:Finite Status Machine,有限状态机Simulate:仿真,通过输入激励在计算机上验证设计是否正确。

VHDL代码书写规范

VHDL代码书写规范

VHDL代码书写规范(定稿)文件编号:编制:审核:可靠性审核:标准化:批准:文件会签页文件历史记录文件编号现行版本V1.0 文件标题VHDL代码书写规范文件履历版次编制日期更改内容(条款)V1.0V1.0目录1.目的 (1)2.范围 (1)3.术语说明 (1)4.书写规范 (1)4.1命名规范 (1)R1.一个文件只包含一个模块,文件命名和实体命名必须相同。

文件名大写,其后缀小写。

(1)R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。

顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称) (1)R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。

(2)R4.命名要有实际意义。

(2)R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。

信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。

(2)R6.模块、信号、变量等的命名不大于64个字符 (2)R7.实体、结构名、端口信号、常量用大写标识 (2)R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。

如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。

(3)R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

(3)R10.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。

VHDL编程规范

VHDL编程规范

华为VHDL编程规范(2010-10-18 13:30:09)转载分类:FPGA标签:vhdl编程规范杂谈1.标识符 (Identifiers)命名习惯标识符用于定义实体名结构体名信号和变量名等选择有意义的命名对设计是十分重要的命名包含信号或变量诸如出处有效状态等基本含义下面给出一些命名的规则包括VHDL语言的保留字2.标识符定义命名规定标识符第一个字符必须是字母最后一个字符不能是下划线不许出现连续两个下划线基本标识符只能由字母数字和下划线组成标识符两词之间须用下划线连接标识符不得与保留字同名3. 标识符大小写规定对常量数据类型实体名和结构体名采用全部大写对变量采用小写对信号采用第一个词首字符大写保留字一律小写建议用有意义而有效的名字能简单包含该信号的全部或部分信息如输入输出信息Data_in 总线数据输入Din 单根数据线输入FIFO_out FIFO数据总线输出如宽度信息Cnt8_q 8位计数器输出信号的命名变量主要用在高层次的模拟模型建模及用于运算的用途但变量的综合较难定义对于编写可综合的VHDL模块在没有把握综合结果情况下建议不使用在VHDL中信号(signal)代表硬件连线因此可以是逻辑门的输入输出同时信号也可表达存贮元件的状态端口也是信号在进程process 中信号是在进程结束时被赋值因此在一个进程中当一个信号被多个信号所赋值时只有最后一个赋值语句起作用1. 实体结构体使用规定library IEEE use IEEE.std_logic_1164.all 除IEEE大写外其余小写实体名和结构体名必须用大写标识实体名必须与文件名同名自定义的其他标识符如信号名变量名标号等不得与实体名结构体名同名实体端口数据模式不准使用buffer 模式需要反馈的信号可定义内部信号来解决如计数器端口Count 可内部定义信号signal Cnt8_q STD_LOGIC_VECTOR(7 downto 0)实体端口数据类型规定实体端口的数据类型采用IEEE std_logic_1164 标准支持的和提供的最适合于综合的数据类型STD_ULOGIC STD_LOGIC和这些类型的数组不采用IEEE 1076 /93 标准支持和提供的BIT BIT数组INTEGER及其派生类型这是为保证模拟模型和综合模型的一致性及减少转换时间和错误代码书写要有层次即层层缩进格式清晰美观要有必要的注释25%实体开始处应注明文件名功能描述引用模块设计者设计时间及版权信息等如-- Filename ﹕-- Author ﹕-- Description ﹕library IEEE;use IEEE.std_logic_1164.all;entity ENTITY_NAMEport(Port1 : in STD_LOGIC;Port2 : in STD_LOGIC;Port3 : out STD_LOGIC;..Portn : out STD_LOGIC);end ENTITY_NAME ;architecture BEHAVIOR of ENTITY_NAME isbeginStatements;end BEHAVIOR ;实体名的命名建议能大致反映该实体的功能如COUNTER8 8位宽的计数器模块DECODER38 3-8线译码器模块一个实体可以有多个结构体对单个结构体的实体文件要包含结构体和实体说明便于查阅对多个结构体的实体建议把常用的结构体放在文件中其余结构体用单独文件表示使用时用configuration 语句进行配置2. VHDL各语句使用规定with-select-when 语句书写规范规定with- select - when 语句提供选择信号赋值是根据选定信号的值对信号赋值代码的书写规范为with S selectX <= A when 00,B when 01,C when 10,D when others;when_else 语句书写规范规定when_else 语句提供为条件信号赋值即一个信号根据条件被赋一值代码书写规范为Signal_name <= value_a when condition1 elsevalue_b when condition2 elsevalue_c when condition3 elsevalue_x当条件是表达式时表达式须用()括起来使代码更为清晰如when (a = b and C= ‘1 ’)elseif 必须有一个else 对应除在如下面例子的情况下可不写else语句例process( Clk,Rst)beginif ( Rst = '1') thenQ <= '0';elsif ( Clk ‘event and Clk = ‘1’) thenQ <= D;end if;end process;case- when 语句书写规范规定该语句用于规定一组根据给定选择信号的值而执行的语句可用with-select-when 语句等效代码的书写规范为case- selection_signal iswhen value1_of _selection signal =>Statements1;when value2_of _selection signal =>Statements2;....when last_value_of _selection signal =>Statements x ;when others =>Statements x;end case;process 显示敏感列表必须完整对有Clk 的process 不同综合工具有不同的要求有些只要写Clk和Rst就可建议根据具体情况简化设计书写有clk的process 的敏感列表中为方便修改敏感列表书写规范如下Lab: process (Clk, Rst,list1,list2)begin每个process 前须加个lable为便于阅读port map 采用名字对应(=> )映射方法port map 中总线到总线映射时(X downto Y )要写全VHDL保留字VHDL语言的保留字如下absaccess after alias all and architecture array assert attributebegin block buffer bus case component configuration constantdisconnect downto else elsif end entity exit file for functiongenerate generic group guarded if impure in inertial inoutis label library linkage literal loop map mod nand new next nornot null of on open or others out package portpostponed procedure process pure range record register reject rem report return rol ror select severity signal shared sla sll sra srl subtype then to transport type unaffected units until use variablewait when while with xnor xorVHDL 编写范例。

VerilogHDL代码书写规范

VerilogHDL代码书写规范

Revision History ﹕99-08-01
Revision 1.0 Email ﹕ M@ Company ﹕ swip Technology .Inc
Copyright(c) 1999, swip Technology Inc, All right reserved
\*
y 用连贯的缩写
1
长的名字对书写和记忆会带来不便 甚至带来错误 采用缩写时应注意同一信号在模 块中的一致性 缩写的例子如下
Addr address Pntr pointer Clk clock Rst reset
y 用最右边的字符下划线表示低电平有效 高电平有效的信号不得以下划线表示 短暂
的引擎信号建议采用高有效 如 Rst_ Trdy_, Irdy_ Idsel.
Sun Microsystems Revision 1.0
5 规范内容 5.1 Verilog 编码风格
本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级 RTL behavioral, gate_level) 也适用于出于仿真 综合或二者结合的目的而设计的模块
5.1.1 命名的习惯
FSM 有限状态机
伪路径 静态时序分析 STA 认为是时序失败 而设计者认为是正确的路径
4 引用标准和参考资料
下列标准包含的条文 通过在本标准中引用而构成本标准的条文 在标准出版时 所示版本
均为有效 所有标准都会被修订 使用本标准的各方应探讨 使用下列标准最新版本的可能性
Verilog Style and Coding Guidelines Actel HDL Coding Style Guider
Input [199:0] Vector1, Vector2;

第5讲VHDL语言要素

第5讲VHDL语言要素
计实体中并行语句模块间动态交换数据的手段。在 物理上信号对应着硬件设计中的一条连接线。它除 了没有数据流动方向说明以外,其他性质与实体的 端口(Port)概念一致。
信号定义语句格式: SIGNAL 信号名: 数据类型 [:= 初始值] ;
12
例:SIGNAL clk : std_logic := ‘0’; SIGNAL a : integer range 0 to 15; SIGNAL data : std_logic_vector(15
15
…… SIGNAL a,b,c,y,z: integer ;
…… PROCESS(a,b,c )
BEGIN y <= a*b; --------- 不对y进行赋值 z <= c-y; y <= b; --------- y的最后赋值
END PROCESS; ……
16
信号与变量的区别
(1)声明的形式与位置不同 信号 signal count : std_logic_vector(7 downto 0); 变量 variable tema:std_logic_vector(3 downto 0); 信号在结构体中声明;变量在进程中声明
C
练习
A
X
B
Y
architecture m2 of bcv is begin process(a,b,c) variable d:std_logic; begin d:=a; x<=c xor d; d:=b; y<=c xor d; end process; end m2;
x<=c xor a, y<=c xor b 20
27
(4) 字符 是用单引号括起来的ASCⅡ码,一般情况下

3、VHDL语言规则

3、VHDL语言规则

所以结果是:wand or xor -- 非门 -- 与门、 nand-- 与非门 -- 或门、 nor -- 或非门 -- 异或门、xnor -- 异或非门
例如1:
a 0 0 1 1 b 0 1 0 1 c 0 0 0 1 s 0 1 1 0
c=a and b; S=a xor b
2)entity(实体)定义区
作用: entity(实体)是用来定义电路的端口 和端口的信号属性。 注意关键 定义格式: 词和符号 Entity 实体名 is Port(a : in std_logic; b : in std_logic; c : out std_logic_vector(0 to 3)); End 实体名; 端口名 数据类型 端口模式
程序例1:
程序例2:
程序例3:
小归纳:
库与程序包声明
① VHDL程序必需包括的基本结构。
• 1)Library——库(库的)程序包; • 2)Entity——实体区; • 3)Architecture——结构体区;
实体
② 文件名字与程序中的实体名一致, 另外有2处与实体一致。 结构体
1)Library(库文件)及程序包
请判断标识符的正确性
74HC245
clr/reset
_decoder_1 sig_#n ry_rst_
D100%
Multi_screens 2fft Not-ack entity
Data_ _bus
请练习编写下列语句
端口d为10位输入总线;
端口oe和clk都是1位输入;
端口AD位9位双向总线;
端口A为8位输出总线;
子程序等。作用是为了声明在实体和结构体定义中
将用到的数据类型、元件或子程序等。 声明格式: Library 库名; Use 库名. PACKAGE名.All;

[VHDL Verilog]良好的代码编写风格(二十五条)讲解

[VHDL Verilog]良好的代码编写风格(二十五条)讲解

良好代码编写风格可以满足信、达、雅的要求。

在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。

良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;(2)使用有意义的信号名、端口名、函数名和参数名;(3)信号名长度不要太长;(4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;(6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。

注意在同一个设计中要使用同一个小写字母表示低电平有效;(7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n;(8)当描述多比特总线时,使用一致的定义顺序,对于verilog建议采用bus_signal[x:0]的表示;(9)尽量遵循业界已经习惯的一些约定。

如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。

注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;(12)每一行语句独立成行。

VHDL语法格式

VHDL语法格式

上篇基础元素目录:数据类型数据对象运算符语句基本程序结构电路描述方式数据类型预定义类型bitbit_victorintegerstd_logicstd_logic_victor自定义类型枚举类型type 新数据类型is (元素1, 元素2, ...)例定义type state_type is (s1, s2, s3. s4); -- 定义一个新类型state_type引用signal state : state_type; -- 定义一个信号state,类型为state_type数组类型type 数组is array (范围) of 数据类型;例定义type byte is array (7 downto 0) of bit;-- 定义一个8bit的数组type word is array (31 downto 0) of bit;-- 定义一个32bit的数组数据对象端口声明端口: in | out 数据类型; -- 端口在特性上等同于信号,但赋值在entity的port中赋值端口<= 表达式;信号声明signal 信号: 数据类型;赋值信号<= 表达式;变量声明varable 变量: 数据类型;赋值变量:= 表达式;常数声明常数: 数据类型:= 数值;运算符算术运算+, -, *并置运算&关系运算=, /=, <, <=, >, >=逻辑运算and, or, not, nand, nor, xor, xnor语句并行语句⑴信号赋值语句简单信号赋值语句信号<= 表达式;选择信号赋值语句with 选择表达式select信号<= 表达式1 when 选择值1,表达式2 when 选择值2,......表达式n when others;条件信号赋值语句信号<= 表达式1 when 条件关系式1 else表达式2 when 条件关系式2 else......表达式n when 条件n else表达式;⑵过程调用语句过程(实参);⑶函数调用语句信号<= 函数(实参);⑷元件例化语句元件声明component 元件实体-- 将一个实体声明为元件port (端口声明);end component;元件引用按位置引用标号: 元件实体port map (连接端口1, 连接端口2, ...);按名称引用标号: 元件实体port map (元件端口1 >= 连接端口1, 元件端口2 >= 连接端口2, ...);⑸生成语句格式1 [标号:] for 循环变量in 取值范围generate声明语句,begin并行语句,end generate [标号];取值范围: 表达式to 表达式; -- 递增方式,如1 to 5表达式downto 表达式; -- 递减方式,如5 downto 1格式2 [标号:] if 条件关系式generate声明语句;begin并行语句,end generate [标号] ,⑹块语句块标号: block [(保护条件)]接口声明;类属声明;begin并行语句; -- 被保护的变量前需加上保留字guardedend block 块标号;带保护的块语句举例: entity latch isport( d, clk : in bit;q, qb : out bit);end latch;achetectire latch_guard of latch isbeginb1 : block(clk = 1)beginq <= guarded d after 5 ns;qb <= guarded not(d) after 7 ns;end block b1;end latch_guard⑺进程语句[标号:] process (敏感信号)[声明语句;] --常量,变量,信号begin顺序语句;end process [标号:];顺序语句⑴ 赋值语句-- 在进程中信号<= 表达式;变量:= 表达式;⑵ 流程控制语句if语句格式1: if 条件关系式then顺序语句;end if;格式2: if 条件关系式then顺序语句;else顺序语句;end if;格式3: if 条件关系式1 then顺序语句;elsif 条件关系式2 then顺序语句;......else顺序语句;end if;case 语句-- case 语句中,条件值有3种形式:值,值1 | 值2 |...| 值n,值TO 值-- 最后一行的顺序语句若为null,则有意引入锁存器case 条件表达式iswhen 条件值=> 顺序语句;......when others => 顺序语句;end case;for_loop 语句[标号]:for 循环变量in 值to 值loop;顺序语句;end loop [标号];时钟边沿描述上升沿时钟event and时钟= 1| rising_edge (时钟) 下降沿时钟event and时钟=0| falling_edge (时钟)程序基本结构-- 主程序与元件程序在同一文件work1.vhd中,library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; -- 主程序entity 实体名is --实体名必须与文件名相同port (端口声明;);end entity work1;architecture struc of work1 is [声明语句;] --常量,变量,信号,元件,函数等begin并行语句;end architecture struc;电路描述方式行为描述方式以用状态机描述电路为典型数据流( 寄存器) 描述方式即用逻辑表达式描述电路结构描述方式以用元件复用的方式描述电路为典型下篇复合元素和状态机目录元件---------- 1 单文件元件2 多文件元件函数---------- 3 单文件函数4 多文件函数过程---------- 5 单文件过程6 多文件过程moorl 状态机-- 7二进程moorl状态机8三进程moorl状态机meaky 状态机-- 9二进程mealy状态机10 三进程mealy状态机状态机实例---- 11交通灯之一12 交通灯之二附录---------- 13状态转移图14 用户库的格式和用法单文件元件-- 主程序与元件程序在同一文件work1.vhd中,library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all; -- 主程序entity work1 isport ( r,s,t,u : in std_logic;v : out std_logic);end entity work1;architecture struc of work1 is component ym -- 将实体ym声明为元件port ( a,b : in std_logic;c : out std_logic);end component ym;component hm -- 将实体hm声明为元件port ( a,b : in std_logic;c : out std_logic);end component hm;signal temp1,temp2 : std_logic;beginu1 : ym port map ( r, s, temp1 ); -- 元件例化u2 : ym port map ( t, u, temp2 );u3 : hm port map ( temp1, temp2, v );end architecture struc;-- ym元件实体定义程序library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entity ym isport ( a,b : in std_logic;c : out std_logic);end entity ym;architecture ym1 of ym is beginc <= a and b;end architecture ym1;-- hm元件实体定义程序library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all;entity hm isport ( a,b : in std_logic;c : out std_logic);end entity hm; architecture hm1 of hm is beginc <= a or b;end architecture hm1;多文件元件-- 主程序文件和定义元件的程序文件都要添加到工程中-- 主程序文件zhu_map.vhd,不需要...声明用户库文件library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all;entity zhu_map isport ( r,s,t,u : in std_logic;v : out std_logic);end entity zhu_map; architecture niu of zhu_map iscomponent ymport ( a,b : in std_logic;c : out std_logic);end component ym;component hmport ( a,b : in std_logic;c : out std_logic);end component hm;signal temp1,temp2 : std_logic;beginu1 : ym port map ( r, s, temp1 ); -- 元件例化u2 : ym port map ( t, u, temp2 );u3 : hm port map ( temp1, temp2, v );end architecture niu;-- 定义元件实体的程序文件-- ym元件实体定义程序library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entity ym isport ( a,b : in std_logic;c : out std_logic);end entity ym;architecture ym1 of ym is beginc <= a and b;end architecture ym1;-- hm元件实体定义程序library ieee;use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all;entity hm isport ( a,b : in std_logic;c : out std_logic);end entity hm;architecture hm1 of hm is beginc <= a or b;end architecture hm1;单文件函数library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; entity func isport ( din1,din2 : in std_logic_vector( 0 to 3 );dout : out std_logic_vector( 0 to 3 ));end entity;architecture a of func is-- 定义函数function ls_xj ( d1, d2 : in std_logic_vector( 0 to 3 )) return std_logic_vector isvariable temp : std_logic_vector( 0 to 3 ); begintemp := d1 + d2;return temp;end function;-- 定义函数结束begindout <= ls_xj ( din1, din2 ); --调用函数end architecture;多文件函数-- 主程序文件和定义函数的程序文件都要添加到工程中-- 主程序文件zhu_func.vhd,必须声明用户库文件library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; use e_func.all; -- use_func.vhd作为用户库entity zhu_func isport ( din1,din2 : in std_logic_vector( 0 to 3 );dout : out std_logic_vector( 0 to 3 ));end;architecture niu of zhu_func isbegindout <= ls_xj ( din1, din2 ); -- 调用函数end;-- 定义函数的文件fu_func.vhd library ieee;use ieee.std_logic_1164.all; package use_func is -- 声明function ls_xj ( d1, d2: in std_logic_vector( 0 to 3 )) return std_logic_vector;end use_func;package body use_func is -- 程序体function ls_xj ( d1, d2 : in std_logic_vector( 0 to 3 )) return std_logic_vector isvariable temp : std_logic_vector( 0 to 3 ); begintemp := d1 and d2;return temp;end function;end use_func;单文件过程library ieee;use ieee.std_logic_1164.all;entity call_proce isport ( d1 : in integer range 0 to 31;d2 : in integer range 0 to 31;fout : out integer range 0 to 31 );end;architecture a of call_proce is -- 过程定义procedure jfq ( din1, din2 : in integer range 0 to 31;dout : out integer range 0 to 31) isbegindout := din1 + din2; end;-- 过程定义结束beginprocess ( d1, d2 )variable fo : integer range 0 to 31;beginjfq ( d1, d2, fo ); -- 调用过程fout <= fo;end process;end;多文件过程-- 主程序文件和定义过程的程序文件都要添加到工程中-- 主程序文件zhu_proc.vhd,必须声明用户库文件library ieee;use ieee.std_logic_1164.all; use e_proc.all; -- use_proc.vhd作为用户库entity zhu_proc isport ( d1, d2 : in integer range 0 to 31;fout : out integer range 0 to 31);end;architecture niu of zhu_proc isbeginprocess ( d1, d2 )variable fo : integer range 0 to 31;beginjfq ( d1, d2, fo ); -- 调用过程fout <= fo;end process;end;-- 定义过程的文件fu_proc.vhd library ieee;use ieee.std_logic_1164.all; package use_proc is -- 声明procedure jfq ( din1 : in integer range 0 to 31;din2 : in integer range 0 to 31;dout : out integer range 0 to 31);end use_proc;package body use_proc is -- 程序体procedure jfq ( din1, din2 : in integer range 0 to 31;dout : out integer range 0 to 31) isbegindout := din1 + din2;end jfq;end use_proc;二进程moorl状态机library ieee;use ieee.std_logic_1164.all;entity moorl_1 isport ( reset : in std_logic;clock : in std_logic;din : in std_logic;dout : out std_logic_vector ( 2 downto 0 ) );end entity;architecture statemachine of moorl_1 istype state_type is ( s0, s1, s2, s3 );signal state : state_type; beginprocess( reset, clock ) -- 变换状态beginif reset = '1' thenstate <= s0;elsif rising_edge( clock ) thencase state iswhen s0 => if din = '1' thenstate <= s1;end if;when s1 => if din = '1' thenstate <= s2;end if;when s2 => if din = '1' thenstate <= s3;end if;when s3 => if din = '1' thenstate <= s0;elsestate <= s1;end if;end case;end if;end process;process( state ) -- 输出begincase state iswhen s0 => dout <= "001";when s1 => dout <= "011";when s2 => dout <= "101";when s3 => dout <="111";end case;end process;end;三进程moorl状态机library ieee;use ieee.std_logic_1164.all;entity moorl_2 isport ( reset : in std_logic;clock : in std_logic;din : in std_logic;dout : out std_logic_vector( 2 downto 0 ) );end entity;architecture statemachine of moorl_2 istype state_type is ( s0, s1, s2, s3 );signal presentstate : state_type;signal nextstate : state_type;beginprocess ( reset, clock ) -- 更新当前状态beginif reset = '1' thenpresentstate <= s0;elsif rising_edge ( clock ) thenpresentstate <= nextstate;end if;end process;process ( presentstate, din ) -- 生成下一个状态begincase presentstate iswhen s0 => if din = '1' thennextstate <= s1;elsenextstate <= s0;end if;--dout <="001";when s1 => if din = '1' thennextstate <= s2;elsenextstate <= s1;end if;--dout <= "011";when s2 => if din = '1' thennextstate <= s3;elsenextstate <= s2;end if;--dout <= "101";when s3 => if din = '1' thennextstate <= s0;elsenextstate <= s1;--dout <= "111";end if;end case;end process;process ( presentstate ) -- 输出begincase presentstate iswhen s0 => dout <= "001";when s1 => dout <= "011";when s2 => dout <= "101";when s3 => dout <= "111";end case;end process;end;二进程mealy状态机library ieee;use ieee.std_logic_1164.all;entity mealy_1 isport ( reset : in std_logic;clock : in std_logic;din : in std_logic;dout : out std_logic_vector ( 2 downto 0 ) );end entity;architecture statemachine of mealy_1 istype state_type is ( s0, s1, s2, s3 );signal state : state_type; beginprocess ( reset, clock ) -- 变换状态beginif reset = '1' thenstate <= s0;elsif rising_edge ( clock ) thencase state iswhen s0 => if din = '1' thenstate <= s1;end if;when s1 => if din = '1' thenstate <= s2;end if;when s2 => if din = '1' thenstate <= s3;end if;when s3 => if din = '1' thenstate <= s0;elsestate <= s1;end if;end case;end if;end process;process ( state, din ) -- 输出begincase state iswhen s0 => if din='0' thendout<="000";elsedout<="001";end if;when s1 => if din='0' thendout<="010";elsedout<="011";end if;when s2 => if din='0' thendout <="100";elsedout<="101";end if;when s3 => if din='0' thendout<="110";elsedout<="111";end if;end case;end process;end architecture;三进程mealy状态机library ieee;use ieee.std_logic_1164.all;entity mealy_2 isport ( reset : in std_logic;clock : in std_logic;din : in std_logic;dout : outstd_logic_vector( 2 downto 0 ) );end entity;architecture statemachine of mealy_2 istype state_type is ( s0, s1, s2, s3 );signal presentstate : state_type;signal nextstate : state_type;beginprocess ( reset, clock ) -- 更新当前状态beginif reset = '1' thenpresentstate <= s0;elsif rising_edge ( clock ) thenpresentstate <= nextstate;end if;end process;process ( presentstate, din ) -- 生成次态begincase presentstate iswhen s0 => if din ='1' thennextstate <= s1;elsenextstate <= s0;end if;when s1 => if din ='1' thennextstate <= s2;elsenextstate <= s1;end if;when s2 => if din ='1' thennextstate <= s3;elsenextstate <= s2;end if;when s3 => if din = '1' thennextstate <= s0;elsenextstate <= s1;end if;end case;end process;process ( presentstate, din ) -- 输出begincase presentstate iswhen s0 => if din = '0' thendout <= "000";elsedout <= "001";end if;when s1 => if din = '0' thendout <= "010";elsedout <= "011";end if;when s2 => if din = '0' thendout <= "100";elsedout <= "101";end if;when s3 => if din = '0' thendout <= "110";elsedout <= "111";end if;end case;end process;end;用状态机设计交通灯之一-- 这是一个简单的状态机设计实例,根据时钟变换路口-- 的红,绿,黄三个信号灯,从程序中可以看出,时钟-- 的周期至少应为,例如30秒。

电子自动化第三章 3.3 VHDL的语言语法

电子自动化第三章 3.3 VHDL的语言语法

VHDL预定义数据类型 预定义数据类型
数据类型 整数 实数 位 位矢量 布尔量 字符 字符串 时间 含 义 整数32位 取值范围: 整数 位, 取值范围:-(231-1) ~ (231-1) 浮点数,取值范围: 浮点数,取值范围: -1.0e+38 ~ 1.0e+38 逻辑’ 或 逻辑’0’或’1’ 位矢量, 位矢量,用双引号括起来的一组数据 逻辑“真” 或“假”,用TRUE和FALSE标记 逻辑“ 和 标记 ASCII字符 字符 字符矢量 时间单位fs, , , , , , 时间单位 ,ps,ns,µs,ms,sec,min,hr ,
(4)时间(TIME)类型(物理类型)。表示时间的数据类型, )时间( )类型(物理类型) 表示时间的数据类型, 在仿真时是必不可少的。 在仿真时是必不可少的。 时间类型定义的一般格式为: 时间类型定义的一般格式为: TYPE 数据类型名 IS 范围; 范围; UNITS 基本单位; 基本单位; 单位; 单位; END UNITS; ;
信号说明语句的格式为: 信号说明语句的格式为: SIGNAL 信号名 ,信号名 :数据类型 [< =初始值 ; 信号名{,信号名} 初始值]; 初始值 信号包括I/O引脚信号以及 内部缓冲信号,有硬件电 信号包括 引脚信号以及IC内部缓冲信号, 引脚信号以及 内部缓冲信号 路与之对应, 信号之间的传递有实际的附加延时。 路与之对应,故信号之间的传递有实际的附加延时。 信号通常在构造体、包集合和实体中说明;信号不能 信号通常在构造体 、 包集合和实体中说明 ; 信号 不能 在进程中说明(但可以在进程中使用) 在进程中说明(但可以在进程中使用)。
用户自定义数据类型
VHDL允许用户自己定义 是: 自定义数据类型说明语句的一般格式是: TYPE 数据类型名 {,数据类型名} IS [数据类型定义 ; ,数据类型名 数据类型定义]; 数据类型定义 常用的用户自定义数据类型主要有: 常用的用户自定义数据类型主要有: 用户自定义数据类型主要有 (1)枚举(Enumerated)类型。 通过列举某类变量所有可能的 枚举(Enumerated)类型。 取值来加以定义。 取值来加以定义。

VHDL代码书写规范

VHDL代码书写规范

VHDL代码书写规范1目 次135.1.12 Comments ........................................................135.1.11.1 FSM 使用规定................................................135.1.11 FSM 有限状态机................................................135.1.10.2package 使用注意内容...........................................125.1.10.1 package 使用建议..............................................125.1.10 package ..........................................................125.1.9.1 generic 使用注意内容............................................125.1.9 类属( generics)......................................................125.1.8.2 procedure 使用注意内容..........................................125.1.8.1 procedure 使用规定..............................................125.1.8 procedure ..........................................................115.1.7.3 function 使用注意内容...........................................115.1.7.2 function 使用建议...............................................115.1.7.1 function 使用规定...............................................115.1.7 function ..........................................................115.1.6.2比较运算符规定................................................115.1.6.1 表达式书写规定................................................115.1.6 运算符(operator)....................................................115.1.5.3 VHDL 语句使用注意内容.........................................105.1.5.2 VHDL 语句使用建议............................................75.1.5.1 VHDL各语句使用规定.............................................75.1.5 语句..............................................................65.1.4.3 实体使用注意内容 ...............................................65.1.4.2 实体使用建议...................................................45.1.4.1 实体结构体使用规定 ...........................................45.1.4 实体..............................................................45.1.3.3 信号变量使用注意内容..........................................45.1.3.2 变量使用建议...................................................45.1.3.1 信号不许赋初值...............................................45.1.3 信号和变量.........................................................45.1.2.3 数据使用注意内容 ...............................................35.1.2.2 数据及数据类型使用建议 .........................................35.1.2.1类型使用规定...................................................35.1.2数据对象和类型......................................................35.1.1.6 信号命名有关建议...............................................25.1.1.5 信号名一致性规定...............................................25.1.1.4 信号名缩写的大小写规定..........................................25.1.1.3 信号名连贯缩写的规定............................................25.1.1.2标识符大小写规定................................................25.1.1.1标识符定义命名规定 ..............................................25.1.1 标识符Identifiers)命名习惯............................................15.1 VHDL 编码风格. (15)规范内容..................................................................14引用标准和参考资料.........................................................13定义.....................................................................12范围.....................................................................11目的 (2)216.5 参数化元件实例.........................................................206.4 程序包书写实例.........................................................196.3 函数书写实例..........................................................176.2 VHDL 编写范例.........................................................176.1 VHDL 保留字.. (166)附录....................................................................155.2.5 多赋值语句案例三态总线............................................155.2.4 避免使用Latch ......................................................155.2.3 考虑综合的执行时间.................................................145.2.2组合逻辑描述的多种方式..............................................145.2.1 资源共享问题......................................................145.2 代码编写中容易出现的问题................................................135.1 代码模块划分..........................................................135.1.13 TAB 键间隔.......................................................135.1.12.1 Comments 使用建议.. (3)VHDL代码书写规范1目的本规范的目的是提高书写代码的可读性可修改性可重用性优化代码综合和仿真的结果指导设计工程师使用VHDL规范代码和优化电路规范化公司的ASIC/FPGA设计输入从而做到逻辑功能正确可快速仿真综合结果最优可读性较好2范围本规范涉及VHDL编码风格规定编码中应注意的问题VHDL代码书写范例等本规范适用于所有的采用VHDL代码进行设计的项目3定义VHDL Very high speed IC Hardware Description Language, 甚高速集成电路的硬件描述语言FSM Finite Status Machine,有限状态机simulate仿真通过输入激励在计算机上验证设计是否正确包括RTL仿真和门级仿真模拟是指对一个物理器件的结构功能或其他特性如延时特性等用抽象的语言或高级语言如用C语言进行算法描述所进行的建模4引用标准和参考资料下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性VHDL For Programmable LogicMr,Kevin ShahillUSA5规范内容以下内容中有关的保留字用黑体标识对不作为审核的内容用建议字眼标识5.1 VHDL编码风格本章节中提到的VHDL编码规则和建议适应于 VHDL的任何一级RTL behavioral,gate_level)也适用于出于仿真综合或二者结合的目的而设计的模块5.1.1 标识符Identifiers)命名习惯1标识符用于定义实体名结构体名信号和变量名等选择有意义的命名对设计是十分重要的命名包含信号或变量诸如出处有效状态等基本含义下面给出一些命名的规则包括VHDL语言的保留字5.1.1.1标识符定义命名规定y标识符第一个字符必须是字母最后一个字符不能是下划线不许出现连续两个下划线y基本标识符只能由字母数字和下划线组成y标识符两词之间须用下划线连接如Packet_addr, Data_in, Mem_wr, Mem_cey标识符不得与保留字同名VHDL保留字见附录6.15.1.1.2标识符大小写规定y对常量数据类型实体名和结构体名采用全部大写y对变量采用小写y对信号采用第一个词首字符大写y保留字一律小写5.1.1.3信号名连贯缩写的规定长的名字对书写和记忆会带来不便甚至带来错误采用缩写时应注意同一信号在模块中的一致性一致性的缩写习惯有利于文件的阅读理解和交流部分缩写的统一规定为Addr address Clk clock Clr clear Cnt counterEn enable Inc increase Lch latch Mem memoryPntr pointer Pst preset Rst resetReg register Rd reader Wr write常用多个单词的缩写ROM RAM CPU FIFO ALU CS CE自定义的缩写必须在文件头注释5.1.1.4信号名缩写的大小写规定y单词的缩写若是信号名的第一个单词则首字符大写如Addr_in中的Addr 若该单词缩写不是第一个单词则小写如Addr_en 中的eny多个单词的首字符缩写都大写不管该缩写在标识符的什么位置如RAM_addrRd_CPU_en5.1.1.5信号名一致性规定同一信号在不同层次应保持一致性5.1.1.6信号命名有关建议2y建议用有意义而有效的名字能简单包含该信号的全部或部分信息如输入输出信息Data_in总线数据输入Din单根数据线输入FIFO_outFIFO 数据总线输出如宽度信息Cnt8_q8位计数器输出信号的命名y建议添加有意义的后缀使信号名更加明确常用的后缀如下芯片的双向信号_xbio 芯片的三态输出_xz 芯片的漏极开路输出_xod 芯片原始输出信号_xo 芯片原始输入信号_xi 求反的信号_n 使能控制信号_en 实体端口信号的反馈信号_s_L 后加数字表示信号延迟时钟周期数如_L1_L 连到三态输出的信号_z寄存器的数据输出信号_q 寄存器的数据输入信号_d 时钟信号_clk 意义后缀说明1. 采用D 触发器对信号进行延迟延迟信号的命名在原信号名之后加后缀_L,若是在流水线设计中有级延迟再分别加后缀_L1_L2.....L 表示lock2. 模块内的反馈信号在原信号名之后加后缀_ss 表示 same5.1.2数据对象和类型5.1.2.1类型使用规定yVHDL 是很强的类型语言可综合的数据类型为标量类型包含可枚举类型整型浮点型物理类型和组合类型包含记录数组模拟模型的数据类型为存取类型文件型可综合的VHDL 代码的编写不采用模拟类型浮点型物理类型y不同基本类型的数据不能由另一类型赋值不同类型间的赋值需使用运算符的重载如Cnt8_q 为STD_LOGIC_VECTOR 类型若不对 ‘+’ 运算符重载则 Cnt8_q <= Cnt8_q + 1 语句在综合中将出错可通过对 + 运算符进行重载 即使用use IEEE .std_logic_arith.all 语句则上句赋值语句是正确的y常量名和数据类型必须用大写标识符表示5.1.2.2 数据及数据类型使用建议y 为改善代码的可读性建议可把常用的常量和自定义的数据类型在程序包中定义y建议使用别名来标识一组数据类型有利于代码的清晰如signal AddrSTD_LOGIC_VECTOR(31 downto 0);alias Top_addrSTD_LOGIC_VECTOR(3 downto 0) is Addr(31 downto 28)5.1.2.3 数据使用注意内容3可枚举类型的值为标识符或单个字母的字面量是区分大小写的如 Z 与z 将是两个不同的量5.1.3 信号和变量5.1.3.1信号不许赋初值5.1.3.2变量使用建议变量主要用在高层次的模拟模型建模及用于运算的用途但变量的综合较难定义对于编写可综合的VHDL模块在没有把握综合结果情况下建议不使用5.1.3.3信号变量使用注意内容y在VHDL中信号(signal)代表硬件连线因此可以是逻辑门的输入输出同时信号也可表达存贮元件的状态端口也是信号y在进程process中信号是在进程结束时被赋值因此在一个进程中当一个信号被多个信号所赋值时只有最后一个赋值语句起作用如下例Sig_p process(A B CbeginD <= A----- ignored!!X <= C or DD <= B---- overrids !!Y <= C xor Dend上面实际的结果是 B赋值给D C xor B结果赋值给X Yy变量不能表达连线或存贮元件变量的赋值是直接的非预设的变量将保持其值直到对它重新赋值如下例Ver_p process(A B Cvariable d STD_LOGICbegind = AX <= C or dd = BY <= C xor dend process实际结果是 X <= C or A Y<= C xor B5.1.4 实体5.1.4.1实体结构体使用规定y library IEEE use IEEE.std_logic_1164.all除IEEE大写外其余小写4y实体名和结构体名必须用大写标识实体名必须与文件名同名自定义的其他标识符如信号名变量名标号等不得与实体名结构体名同名y实体端口数据模式不准使用buffer模式缓冲模式主要用在实体内部可读的端口如计数器的输出为简化大型设计各模块间接口的配合要求不要使用需要反馈的信号可定义内部信号来解决如计数器端口Count 可内部定义信号 signal Cnt8_q STD_LOGIC_VECTOR(7 downto 0)Cnt8_q 该信号可在内部反馈最后通过赋值语句Count <= Cnt8_q 来实现端口的定义y实体端口数据类型规定实体端口的数据类型采用IEEE std_logic_1164 标准支持的和提供的最适合于综合的数据类型STD_ULOGIC STD_LOGIC和这些类型的数组不采用IEEE 1076 /93 标准支持和提供的BITBIT数组INTEGER及其派生类型这是为保证模拟模型和综合模型的一致性及减少转换时间和错误y一个文件只对应一个实体实体是设计文件的基本单元其书写规范要求如下y一条语句占用一行每行应限制在80个字符以内y如果较长超出80个字符则要换行y代码书写要有层次即层层缩进格式清晰美观y要有必要的注释25%y实体开始处应注明文件名功能描述引用模块设计者设计时间及版权信息等如-- Filename ﹕-- Author ﹕-- Description ﹕-- Called by ﹕Top module-- Revision History ﹕99-08-01-- Revision 1.0-- Email ﹕ M@--Company ﹕ swip Technologies .Inc--Copyright(c) 1999, swip Technologies Inc, All right reservedlibrary IEEE;use IEEE.std_logic_1164.all;entity ENTITY_NAMEport(Port1 : in STD_LOGIC;Port2 : in STD_LOGIC;5Port3 : out STD_LOGIC;..Portn : out STD_LOGIC);end ENTITY_NAME ;architecture BEHAVIOR of ENTITY_NAME isbeginStatements;end BEHAVIOR ;5.1.4.2 实体使用建议y实体名的命名建议能大致反映该实体的功能如COUNTER88位宽的计数器模块DECODER383-8线译码器模块y行为级的结构体名命名为 BEHAVIOR 结构级的结构体名命名为STRUCTURE若有多个结构体用后缀A B...... 命名如architecture BEHAVIOR of COUNTER8 isbegin.....end BEHAVIOR;y一个实体可以有多个结构体对单个结构体的实体文件要包含结构体和实体说明便于查阅对多个结构体的实体建议把常用的结构体放在文件中其余结构体用单独文件表示使用时用configuration语句进行配置y结构体的描述分为行为级描述数据流描述和结构化描述若无特殊要求建议采用行为级描述和数据流的描述不采用结构化描述或BOOLEAN数据流的描述y VHDL设计中如果可以避免采用器件厂商的专用元件库硬Core则尽量不要使用除非只有采用该库元件才能实现你设计的性能指标这是因为要充分利用VHDL独立于工艺且易于维护的优点5.1.4.3 实体使用注意内容y VHDL设计应是层级型的设计VHDL设计实体由实体说明和结构体组合而成实体是一个设计的基本单元模块即顶层的设计模块由次一级的实体构成每个次一级实体又可由再下一层次的实体构成最低层模块可以是表达式或最基本的实体模块构成这种设计方法就是Top-To-down 的设计方法y实体端口模式为in out buffer inout模式为in的信号不能被驱动模式out的信号不能用于反馈同时必须仅被一个信号所驱动缓冲模式的端口不能被多重驱动除非用决断函数解决外同时仅可以连接内部信号或另一个实体的缓冲模式的某个端口y VHDL设计各模块接口定义时要考虑模块间配合的方便如实体端口的模式端口的数据类型等65.1.5语句5.1.5.1 VHDL各语句使用规定y with-select-when语句书写规范规定with- select - when语句提供选择信号赋值是根据选定信号的值对信号赋值代码的书写规范为with selection_signal selectSelect_name <= value_a when value_1_of_selection_signalvalue_b when value_2_of_selection_signalvalue_c when value_3_of_selection_signal.......value_x when last_value_of_selection_signaly with- select - when语句的selection_signal的所有值必须具备完整性若没写完整必须有一个others语句如下三个写法其综合的效果是一致的因为S的元素不是已知的逻辑值X将不被定义但对RTL仿真而言其结果是不一致的这是因为RTL仿真支持多值元素with S selectX <= A when “00”,B when “01”,C when “10”,D when others;with S selectX <= A when “00”,B when “01”,C when “10”,D when “11”,D when others;with S selectX <= A when “00”,B when “01”,C when “10”,D when “11”,“--” when others;建议不使用第三种写方法y with- select - when语句中对有相同的支项可合并书写如X <= A when “00” | “10”y when_else语句书写规范规定7when_else 语句提供为条件信号赋值即一个信号根据条件被赋一值代码书写规范为Signal_name <= value_a when condition1 elsevalue_b when condition2 elsevalue_c when condition3 else........value_xy当条件是表达式时表达式须用括起来使代码更为清晰如when a = b and C= 1elsey if必须有一个else对应除在如下面例子的情况下可不写else语句例process( Clk,Rst)beginif ( Rst = '1') thenQ <= '0';elsif ( Clk ‘event and Clk = ‘1’) thenQ <= D;end if;end process;当没有else语句时将产生不希望的存储器y case-when语句书写规范规定该语句用于规定一组根据给定选择信号的值而执行的语句可用with-select-when语句等效代码的书写规范为case- selection_signal iswhen value1_of _selection signal =>Statements1;when value2_of _selection signal =>Statements2;....when last_value_of _selection signal =>Statements x ;when others =>Statements x;end case;y case_when语句必须有when others支项y若信号在if-else或case-when语句作非完全赋值必须给定一个缺省值y process显示敏感列表必须完整对有Clk 的 process不同综合工具有不同的要求有些只要写Clk和Rst就可建议根据具体情况简化设计书写y有clk的process的敏感列表中为方便修改敏感列表书写规范如下Lab process Clk, Rstlist1list2,....beginy每个process前须加个labley不同逻辑功能采用不同的process进程块把相同功能的放在同一进程中如触发器组进程块D_p : process(Clk,Rst,D1,D2,...,Dn)beginif (Rst = '1' ) thenQ1 <= '0' ;Q2 <= '0' ;...Qn <= Dn;elsif (Clk 'event and Clk = '1') thenQ1 <= D1;Q2 <= D2;...Qn <= Dn;end if;end process;y generate语句书写规范规定在需要重复生成多个器件如多个器件的重复例化时使用生成机构可简便代码书写如下32位总线的三态缓冲器的例化Gen_lab1: for I in 0 to 31 generateinst_lab: threestate port map(Din => Value(i),Rd => Rd,Dout => Value_out(i));end generate;y生成机构必须有一个标号如上的Gen_lab1y if-then用在生成机构中不能有else或elsif语句如下复杂的生成机构语句G1for I in 0 to 3 generateG2for j in 0 to 7 generateG3if (I <1 ) then generateUa : thrst port map( Val(j),Rd,Val_out(j));end generate;G4if (i = 1) then generate .......y port map语句书写规范规定Uxx Module_nameport mapport1 => port 1,port2 => port2,.....portn => port n)y为便于阅读port map采用名字对应=>映射方法y port map中总线到总线映射时X downto Y要写全y向量采用降序方法即 X downto Y 格式向量有效位顺序的定义为从大数到小数y port map的module 设计者自编写的entity名用Uxx标识cell如厂家提供的库元件RAM Core等名用Vxx 标识5.1.5.2 VHDL 语句使用建议y作为可综合的代码编写-值建议不用如下一个代码with tmp selectX <= A when “1---”,B when “-1--”,C when “--1-”,D when “---1”,0when others该代码在RTL级仿真中不会出错但在综合过程中可能编译出错视综合工具而定y由于不同综合工具支持能力问题建议不采用wait语句即不使用隐式敏感表5.1.5.3 VHDL 语句使用注意内容y when_else语句具有优先级第一个when条件级别最高最后一个最低可用顺序语句的if-else替代书写时必须考虑敏感路径y当信号的值为不相关的值时最好用选择信号赋值语句如多路选择器当信号的值为相关时选用when-else语句如编写优先编码器y注意If--elsif---elsif---else的优先级最后一个else 优先级最低必须把关键路径放在优先级高的语句中5.1.6 运算符(operator)5.1.6.1 表达式书写规定为便于理解用表示逻辑运算符执行的优先级如X <= ( A and B ) and ( C or not D)建议运算操作符两边都加上空格如5.1.6.2比较运算符规定向量比较时比较的向量的位宽要相等否责会引起warning或error除非重载等值比较运算符调用numeric_std 库5.1.7 function5.1.7.1 function 使用规定y function代码书写规范规定function FUNCTION_NAME (参数1参数类型参数2参数类型.......return返回类型isbegin顺序语句end实例见附录6.35.1.7.2function 使用建议y函数主要用于类型的转换或重载运算符的定义对于使用IEEE1164标准的面向综合的VHDL设计采用std_logic 类型不必考虑与bit类型的转换可调用 numeric_std 标准程序包实现类型转换和 + 运算符的重载建议少用厂家提供的函数或自定义的类型转换函数y对多次重复的表达式可用一个函数来定义5.1.7.3function使用注意内容y函数参数只能是输入类型不能被赋值修改y只能有一个返回值y定义函数必须为顺序语句且其中不能定义新的信号但可在函数说明域中说明新的变量并在定义域中对其赋值y函数在结构体说明域中或程序包中定义见附录6.35.1.8 procedure5.1.8.1 procedure使用规定y procedure 书写规范规定procedure PROCEDURE_NAME signal参数名模式类型signal参数名模式类型... isbegin过程体end procedure5.1.8.2 procedure使用注意内容y过程用于数值运算类型转换运算符重载或设计元件的最高层设计结构y过程参数缺省模式为in5.1.9 类属( generics)5.1.9.1 generic使用注意内容y类属为传递给实体的具体元件的一些信息如器件的上升下降沿的延时信息对应类属为rise fall用户定义的数据类型如负载信息对应类属为load及数据通道宽度信号宽度等y对大型设计建议使用类属来构造参数化的元件其调用的方法为Uxx : 参数化的实体名generic map实参port map (端口映射表见附录6.5y若元件的类属在定义时已经指定默认值在调用时若不改变该参数值可不用定义实参的映射即map实参可不写5.1.10 package5.1.10.1 package使用建议y对大型设计建议把全局的常量如数据宽度等指令状态编码元件组函数和子程序组分别用元素包器件包函数包来构造如通过调用元件程序包实体的结构体说明区域中就不必再对调用的器件进行component说明y程序包通过use语句使之可见可通过保留字all使包中所有单元都可见如use work..yourpacketname.all;其中yourpacketname是你的packet名5.1.10.2package使用注意内容y程序包包括程序包说明和可选包体程序包说明用来声明包中的类型元件函数和子程序包体则用来存放说明中的函数和子程序y不含有子程序和函数的程序包不需要包体见附录6.4y程序包中的类型常量元件函数和其他说明对其他设计单元是可见的5.1.11 FSM有限状态机5.1.11.1 FSM 使用规定y VHDL 的FSM为双进程的有限状态机即组合逻辑进程定义次态的取值时序逻辑进程定义时钟上升沿来时次态成为现态y VHDL的FSM 不必为状态分配而用行为级的枚举类型定义状态根据需要在综合时选择状态的分配方式如 one-hot 或二进制编码y状态机在上电时必须明确进入一个初始状态y必须包括对所有状态都处理不能出现无法处理的状态不能使状态机进入死循环5.1.12 Comments5.1.12.1 Comments 使用建议y对更新的内容尽量要做注释y模块端口信号要做简要的功能描述y语法块做简要介绍5.1.13 TAB键间隔对TAB键的间隔我们建议采用4个字符这与许多软件的缺省设置是一致的并且VHDL语言中大多数保留字也是4个字符5.1 代码模块划分模块设计的好坏直接影响着系统的设计好坏模块设计的不好会给后面的设计流程带来许多麻烦设计模块的基本原则是1.有利于模块的可重用性模块设计得好可节省大量的重复工作并且为以后的设计带来方便2.在组合电路设计中应当没有层次可提高代码的可读性另外一方面是综合的时候方便并且时序较易满足3.每个模块输出尽量采用寄存器输出形式这样设计是有利于时序的满足4.模块的按功能进行划分划分要合理5.模块大小应适中不能太大也不能太小一般为2000门左右具体情况应当依据综合工具的性能而定6.模块的层次应当至少有三级可将一个设计划分为三个层次TOP MID功能COREy TOP包括实例化的MID和输入输出定义如果用综合工具插入管脚则可不要此层次y MID由两部分组成1时钟产生电路如分频电路和倍频电路2功能CORE的实例化y功能CORE包括各种功能电路的设计一个复杂的功能可以分成多个子功能来实现即再划分子层5.2代码编写中容易出现的问题5.2.1资源共享问题资源共享的主要思想是通过数据缓冲或多路选择的方法来共享数据通路的工作单元在VHDL设计中资源共享必须与敏感路径问题进行综合考虑后采用适当的设计方法如R <= ( A + B) when (Source = ‘1’) else( C + D)综合工具可综合成以下两种情况当在综合工具选中Resource Sharing 时将资源共享一个加法器这时A B C或D到R是关键路径如果关键路径是Source 到R则不要要求资源共享需要资源共享时可改成如下写法建议采用该方式R <= A when (Source = ‘1’) elseC;S <= B when (Source = ‘1’) elseD;F <= R + S;5.2.2组合逻辑描述的多种方式对组合逻辑的描述有多种方式其综合结果是等效的以4bit的与门为例C <= A and B;等效于C3 <= A3and B3C2 <= A2and B2;C1 <= A1and B1;C0 <= A0and B0;等效于for I in 3 downto 0 loopC i< = A i and B i;end loop;可以选择简洁的写法.5.2.3 考虑综合的执行时间通常会推荐将模块划分得越小越好事实上要从实际的设计目标面积和时序要求出发好的时序规划和合适的约束条件要比电路的大小对综合时间的影响要大要依照设计的目标来划分模块对该模块综合约束的scripts也可以集中在该特性上要选择合适的约束条件过分的约束将导致漫长的综合时间最好在设计阶段就做好时序规划通过综合的约束scripts来满足时序规划这样就能获得既满足性能的结果又使得综合时间最省5.2.4 避免使用Latch使用Latch必须有所记录不希望使用Latch时应该对将条件赋值语句写全如在if语句最后加一个else case语句加others不完整的if和case语句导致不必要的latch的产生下面的语句中DataOut会被综合成锁存器如果不希望在电路中使用锁存器它就是错误process Cond)beginif (Cond = ‘1’) thenData_out <= Data_inendend process5.2.5多赋值语句案例三态总线一根总线上挂多个三态电路时必须用多个进程来表示如Tri_p1: process (Sel_a,A)beginif (Sel_a = ‘1’) thenT <= A;elseT <= ‘Z’;end if;end process;Tri_p2: process (Sel_b,B)beginif (Sel_b = ‘1’) thenT <= B;elseT <= ‘Z’;end if;end process;为什么不能在一个process中进行处理呢如下所示Error : process (Sel_a,A,Sel_b,B)beginif (Sel_a = ‘1’) thenT <= A;elseT <= ‘Z’;end if;if (Sel_b = ‘1’) thenT <= B;elseT <= ‘Z’;end if;end process;这是因为上述两个if语句彼此没有优先级又由于是对同一个信号信号T进行处理则后一个处理会覆盖前一个处理正确的做法是将这两个if语句放在两个process中进行注意只有三态电路才可以在多个process中出现其它非三态电路若是在多个process中出现的话有的综合工具会报告短路错误即多驱动问题但在语法检查时不一定报错6附录6.1 VHDL保留字VHDL语言的保留字如下absaccess after alias all and architecture array assert attribute begin block buffer bus case component configuration constantdisconnect downto else elsif end entity exit file for functiongenerate generic group guarded if impure in inertial inoutis label library linkage literal loop map mod nand new next nor not null of on open or others out package portpostponed procedure process pure range record register reject remreport return rol ror select severity signal shared sla sll sra srl subtype then to transport type unaffected units until usevariablewait when while with xnor xor另外对不同的厂家也有相应的保留字要求可参见相应厂家提供的资料6.2 VHDL 编写范例-- Filename ﹕Div5.vhd-- Author ﹕zhouzhijian-- Description ﹕Five division-- Called by ﹕Top module-- Revision History ﹕99-08-01library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use IEEE.std_logic_arith.all;entity DIV5 isport(Rst: in STD_LOGIC;Mclk: in STD_LOGIC;Div5_clk: out STD_LOGIC);end DIV5;architecture BEHAVIOR of DIV5 issignal Cnt3_q: STD_LOGIC_VECTOR(2 downto 0);signal Cnt3_d: STD_LOGIC_VECTOR(2 downto 0);signal Div0: STD_LOGIC;signal Div1: STD_LOGIC;beginCnt_pd : process(Cnt3_q)beginif (Cnt3_q = “100”) thenCnt3_d <= “000”;elseCnt3_d <= Cnt3_q + 1;end if;end process;Cnt_pq : process(Rst,Mclk)beginif (Rst = '1') thenCnt3_q <= "000";elsif (Mclk = '1' and Mclk'event) thenCnt3_q <= Cnt3_d;end if;end process ;Div0_P : process(Rst,Mclk)beginif (Rst = '1') thenDiv0 <= '1';elsif( Mclk = '1' and Mclk'event ) thenif (Cnt3_q = "100") thenDiv0 <= '1';elsif (Cnt3_q = "001") thenDiv0 <= '0';elseDiv0 <= Div0;end if;end if;end process ;Div1_P : process(Rst,Mclk)beginif (Rst = '1') thenDiv1 <= '0';elsif (Mclk = '0' and Mclk'event) thenDiv1 <= Div0;end if;end process ;Div_clk <= Div0 or Div1;end BEHAVIOR;建议用双进程来实现带有复杂的同步复位置位的寄存器信号设计如上计数器的写法对Div0也可类似地书写6.3 函数书写实例以下是一个使用多表决函数的全加器-- Filename ﹕FullAdd.vhd-- Author ﹕suwenbiao-- Description ﹕A example of function-- Called by ﹕Top module-- Revision History ﹕99-08-01library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;entity FULLADD isport(A: in STD_LOGIC;B: in STD_LOGIC;Carry_in: in STD_LOGIC;Sum: out STD_LOGIC;Carry_out: out STD_LOGIC);end FULLADD;architecture BEHAVIOR of FULLADD isfunction Majority (A,B,C : STD_LOGIC)return STD_LOGIC isbeginreturn (( A and b) or (A and C) or ( B and C ));end Majority;beginSum <= A xor B xor Carry_in;Carry_out <= Majority(A,B,Carry_in);end BEHAVIOR;6.4 程序包书写实例-- Filename ﹕My_pkg.vhd-- Author ﹕suwenbiao-- Description ﹕A example of Package-- Called by ﹕Top module-- Revision History ﹕00-03-18library IEEE;use IEEE.std_logic_1164.all;package MY_PKG is-- Defined constantconstant NUM64K : integer := 65636;constant EXT_RAM_ADD_WIDTH : integer := 16;constant HW_NUM : integer := 4;constant CELL_OUTPUT_CHANNEL_WIDTH : integer := 5;constant INPUT_CHANNEL_WIDTH : integer := ADDRESS_BUS_WIDTH;constant QUEUE_WIDTH : integer := 5;constant WORD_LENGTH_WIDTH : integer := 6;--Define subtypeconstant QUEUE_OVERFLOAT_WIDTH : integer := 16;subtype QUEUE_OVERFLOAT_VECTOR isSTD_LOGIC_VECTOR(QUEUE_OVERFLOAT_WIDTH-1 downto 0);--Defined Reg groupcomponent Rddf1port(Clk: in STD_LOGIC;Rst: in STD_LOGIC;D: in STD_LOGIC;Q:out STD_LOGIC);end component;component Rreg1port(Clk: in STD_LOGIC;Rst: in STD_LOGIC;Load: in STD_LOGIC;D: in STD_LOGIC;Q:out STD_LOGIC);end component;component Rreggeneric(Size: integer := 2);port(Clk: in STD_LOGIC;Rst: in STD_LOGIC;Load: in STD_LOGIC;D: in STD_LOGIC_VECTOR( Size - 1 downto 0);Q:out STD_LOGIC _VECTOR( Size - 1 downto 0));end component;end Reg_pkg;6.5 参数化元件实例-- Filename ﹕Reg_group.vhd-- Author ﹕suwenbiao-- Description ﹕A example of Reg Group with generic size-- Called by ﹕Top module-- Revision History ﹕00-03-18library IEEE;use IEEE.std_logic_1164.allentity REG_GROUP isgeneric (Size : integer : = 2);port(Clk: in STD_LOGIC;Rst: in STD_LOGIC;Load: in STD_LOGIC;D:in STD_LOGIC_VECTOR(Size - 1 downto 0);Q: out STD_LOGIC_VECTOR(Size - 1 downto 0) );end REG_GROUP;architecture BEHAVIOR of REG_GROUP isbeginR_p: process(Clk,Rst)beginif (Rst = ‘1’) thenQ <= (others => ‘0’) ;elsif(Clk ‘event and Clk = ‘1’) thenQ <= D;end if;end process;end BEHAVIOR;调用语句U1 REG_GROUP map(4) port map (Clk=> Clk,Rst=>Rst,Load=>Load,D=>D,Q=>Q );则该寄存器数据宽度为4。

VHDL详细语法教程

VHDL详细语法教程

VHDL详细语法教程VHDL(Very High Speed Integrated Circuit HardwareDescription Language)是一种硬件描述语言,用于对数字电路进行描述、建模和仿真。

它是一种用于描述数字系统结构和行为的语言,广泛用于FPGA(Field Programmable Gate Array)和ASIC(ApplicationSpecific Integrated Circuit)设计中。

VHDL语言具有丰富的语法结构,可以描述数字系统的结构和行为,并可以进行仿真和综合。

下面是VHDL语言的详细语法教程:1. 实体声明(Entity Declaration):VHDL代码的第一部分是实体声明,用于定义设计的接口和名称。

实体声明是设计的顶级结构,它包含输入输出端口的定义。

语法格式如下:```vhdlentity entity_name isportport_name : in/out type;port_name : in/out type;...end entity_name;```其中,entity_name为实体名称,port_name为端口名称,type为端口类型,in表示输入端口,out表示输出端口。

2. 结构体声明(Architecture declaration):在实体声明后,需要定义该实体的结构和行为。

这一部分被称为结构体声明。

语法格式如下:```vhdlarchitecture architecture_name of entity_name issignal signal_name : type;...begin...end architecture_name;```3. 信号声明(Signal declaration):信号用于在VHDL代码中传输数据。

通过信号声明,可以定义存储或传输数据的变量。

信号声明需要在结构体声明的前面进行。

语法格式如下:```vhdlsignal signal_name : type;```其中,signal_name为信号名称,type为信号类型。

VHDL 文字规则

VHDL 文字规则

-- (十进制表示,等于 170)
d2 <= 16#FE# ;
-- (十六进制表示,等于 254)
d3 <= 2#1111_1110#;
-- (二进制表示,等于 254)
d4 <= 8#376#
;
-- (八进制表示,等于 254)
d5 <= 16#E#E1
; -- (十六进制表示,等于2#1110000#,等于224)
非法的标识符:
_Decoder_1
-- 起始为非英文字母
2FFT
-- 起始为数字
Sig_#N
-- 符号“#”不能成为标识符的构成
Not-Ack
-- 符号“-” 不能成为标识符的构成
RyY_RST_
-- 标识符的最后不能是下划线“_”
data_ _BUS
-- 标识符中不能有双下划线
return
-- 关键词
EDA技术实用教程
VHDL文字规则
1.1 数字
整数:整数都是十进制的数, 实数文:实数也都是十进制的数,但必须带有小数点,
以数制基数表示的文字:用这种方式表示的数由五个部分组成。
SIGNAL d1,d2,d3,d4,d5, : INTEGER RANGE 0 TO 255;
d1 <= 110#170# ;
data4 <= B"101_010_101_010" -- 二进制数数组,位矢数组长度是12
data5 <= "101_010_101_010" --表达错误,缺B。
data6 <= "0AD0"
--表达错误,缺X。
VHDL文字规则
1.3 标识符
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VHDL代码书写规范(定稿)文件编号:编制:审核:可靠性审核:标准化:批准:文件会签页文件历史记录文件编号现行版本V1.0 文件标题VHDL代码书写规范文件履历版次编制日期更改内容(条款)V1.0V1.0目录1.目的 (1)2.范围 (1)3.术语说明 (1)4.书写规范 (1)4.1命名规范 (1)R1.一个文件只包含一个模块,文件命名和实体命名必须相同。

文件名大写,其后缀小写。

(1)R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。

顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称) (1)R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。

(2)R4.命名要有实际意义。

(2)R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。

信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。

(2)R6.模块、信号、变量等的命名不大于64个字符 (2)R7.实体、结构名、端口信号、常量用大写标识 (2)R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。

如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。

(3)R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

(3)R10.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。

(3)R11.模块内部定义的信号、变量采用首字母大写命名。

首字母符合说明的要求。

(3)R12.非顶层模块端口信号命名方式采用I_portname、O_portname和IO_portname分别对应输入、输出和双向端口信号。

(3)R13.时钟信号必须用后缀“_clk”进行命名。

(3)R14.对于微处理器接口的寄存器,必须包含reg标志。

用下划线分开该寄存器功能特征。

(4)R15.对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。

多次采样加数字区分。

(4)R16.一些常用的基本信号按说明统一后缀命名。

(4)R17.多比特信号,应该使用相同的比特顺序,都采用downto描述。

(5)R18.VHDL的保留字用小写。

(5)R19.调用IEEE 标准库时,“IEEE”用大写,其它用小写。

(5)4.2注释规范 (5)R20.每个VHDL源文件应该在文件头注释文件的基本信息。

(5)R21.每个信号、变量、常量和端口的定义都要有注释。

(5)R22.每个进程使用“--------”隔开。

如果一个功能模块由几个进程组成,使用”--*****”隔开。

(5)R23.对于内部表,注释说明表的组成、表的内容及作用。

(6)4.3其它书写规范 (6)R24.用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格。

(6)R25.每行字符数,最大不能超过120。

(6)R26.模块端口每行定义一个。

先根据端口功能进行区分,然后再根据输入输出方向进行区分,类间用空行分开。

(6)R27.调用模块使用“=>”方式进行端口映射,总线到总线映射时(x downto y)要写全。

(6)R28.调用模块进行端口映射时,一行代码只映射一个信号。

顺序必须与原模块保持一致 (6)R29功能集中或有很强的相关性的变量信号声明放在一起,类间用空行或注释分开。

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

(6)R31.运算符与信号之间必须有空格分开 (7)1.目的规范VHDL的书写风格,保证代码的可读性、可重用性和可移植性,并且要与现有的EDA工具保持一致,从而形成对VHDL代码的标准化管理。

2.范围本标准规定了VHDL代码书写规范。

本标准适用于G-LINK公司研发中心。

3.术语说明本规范使用的术语解释如下:级别:指该规则遵循的级别,有两个级别,分别为推荐和规定。

推荐:表示在一般情况下必须遵循该规则。

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

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

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

正例:对此规则或准则给出的正确示例。

反例:对此规则或准则给出的反面示例。

4.书写规范4.1命名规范R1.一个文件只包含一个模块,文件命名和实体命名必须相同。

文件名大写,其后缀小写。

级别:规定说明:文件类型为.vhd。

如果文件名与实体名不一致,有些编译器不能识别,而且名字不一致,也不利于将文件与模块对应,不利于文件的管理。

正例:文件名是SER_TSP.vhd,那么文件内部实体的命名就是entity SER_TSP isport(……);end SER_TSP;architecture ARC_SER_TSP of SER_TSP is……end ARC_SER_TSP;R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。

顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称)级别:规定说明:一般顶层文件命名使用工程名加器件名再加“_TOP”,如“OTDR_ XC3S1000BGA456_TOP”, 顶层文件的元件实例化,后缀使用_module,第二层文件的元件实例化,后缀使用_block,第三层之后不做定义(若遇到常见的基本逻辑电路,如:SRAM、FIFO等,那么按照SRAM、FIFO命名规则为优先)。

正例:文件名是OTDR_XC3S1000BGA456_TOP.vhd,那么设计实体内部的结构如图1所示:OTDR_XC3S1000BGA456_TOP.vhdAD9051_moduleSync_moduleSync_corr_blockSync_corr_sramSync_corr_fifo图1 设计实体内部的结构R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。

级别:规定说明:命名约定包括模块命名、端口信号命名(确保工程的顶层文件的端口与原理图设计保持一致)、端口信号引脚分配说明(是否是特殊引脚或是普通I/O脚)等。

在整个系统的研发过程中,FPGA与其它电路模块(CPU/模拟电路/通信接口等)之间的关系是非常密切的,为了处理好FPGA与其它电路模块之间的相互联系,我们必须以文档的形式,清晰地说明输入输出端口的特性以及FPGA内部所完成的功能,才能使整个研发团队之间的合作更加顺畅。

正例:①FPGA与ARM微处理器之间采用SPI通信协议;②SPI通信接口分别是:SPI_CLK、SPI_MISO、SP_MOSI、SPI_CS;③SPI通信接口的引脚分配均为普通I/O引脚。

R4.命名要有实际意义。

级别:规定说明:具有一定意义的命名比写上好几行的注释要好得多。

正例:如全加器模块(FULL_ADDER)、半加器子模块(HALF_ADDER)和时钟信号锁相环模块(CLK_SHIFT_PHASE_PLL)等R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。

信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。

级别:规定说明:由于某些综合工具对于总线类型的信号,综合的结果为总线名加上数字编号。

如果信号、变量名最后一个字母也使用数字的话,容易混扰。

正例:Pulse_FFT、AD_State、Address反例:PulseFFT、ADState、Address8R6.模块、信号、变量等的命名不大于64个字符级别:规定说明:太长的命名不方便阅读。

R7.实体、结构名、端口信号、常量用大写标识级别:规定说明:使用大写容易与一般的信号、变量区分。

R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。

如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。

级别:规定表1 实体命名方式描述方式命名方式行为级描述BEH_实体名结构级描述STR_实体名数据流级描述RTL_实体名混合级描述ARC_实体名R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM 模块命名以ROM作后缀;FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。

级别:规定示例:如大小为512X8的双口RAM(其中512为数据深度,8为数据宽度),命名顺序为功能、存储容量和器件类型:Function_512x8_dpram,调用时,例化名可以为U_Function_512x8_dpram,其中Function说明双口RAM的作用。

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

级别:推荐说明:因为综合、布线工具的工具,一般都将使用实例标志输出报告,如果没有表示模块的名字,不利于阅读报告。

其中n表示多次实例化的编号,xx表示模块调用的特性(如用途等)。

如果只调用一次,那么就不必使用数字,直接就是‘U_xx_元件名’示例:如HDLC发送模块hdlc_trans,调用时例化名可以为:U0_hirs_hdlc_trans,U1_e1_hdlc_trans;对于三态输出单元tri,调用时例化名可以为M_cpuio_tri。

R11.模块内部定义的信号、变量采用首字母大写命名。

首字母符合说明的要求。

级别:规定说明:首字符要求如表1所示:表1 模块内部定义数据对象的首字符要求例子说明信号S_cpu_addr 信号使用“S_”开头变量V_data_buf 变量使用“V_”开头常量C_RSSI_ADDR 常量使用“C_”开头数组A_rssi 数组使用“A_”开头R12.IO_portname分别对应输入、输出和双向端口信号。

级别:规定说明:“I_”表示输入;“O_”表示输出;“IO_”表示双向。

相关文档
最新文档