VHDL语言的基本语法解析

合集下载

VHDL入门教程

VHDL入门教程

VHDL入门教程VHDL(Very High-speed Integrated Circuit HardwareDescription Language)是一种用于设计数字电路的硬件描述语言。

它是IEEE 1076标准中规定的一种语言,广泛应用于数字电路的设计、仿真和综合等领域。

本文将为大家介绍VHDL的基础知识和入门教程。

一、VHDL的基本概念1. 实体(Entity):VHDL代码的最高层次,用于定义模块的输入、输出和内部信号。

2. 架构(Architecture):定义了实体中的各个信号和组合逻辑的行为。

3. 信号(Signal):表示数据在电路中的传输和操作。

4. 进程(Process):定义了组合逻辑的行为,用于描述信号之间的关系。

5. 实体声明(Entity Declaration):用于描述模块的名称、输入、输出和内部信号。

6. 架构声明(Architecture Declaration):用于描述模块的内部逻辑。

二、VHDL的基本语法1.实体声明语法:```entity entity_name isport ( port_list );end entity_name;```其中,entity_name是实体的名称,port_list是实体的输入、输出和内部信号。

2.架构声明语法:```architecture architecture_name of entity_name issignal signal_list;beginprocess (sensitivity_list)begin--逻辑行为描述end process;end architecture_name;```其中,architecture_name是架构的名称,entity_name是实体的名称,signal_list是架构的内部信号,sensitivity_list是触发事件的信号列表。

三、VHDL的基本例子下面以一个简单的4位加法器为例介绍VHDL的编写和仿真流程。

8.VHDL基本语句和函数

8.VHDL基本语句和函数

4)
格式
IF
条件1 THEN 条件1 顺序语句1 顺序语句1; 条件2 ELSIF 条件2 THEN 顺序语句2 顺序语句2; …… 条件n ELSIF 条件n THEN 顺序语句n; 顺序语句n; ELSE 顺序语句n+1; 顺序语句n+1; IF; END IF;
注意
这类语句可以实现不同类型电路的描述。 这类语句可以实现不同类型电路的描述。 其任一分支顺序语句的执行条件是以上各分支 条件相与, 条件相与,即语句中顺序语句的执行条件具有 向上相与的功能。 向上相与的功能。
注意ቤተ መጻሕፍቲ ባይዱ
•条件句中的选择值必须在表达式的取值范围内; 条件句中的选择值必须在表达式的取值范围内; 条件句中的选择值必须在表达式的取值范围内 •CASE语句中每一条件句的选择只能出现一次,相同 CASE语句中每一条件句的选择只能出现一次 CASE语句中每一条件句的选择只能出现一次, 选择值的条件语句不能重复出现; 选择值的条件语句不能重复出现; •所有表达式的值都必须穷举,不能穷举的值用 所有表达式的值都必须穷举, 所有表达式的值都必须穷举 OTHERS表示 表示。 OTHERS表示。
Library ieee; use ieee.std_logic_1164.all; entity test_06 is port( d: in std_logic; x: out std_logic); end test_06; architecture test_06 of test_06 is signal a: std_logic_vector(3 downto 0); signal b: std_logic_vector(2 downto 0); begin process begin a<="1010"; b<="111"; if(a>b) then x<=d; else x<='0'; end if; end process; end test_06;

VHDL语法简单总结

VHDL语法简单总结

VHDL语法简单总结一个VHDL程序代码包含实体(entity)、结构体(architecture)、配置(configuration)、程序包(package)、库(library)等。

一、数据类型1.用户自定义数据类型使用关键字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;–用户自定义的整数类型的子集TYPE student_grade IS RANGE 0 TO 100;–用户自定义的自然数类型的子集TYPE state IS (idle, forward, backward, stop);–枚举数据类型,常用于有限状态机的状态定义一般来说,枚举类型的数据自动按顺序依次编码。

2.子类型在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。

VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。

子类型定义使用SUBTYPE关键字。

3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。

TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型语法结构SIGNAL signal_name: type_name [:= initial_value];–使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);–滤波器输入延迟链类型定义TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);–滤波器系数类型定义SIGNAL delay_regs: delay_lines; –信号延迟寄存器声明CONSTANT coef: coeffs := ( ); –常量系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。

vhdl基本语法 ifdef

vhdl基本语法 ifdef

VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统。

它是由美国国防部(DOD)于20世纪80年代初期的VHSIC(Very High Speed Integrated Circuits)项目中开发的。

VHDL的基本语法包括一些常用的关键字和结构,其中ifdef是其中之一。

ifdef是VHDL中的一个条件编译指令,用于根据给定的条件来判断是否包含某段代码。

在VHDL中,ifdef语句的基本语法如下:```vhdl`ifdef condition-- code to be included if condition is true`else-- code to be included if condition is false`endif```在上面的代码中,condition是一个条件表达式,可以是一个参数、宏定义或者其他已经定义过的条件。

如果condition为真,则会编译`ifdef和`endif之间的代码;如果condition为假,则会编译`else和`endif之间的代码。

使用ifdef可以让我们根据不同的条件来控制代码的编译和包含,这在一些复杂的项目中非常有用。

下面是使用ifdef的一个简单示例:```vhdl`ifdef DEBUGreport "Debug mode is enabled";`elsereport "Debug mode is disabled";`endif```在上面的代码中,如果DEBUG宏被定义了,那么report语句"Debug mode is enabled"将被编译进去;否则将编译进去"Debug mode is disabled"。

除了`ifdef语句外,VHDL还提供了一些其他的条件编译指令,如`ifndef(如果给定条件为假则编译)、`elsif(如果前面的条件为假则继续判断下一个条件)、`elsif和`endif。

vhdl语法总结4

vhdl语法总结4

vhdl语法总结4四、顺序代码在PROCESS, , PROCEDURE内部的代码都是顺序执⾏的,这样的语句包括IF,WAIT,CASE和LOOP。

变量只能在顺序代码中使⽤,相对于信号⽽⾔,变量是局部的,所以它的值不能传递到PROCESS,和PROCEDURE的外部。

1. 进程(PROCESS)进程内部经常使⽤IF,WAIT,CASE或LOOP语句。

PROCESS具有敏感信号列表(sensitivity list),或者使⽤WAIT语句进⾏执⾏条件的判断。

PROCESS必须包含在主代码段中,当敏感信号列表中的某个信号发⽣变化时(或者当WAIT语句的条件得到满⾜时),PROCESS内部的代码就顺序执⾏⼀次。

语法结构如下:[label: ] PROCESS (sensitivity list)[VARIABLE name type [range] [ := initial_value; ]]BEGIN(顺序执⾏的代码)END PROCESS [label];如果要在PROCESS内部使⽤变量,则必须在关键字BEGIN之前的变量声明部分对其进⾏定义。

变量的初始值是不可综合的,只⽤于仿真。

在设计同步电路时,要对某些信号边沿的跳变进⾏监视(时钟的上升沿或下降沿)。

通常使⽤EVENT属性来监视⼀个信号是否发⽣了变化。

2. 信号和变量信号可在PACKAGE,ENTITY和ARCHITECTURE中声明,⽽变量只能在⼀段顺序描述代码的内部声明。

因此,信号通常是全局的,变量通常是局部的。

赋予变量的值是⽴刻⽣效的,在后续的代码中,此变量将使⽤新的变量值,⽽信号的值通常只有在整个PROCESS执⾏完毕后才开始⽣效。

3. IF语句IF/ELSE语句在综合时可能会产⽣不必要的优先级解码电路。

IF语句语法结构如下:IF conditions THEN assignments;ELSIF conditions THEN assignments;ELSE assignments;END IF;————————————————————————————————例:IF (x < y) temp := “1111_1111”;ELSIF (x = y AND w = ‘0’) THEN temp := “1111_0000”;ELSE temp := (OTHERS => ‘0’);4. WAIT语句如果在process中使⽤了WAIT语句,就不能使⽤敏感信号列表了。

8.VHDL基本语句和函数

8.VHDL基本语句和函数

注意
这是一种完整的IF语句, 这是一种完整的IF语句,通常用于 IF语句 产生组合电路。 产生组合电路。
格式
2) IF
条件 THEN 顺序语句1 顺序语句1; ELSE 顺序语句2 顺序语句2; IF; END IF;
注意
这是一种完整的IF语句, 这是一种完整的IF语句,通常用于 IF语句 产生组合电路。 产生组合电路。
CASE语句 语句
entity MUX4 is port(A,B,I0,I1,I2,I3: in std_logic; Q : out std_logic); end MUX4; architecture MUX4 of MUX4 is signal sel:INTEGER range 0 to 3; begin process(A,B,I0,I1,I2,I3) …… CASE sel IS WHEN 0=> Q<=I0; WHEN 1=> Q<=I1; WHEN 2=> Q<=I2; WHEN 3=> Q<=I3; END CASE; end process; end mux4;
Library ieee; use ieee.std_logic_1164.all; entity test_06 is port( d: in std_logic; x: out std_logic); end test_06; architecture test_06 of test_06 is signal a: std_logic_vector(3 downto 0); signal b: std_logic_vector(2 downto 0); begin process begin a<="1010"; b<="111"; if(a>b) then x<=d; else x<='0'; end if; end process; end test_06;

VHDL基本语法

VHDL基本语法

变量不是真正的物理量 , 因此不能 出现在敏感信号表中. 出现在敏感信号表中. 在 process 语句中只作为输出存在的 信号 ( 出现在信号赋值符 " < =" 的左 边 ) 不能作为敏感信 号. 既出现在信号赋值符 "<=" 的左边 , 又出现在信号赋值符 "<=" 右边的信 号 , 可以出现在敏感信号表中 , 这是因 为这些信号既作为这块电路的输出 , 又 是电路内部的反馈信号. 是电路内部的反馈信号.
例7 2 与非门. 与非门. 参见程序' (参见程序'例7') ) 说明: 说明: 本例中 , 首先将与非门输入信号 a 和 b 并置 , 生成一个 2 位的 std_logic_vector 信号 sel .信号 C 是与非门的输出. 是与非门的输出.第一个 when 中的 "|" 代表或者 , 即 3 个条件中的任何一 语句. 个满足 , 执行 C <='1' 语句.
格式 : IF 条件 1 THEN 若干顺序执行语句 1 ELSIF 条件 2 THEN 若干顺序执行语句 2 … ELSIF 条件 n-1 THEN 若干顺序执行语句 n-1 ELSE 若干顺序执行语句 n END IF;
(5) 进程语句 进程语句(PROCESS)
进程语句是一个十分重要的语句 进程语句是一个十分重要的语句 , 本质上它描述了一个功能独立的电路 本质上它描述了一个功能独立的电路 块.
CASE语句与 语句一样也是个顺序执 语句与IF语句一样也是个顺序执 语句与 行语句,但使用上有区别. 行语句,但使用上有区别. CASE语句执行时是无序的,所有表达 语句执行时是无序的, 语句执行时是无序的 式是并行处理; 语句是有序的, 式是并行处理;而IF语句是有序的, 语句是有序的 先处理最优先的条件, 先处理最优先的条件,后处理次优先 条件. 条件. 在某种情况下,两种语句都可以使用, 在某种情况下,两种语句都可以使用, 语句比IF语句描述更简捷 但 CASE语句比 语句描述更简捷, 语句比 语句描述更简捷, 更清晰.故应优先选用CASE语句. 语句. 更清晰.故应优先选用 语句

VHDL语言的常用语法

VHDL语言的常用语法

电子发烧友 电子技术论坛
值传递给信号 A。 When-Else 命令的应用范围非常广泛,例如:编码器、译码器、多路选择器等的 VHDL
命令编写,都可以采用这条命令。 3、选择式信号设置语句:With-Select
Process(进程)语句是一种并行处理语句,在一个构造体中多个 Process 语句可以同时
电子发烧友 电子技术论坛
并行运行。因此,Process 语句是 VHD 语言中描述硬件系统并行行为的最基本的语句。其语 法结构如下:
S<=X&Y; Process Begin
If S=”00” then Z<=’0’;
Elsif S=”01” then Z<=’1’;
Elsif S=”10” then Z<=’1’;
Else Z,=’0’;
End if; End process; end c;
--************用 Case-When 语句实现的结构体**************** architecture d of True_Table is
[进程名]: Process (信号 1,信号 2,…) Begin
…. End Process; 进程 Process 语句中总是带有 1 个或几个信号量。这些信号是 PROCESS 的输入信号(不 一定是所有的输入信号),在 VHDL 语言中也称为敏感量。这些信号无论哪一个发生变化(如 由“0”变“1”或由“1”变“0”)都将启动该 Process 语句。一旦启动以后,Process 中的 语句将从上到下逐句执行一遍。当最后一条语句执行完毕以后,就返回到开始的 Process 语 句,等待下一次变化的出现。当没有敏感量时,进程将无限循环执行。 二、顺序语句 所谓的顺序语句如前面所提到的,就是语句是按先后顺序执行的。顺序描述语句只能出 现在并行语句 Process 中。 1、If-else 语句 语法格式:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2、变量( Variable )
变量是一个局部变量,它只能在进程语句、函数语句和过程 语句结构中使用,用作局部数据存储。变量常用在实现某种算 法的赋值语句中。
一般格式:
VARIABLE 变量名:数据类型 约束条件:= 表达式;
例: VARIABLE x, y: INTEGER;
--定义x,y为整数变量
SIGNAL Y ,Z :BIT;
Y<=A(M) ;
--M是不可计算型下标表示
Z<=B(3) ;
--3是可计算型下标表示
C (0 TO 3)<=A (4 TO 7) ; -以段的方式进行赋值
C (4 TO 7)<=A (0 TO 3) ; -以段的方式进行赋值
二、VHDL语言的数据对象
1、常数( Constant )
常量的使用范围取决于它被定义的位置 :
(1)程序包中定义的常量具有最大的全局化特性,可以用在调 用此程序包的所有设计实体中;
(2)设计实体中定义的常量,其有效范围为这个实体定义的所 有的结构体;
(3)设计实体中某一结构体中定义的常量只能用于此结构体;
(4)结构体中某一单元定义的常量,如一个进程中,这个常量 只能用在这一进程中。
5,678,0,156E2(=15600) , 45_234_287(=45234287)
(2) 实数文字: 实数文字也都是十进制的数,但必 须带有小数点,如: 188.993, 88_670_551.453_909(=88670551.453909) ,
1.0,44.99E-2(=0.4499) ,1.335,0.0
?16#F.01#E+2ቤተ መጻሕፍቲ ባይዱ--( 十六进制数表示,等于 3841.00)
?8#377#
? --(与16#FF#,016#0FF#,2#11111111 都为255)
3、字符串型文字
字符是用单引号引起来的ASCII字符,可 以是数值,也可以是符号或字母,如:‘R' ,‘A',‘*',‘Z'。
而字符串则是一维的字符数组,须放在双 引号中。VHDL中有两种类型的字符串:文字 字符串和数位字符串。
元素,如:a(2) , b(n) 下标段名则用于指示数组型变量或信号的
某一段元素,其语句格式如下:
数组类型信号名或变量名(表达式1 [TO/DOWNTO 表达式2]);
如下是下标名及下标段名使用示例:
SIGNAL A ,B,C:BIT_VECTOR(0 TO 7) ;
SIGNAL M :INTEGER RANGE 0 TO 3 ;
VHDL语言要素
一、VHDL语言的基本语法
1、VHDL语言的标识符
VHDL中的标识符可以是常数、变量、信号、端口、子程序或参 数的名字。使用标识符要遵守如下规则:
标识符由字母(A…Z,a…z)、数字和下划线字符组成; 任何标识符必须以英文字母开头; 末字符不能为下划线; 不允许出现两个连续下划线; 标识符中不区分大小写字母; VHDL定义的保留字或称关键字,不能用作标识符; VHDL中的注释由两个连续的虚线(--)开始,直到行尾;
VARIABLE count: INTEGER RANGE 0 TO 255:=10; --定义计数变量范围
变量赋值语句的语法格式如下:
目标变量: =表达式;
(1) 赋值语句右方的表达式必须是一个与目标变量有相同 数据类型的数值。 (2) 变量不能用于硬件连线和存储元件。
(3) 变量的适用范围仅限于定义了变量的进程或子程序中。
(4) 若将变量用于进程之外,必须将该值赋给一个相同的 类型的信号,即进程之间传递数据靠的是信号。
[例]
VARIABLE x, y :REAL;
VARIABLE a, b: BIT_VECTOR(0 TO 7);
x:=100.0; y:=1.5+x;
--实数赋值,x是实数变量 --运算表达式赋值,y也是实数变量
a:=b; a:=”1010101”; --位矢量赋值,a的数据类型是位矢量 a(3 TO 6):=(‘1','1','0','1'); --段赋值
a(0 TO 5):=b(2 TO 7);
a(7):='0';
进制基数符号“数位字符串”
B:二进制基数符号,表示二进制数位0或1。 O:八进制基数符号。 X:十六进制基数符号(0~F) 。
例如:B“1_1101_1110” --二进制数数组,位矢数组长度是9
X“AD0” --十六进制数数组,位矢数组长度是12
4、下标名及下标段名 下标名用于指示数组型变量或信号的某一
[例]
_Decoder_1 --起始为非英文字母
3DOP
--起始为数字
Large # number --“#”不能成为标识符的构成符号
Date_ _bus
--不能有双下划线
Copper_ on
--最后字符不能为下划线 --关键字
2、VHDL语言的数字
2.1 数字型文字的值有多种表达方式,现列举如下: (1) 整数文字: 整数文字都是十进制的数,如:
常数是一个固定的值,主要是为了使设计实体中的常数更容 易阅读和修改。常数一旦被赋值就不能再改变。一般格式:
CONSTANT 常数名:数据类型:= 表达式; 例: CONSTANT fbus: BIT_VECTOR: = “01011001”-;-总线上数 据设备向量
CONSTANT dely: TIME: =25 ns; --输入/输出的延迟时间 常数所赋的值应与定义的数据类型一致。
数字前可加0,数字中间不能有空格
2.2 以数制基数表示的文字:
数制#基数#指数
数制和指数部分是用十进制数表示的数。指数部分 的数如果是 0可以省去不写。现举例如下:
?10#170#
--(十进制数表示,等于 170)
?2#1111_1110#
--(二进制数表示,等于 254)
?16#E#E1
--(十六进制数表示,等于 2#11100000# ,等于224)
(1)文字字符串
文字字符串是用双引号引起来的一串文字, 如: “ERROR”,“BOTH S AND Q EQUA TO L”,“X”,“BB$CC”
(2)数位字符串
也称数值字符串、位矢量,是预定义的数据 类型BIT的一维数组,它们所代表的是二进制、 八进制或十六进制的数组,其位矢量的长度 即为等值的二进制数的位数。
相关文档
最新文档