VHDL语言编写规范基础:标识符命名/数据对象/信号、变量和常量

编程语言及工具

104人已加入

描述

标识符命名规范

标识符用于定义实体名、结构体名、信号和变量名等,选择有意义的命名对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,有利于提高代码的可读性。

1.1 标识符习惯命名规则

1.1.1 标识符定义命名规定

标识符第一个字符必须是字母,最后一个字符不能是下划线,同时不允许出现连续两个下划线。基本标识符只能由字母、数字和下划线组成,标识符两词之间须用下划线连接,如 Packet_addr, Data_in, Mem_wr, Mem_ce。标识符不得与保留字同名,VHDL规定的保留字见1.3。

1.1.2 标识符大小写规定

通常情况下,常量、数据类型、实体名和结构体名采用全部大写,变量采用小写,信号仅第一个词首字符采用大写,保留字一律小写。

1.2 信号名习惯命名规则

1.2.1 信号名缩写规定

信号名常采用缩写形式以便书写和理解,单词缩写中信号名的第一个单词首字符通常大写,例如Addr_in。采用缩写时应保证同一信号在模块中和不同层次内的一致性。

部分常用的缩写为:

Addr address; Clk clock; Clr clear; 

Cnt counter; En enable; Inc increase; 

Lch latch; Mem memory; Pntr pointer; 

Pst preset; Rst reset; Reg register; 

Rd reader; Wr write;

ROM; RAM; CPU; FIFO; ALU; CS; CE

1.2.2 信号名命名建议

信号名应当使用有意义而且有效的名字,能简单包含该信号的全部或部分信息,如:Data_in(数据输入)、Din(单根数据线输入)、FIFO_out(FIFO数据总线输出)、Cnt8_q(8位计数器输出信号)。

信号名采用明确且有意义的后缀 ,常用的后缀如下:

后缀 含义
_clk 时钟信号
_d 寄存器的数据输入信号
_q 寄存器的数据输出信号
_z 三态输出信号
_L 信号延迟时钟周期
_s 实体端口信号的反馈信号
_en 使能控制信号
_n 求反信号
_xi 芯片原始输入信号
_xo 芯片原始输出信号
_xod 芯片漏极开路输出
_xz 芯片三态输出
_xbio 芯片双向信号

说明:

采用D触发器对信号进行延迟、延迟信号的命名在原信号名之后加后缀_L,若是在流水线设计中有级延迟,再分别加后缀_L1、_L2.....(L表示lock);模块内的反馈信号,在原信号名之后加后缀_s(s表示same)。

1.3 VHDL保留字

VHDL的保留字汇总如下:

absaccess after alias all and architecture array assert  attribute begin block buffer bus case component configuration constant disconnect downto else elsif end entity exit file for function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed 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 xor

02

数据对象与类型

2.1 数据对象与类型概述

VHDL是很强的类型语言,其数据对象和类型汇总见下表:(其中红色字体为不可综合的数据对象和数据类型)

数据对象 数据类型
Scalar types (标量数据类型)
1 Enumeration (可枚举数据类型)
2 Integer (整数数据类型)
3 Physical (物理数据类型)
4 Floating point (浮点数据类型)
Composite (复合数据类型)
1 Array (数组数据类型)
2 Record (记录数据类型)
Access (寻址数据类型)
Constant (常量)
Variable (变量)
Signal (信号)
File (文件)

不同基本类型的数据不能由另一类型赋值,不同类型间的赋值需使用运算符的重载,例如Cnt8_q为STD_LOGIC_VECTOR类型,若不调用相关库(使用use IEEE.std_logic_arith.all 语句)对 ‘+’ 运算符进行重载,则 Cnt8_q <= Cnt8_q + 1 语句在综合中将报错。

通常情况常量名和数据类型菜用大写标识符表示。

2.2 数据类型使用建议与注意内容

为改善代码的可读性,可把常用的常量和自定义的数据类型在程序包中定义;使用别名来标识一组数据类型有利于使代码更清晰,如 

signal Addr STD_LOGIC_VECTOR(31 downto 0); 

alias Top_addr STD_LOGIC_VECTOR(3 downto 0) is Addr(31 downto 28) ;

可枚举类型的值为标识符或单个字母的字面量是区分大小写的,如 Z 与z 是两个不同的量。

03

信号、变量与常量

3.1 信号、变量与常量的含义

VHDL常用的数据类型主要有信号、变量与常量这三类,不同类型的数据有各自不同的含义:

3.1.1 信号(signal)

信号是VHDL语法中最重要、最常用的一种可赋值对象,一般对应电路中特定的物理连线或存储单元。除在模块内部声明的signal数据外,VHDL模块的port结构中in、out、buffer或者inout类型的端口也是signal类型的。

3.1.2 变量(variable)

变量在VHDL代码中不具有特定的物理意义,对应关系也不太直接。作为一个局部量,变量通常只代表某些值暂存的载体。

3.1.3 常量(constant)

常量在VHDL具有特定的物理意义,通常对应数字电路中的电源或者地。常量能出现在所有信号和变量出现的场合,定义常量的主要目的是为了使设计实体中的某些量易于阅读和修改。

3.2 信号、变量与常量的声明与赋值

VHDL数据在调用前需要进行声明与赋值操作,不同数据类型的数据声明与赋值的位置和方式有所不同:

ARCHITECTURE ... OF ... IS

       SIGNAL 信号1:数据类型;

--信号声明在这里,在ARCHITECTURE的BEGIN之前

       BEGIN

       PROCESS(...)

       VARIABLE 变量1:数据类型;

--变量声明在这里,在PROCESS的BEGIN之前。

       BEGIN

       END PROCESS;

END;

3.2.1 信号的声明与赋值

信号通常在结构体内部,进程、子程序及函数外部声明;在进程中,信号赋值仅在进程结束时起作用,即不能够为同一信号多次赋值。

信号声明:SIGNAL 信号名:数据类型 := 初值;  

信号赋值:信号名 <= 数值;

3.2.2 变量的声明与赋值

变量通常只能在进程、子程序和函数内部声明;变量的赋值是立即起作用的,即变量值在赋新值时立刻改变。

变量声明:VARIABLE 变量名:数据类型 := 初值;

变量赋值:变量名 := 数值/表达式;

3.2.3 常量的声明与赋值

常量可以在信号和变量出现的所有场合进行声明,通常情况下,常量不能单独赋值,仅能在声明的同时被初始化赋值。

常量声明:CONSTANT 常量名:数据类型 := 表达式;

3.3 使用建议与注意内容

1. 信号通常情况下不允许赋初值:

尽管当前主流FPGA均支持数据赋初值,但是为避免硬件可能出现的问题,通常不在信号声明时赋初值,而是采用复位时赋值的方法来赋初值。

2. 变量在可综合模块中不建议使用:

变量主要用在高层次的模拟模型建模及用于运算的用途,由于变量的综合较难定义,对于编写可综合的VHDL模块,在没有把握综合结果情况下不建议使用。

3. 信号在进程中赋值情况解释:

signal_assign: process(A,B,C)

begin

D <= A;----- ignored!!

X <= C or D ;

D <= B ;---- overrids !!

Y <= C xor D ;

end;

上面代码的实际运行结果是:B赋值给D,C or B的结果赋值给X,C xor B的结果赋值给Y。

4. 变量在进程中赋值情况解释:

variable_assign:process(A,B,C)

variable d:STD_LOGIC

begin

d := A;

X <= C or d;

d := B;

Y <= C xor d ;

end process;

上面代码的实际运行结果是:C or A赋值给X,C xor B赋值给Y。

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分