vhdl语法格式(1)

合集下载

VHDL语法结构、数据类型与基本命令语句.

VHDL语法结构、数据类型与基本命令语句.

A(3) A(2) A(1)
B(0) B(1) B(2)
A(0)
B(3)

序列信号的分解与合并
VHDL的语法是可接收分解与合并,其中”&”表合并动作
Architecture a of Test is Signal A : Std_logic_vector(3 downto 0); Signal B : Std_logic_vector(0 to 3); Signal C : Std_logic_vector(0 to 1); Signal D : Std_logic_vector(1 downto 0);
Nand 与非门
Xnor 或非门

/=
<
<=
小于等于
>
>=
大于等于
说明
等于
不等于
小于
大于
注:VHDL的赋值符号不是“=”(在C语言中使用),而逻辑关系等 于运算则使用“=”(C语言中使用“==”)。

列举数据类型
使用这种数据类型是希望用这样的类型定义,将所有的元素 表列出来。 定义:Type 列举名称 is (元素1,元素2…….); 主要是提高程序的可读性。

实数(Real)
定义:Type Real is range -1.7E38 to 1.7E38 无法综合
数据对象定义:常数、信号、变量

常数(Constant)
将数据对象定义为常数,是希望该常数所代表的数据部分不 会改变。 定义:Constant 常数名称:数据类型:=设置值 命名说明:1、第一个字母是英文字母 2、最后一个字符不可以为底线符号。 3、常数名称不可以与语法保留字相同。

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语言的基本语法解析

VHDL语言的基本语法解析

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)

关于vhdl语言中,下列对进程语句及语法规则

关于vhdl语言中,下列对进程语句及语法规则

一、进程语句在VHDL语言中,进程语句是描述数字电路行为的重要语法结构。

它可以用来描述数字电路的工作方式和行为模式,是VHDL语言中最基本的并发结构。

1. 进程语句的基本格式进程语句的基本格式如下:```vhdlprocess (sensitivity_list)begin-- 进程语句的具体实现end process;```其中,sensitivity_list表示进程敏感列表,可以是一个或多个信号。

当敏感列表中的信号发生变化时,进程将被激活,执行其中的语句。

2. 进程语句中的敏感信号在进程语句中,敏感信号是指当这些信号的值发生变化时,进程将被激活。

通常情况下,敏感信号是数字电路中的输入信号或者状态信号。

在进程语句中,可以通过在process语句的括号中列出敏感信号来指定敏感信号,如:```vhdlprocess (clk, rst)begin-- 进程语句的具体实现end process;```在这个例子中,当clk信号或者rst信号发生变化时,进程将被激活。

二、语法规则在VHDL语言中,进程语句遵循一定的语法规则,以确保正确、可读性强的代码编写。

1. 进程语句的begin和end在进程语句的begin和end之间,可以编写进程的具体实现。

在begin和end之间的代码将被视为进程语句的一部分,会在进程激活时执行。

2. 进程语句中的并发语句在进程语句的begin和end之间,可以包含一系列的并发语句,用来描述数字电路的行为。

这些并发语句可以是赋值语句、条件语句、循环语句等,用来描述数字电路的逻辑功能。

3. 进程语句的敏感信号在进程语句的括号中可以列出敏感信号,用来指定当这些信号发生变化时,进程将被激活。

敏感信号的正确使用是进程语句正确执行的重要保证。

通过对进程语句和语法规则的了解,可以更加深入地理解VHDL语言中数字电路的描述和实现方式。

合理的使用进程语句和遵循正确的语法规则,可以编写出高质量、可维护、易读的VHDL代码,提高数字电路设计的效率和质量。

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语法简单总结

VHDL语法简单总结

VHDL语法(yǔfǎ)简单总结VHDL语法简单(jiǎndān)总结VHDL语法(yǔfǎ)简单总结一个(yī ɡè)VHDL程序代码包含实体(shítǐ)(entity)、结构(jiégòu)体(architecture)、配置(pèizhì)(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.子类型在原有已定义数据类型(lèixíng)上加一些约束条件,可以定义(dìngyì)该数据类型的子类型。

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

子类型定义使用(shǐyòng)SUBTYPE关键字。

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

TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型(lèixíng)语法结构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);–滤波器系数(xìshù)类型定义SIGNAL delay_regs: delay_lines; –信号延迟(yánchí)寄存器声明CONSTANT coef: coeffs := ( ); –常量(chángliàng)系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以(suǒyǐ)必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。

VHDL数据类型vhdl语法

VHDL数据类型vhdl语法

二、VHDL数据类型与数据对象
例如: Signal Y : Std_logic_vector(7 downto 0); Signal X : Integer range 0 to 255; Y<= CONV_STD_LOGIC_VECTOR(X,8);
二、VHDL数据类型与数据对象 CONV_INTEGER 将数据类型 UNSIGNED, SIGNED转换为 INTEGER 类型. CONV_UNSIGNED 将数据类型INTEGER, SIGNED转换为 UNSIGNED 类型. CONV_SIGNED 将数据类型INTEGER, UNSIGNED转换为 SIGNED类型. CONV_STD_LOGIC_VECTOR 将数据类型INTEGER, UNSIGNED, SIGNED, STD_LOGIC转换为STD_LOGIC_VECTOR 类型.
二、VHDL数据类型与数据对象
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; --必需定义+ entity exam1 is port (ip : in std_logic_vector(3 downto 0); op : out std_logic_vector(3 downto 0)); end exam1; architecture m1 of exam1 is constant num : integer := 6; begin op <= ip + num; end m1;
architecture bh1 of full_bit_adder is begin y <= ((not a)and (not b)and ci) or ((not a)and (b) and (not ci)) or ((a)and (not b)and(not ci)) or ((a) and (b)and(ci)); cout <= (b and ci) or (a and ci) or (a and b); end bh1;

第5章VHDL语言基础(续)

第5章VHDL语言基础(续)
[标号]:WHILE 条件 LOOP --顺序语句块;
END LOOP [标号];
… VARIABLE tmp: STD_LOGIC; VARIABLE i: INTEGER; … i := 0; WHILE ( i < 8 ) LOOP
tmp := tmp XOR a(i); i := i +1; END LOOP ;
5.2.1 IF语句
IF (条件) THEN 语句块;
[ELSIF (条件) THEN 语句块;]
[ELSE 语句块;]
END IF;
IF语句的三种形式(一)
IF (条件) THEN 语句块;
END IF;
IF (clk’event and clk = ‘1’) THEN Q <= D ;
END IF;
END a;
5.2 VHDL顺序语句
顺序语句(sequential)
VHDL 常用语句
并发语句(concurrent)
顺序语句:处于进程(process)的内部, 从仿真的角度看是顺序执行的,类似于C、 Basic等执行方式。
并发语句:处于进程(process)的外部, 是并行执行的,即与它们出现的先后次序 无关。
--顺序语句块; EDN LOOP;
语法格式(二):递增 FOR I IN 起始值 TO 结束值 LOOP
--顺序语句块; END LOOP;
ASUM: FOR I IN 1 to 9 LOOP Sum <= I + Sum; -- Sum初值为0 END LOOP ASUM;
WHILE … LOOP语句
END IF;
A
B C
E
D
2 s

VHDL语言的顺序语句

VHDL语言的顺序语句
vhdl语言的顺序语 句
目 录
• 顺序语句概述 • 顺序语句概述 • 赋值语句 • 条件语句 • 循环语句 • 控制流语句
01
CATALOGUE
顺序语句概述
过程块(process block)
过程块是顺序语句的一种形式,它包含一系列的顺序语句,按照一定的顺序执行。
过程块通常在仿真过程中按照时间顺序逐行执行。
loop-statement循环语句
语法示例
```vhdl
loop_statement: process(some_signal)
loop-statement循环语句
01
02
begin
• 循环体
03
if some_condition then
loop-statement循环语句
• 条件满足时执行的代码
并行过程块(concurrent process block)
并行过程块是另一种形式的顺序语句,它包含一系列的顺序语句,这些语句在仿真过程中同时执行。
并行过程块通常用于描述数字系统的并发行为。
02
CATALOGUE
赋值语句
连续赋值语句
总结词
在连续赋值语句中,信号或变量的值 在每个仿真时间步都会更新。
case语句
end case;
```
conditional语句
描述:类似于其他编程语言中的三元操作符。
01
02
语法
```vhdl
03
04
signal_name <= "0" when condition else "1";
```
05
06
上述语句表示,如果条件为真,则将 `signal_name`设置为"0",否则设置为 "1"。

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并行语句; -- 被保护的变量前需加上保留字guarded end block 块标号;带保护的块语句举例: entity latch isport( d, clk : in bit;q, qb : out bitend 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顺序语句;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 (时钟)程序基本结构-- 主程序与元件程序在同一文件中,library ieee;use 主程序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 用户库的格式和用法单文件元件-- 主程序与元件程序在同一文件中,library ieee;use 主程序entity work1 isport ( r,s,t,u : in std_logic;v : out std_logic);end entity work1;architecture struc of work1 iscomponent 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;begin u1 : 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 ym isport ( a,b : in std_logic;c : out std_logic);end entity ym;architecture ym1 of ym isbeginc <= a and b;end architecture ym1;-- hm元件实体定义程序library ieee;use hm isport ( a,b : in std_logic;c : out std_logic);end entity hm;architecture hm1 of hm isbeginc <= a or b;end architecture hm1;多文件元件-- 主程序文件和定义元件的程序文件都要添加到工程中-- 主程序文件,不需要...声明用户库文件library ieee;use 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 ym isport ( a,b : in std_logic;c : out std_logic);end entity ym;architecture ym1 of ym isbeginc <= a and b;end architecture ym1;-- hm元件实体定义程序library ieee;use hm isport ( a,b : in std_logic;c : out std_logic);end entity hm;architecture hm1 of hm isbeginc <= a or b;end architecture hm1;单文件函数library ieee;use 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 is variable temp : std_logic_vector( 0 to 3 );begintemp := d1 + d2;return temp;end function;-- 定义函数结束begindout <= ls_xj ( din1, din2 ); --调用函数end architecture;多文件函数-- 主程序文件和定义函数的程序文件都要添加到工程中-- 主程序文件,必须声明用户库文件library ieee;use -- 作为用户库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;-- 定义函数的文件library ieee;use 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 is variable temp : std_logic_vector( 0 to 3 );begintemp := d1 and d2;return temp;end function;end use_func;单文件过程library ieee;use 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;多文件过程-- 主程序文件和定义过程的程序文件都要添加到工程中-- 主程序文件,必须声明用户库文件library ieee;use -- 作为用户库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;-- 定义过程的文件library ieee;use 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 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 ) -- 变换状态begin if 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 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 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' then state <= s1;end if;when s1 => if din = '1' then state <= s2;end if;when s2 => if din = '1' then state <= s3;end if;when s3 => if din = '1' then state <= 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";else dout <="111";end if;end case;end process;end architecture;三进程mealy状态机library ieee;use mealy_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 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秒。

VHDL语言

VHDL语言
PORT (a, b : IN STD_LOGIC; co,so : OUT STD_LOGIC); END h_adder;
VHDL语言的基本结构
实体结构
ENTITY 实体名 IS PORT ( 端口名1,端口名2,…端口名n :方向 数据类型名; … 端口名a,端口名b,…端口名m :方向 数据类型名);
80年代初,产生VHDL(Very high speed IC HDL)语言。 1987.12 ,作为IEEE标准(87版)。 1993 ,经修改的VHDL再次被IEEE标准认证(93版)。 1995 ,中国国家技术监督局推荐为国家标准。
VHDL语言的优点
支持自上而下的设计方法(整体描述)
半加器描述事例: WHEN “00” => so<=‘0’; co<=‘0’ ; WHEN “01” => so<=‘1’; co<=‘0’ ; WHEN “10” => so<=‘1’; co<=‘0’ ; WHEN “11” => so<=‘0’; co<=‘1’ ;
P.42 表3-3
VHDL语言的基本结构
实体 用以描述外部端口
构造体 用以描述内部结构及行为
实体结构
ENTITY 实体名 IS PORT ( 端口名1,端口名2,…端口名n :方向 数据类型名; … 端口名a,端口名b,…端口名m :方向 数据类型名);
END 实体名;
半加器实体说明举例 ENTITY h_adder IS
。 l任何标识符必须以英文字母开头。 l必须是单一下划线“_”,且其前后都必须有英文字母或数字。 l标识符中的英语字母不分大小写。 l允许包含图形符号(如回车符、换行符等),也允许包含空格符。

vhdl语法

vhdl语法

在VHDL语言里,不同类型的数据信号之间不能互 相赋值。当需要不同类型数据之间传递信息时,就需 要类型转换函数将其中的一种类型数据转换为另一中 数据类型后,再进行信号的传递。
• 1999年,IEEE又将数字模拟混合VHDL的版本作为工业标准, 即IEEE1076.3;
一、VHDL概述
VHDL与电路图设计电路的方式不同:
和电路图设计方式相比: (1)易于修改;
(2)设计能力更强;
(3)VHDL语言很方便:独立于器件设计;相同的程
序代码可以用于不同厂家生产的器件。
一、VHDL概述
设计范例:2输入与门
a b
c
电路真值表
a 0 1 0 1
b 0 0 1 1
c 0 0 0 1
一、VHDL 概述 IEEE; LIBRARY
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; Entity and2 is Port( a : in bit; 双减号--为VHDL程序的 b : in bit; 注释符,类似C语言中的 //注释符。 c : out bit); End and2; --实体定义结束。
端口名
端口模式
数据类型
一、VHDL概述
端口模式(MODE)有以下几种类型: IN ;OUT;INOUT ;BUFFER
端口模式可用下图说明:(黑框代表一个设计或模块)

IN
OUT
BUFFER
INOUT
(3)ARCHITECTURE定义区
实体的实现。即说明电路执行什么动作或实现功能。 定义格式: Architecture 结构体名 of 实体名 is

VHDL基本语法

VHDL基本语法

一、数据类型A. 标准数据类型1)整数类型(INTEGER)VARIBLE A:INTEGER RANGE -128 TO 128范围-(231-1)~ +(231-1)2#11111111# --binary,=255D8#377#16#FF#2)实数类型和浮点类型(REAL & FLOATING)实数范围-1.0E+38 ~ +1.0E+38大多数EDA工具不支持浮点类型16#0F#E+016#FF.FF#E-13)位类型(BIT)TYPE BITIS(‘0',‘1')4)位矢量类型(BIT_VECTOR)位矢量(bit_vector)类型实际上就是位(bit)的一位数组,它的表示方法是用双引号将一组位数据括起来。

例如:"11010111"。

不难看出,采用位矢量可以很方便地表示电路描述中的总线状态,这在VHDL程序中经常用到。

B"1111-1100" --长度为8X"FBC" --长度为12,=B"1111-1011-1100"O"371" --长度为9,=B"011-111-001"5)布尔类型(BOOLEAN)6)字符类型(CHARACTER)‘A',‘a',‘B',大小写不敏感。

7)字符串类型(TRING)"VHDL","MULTI_SCREEN"8)物理类型(physical)--时间类型--The physics unit time is a predefined typeTYPE time IS RANGE -1E18 TO 1E18UNITSfs; -- Femto-secondps = 1000 fs;ns = 1000 ps;us = 1000 ns;ms = 1000 us;sec = 1000ms;min = 60 sec;END UNITS--another--DISTANCE TYPETYPE distance IS RANGE 0 TO 1E16UNITSA;nm = 10A;um = 1000nm;mm = 1000um;cm = 10mm;m = 1000 mm;km = 1000m;END UNITS;9)错误类型(NOTE,WARNING,ERROR,FAILURE)10)自然数、正整数类型(NATURAL & POSITIVE)ENTITY_compare ISPORT(a,b:INTEGER RANGE 0 to 9:=0;c:out Boolean);END compare;B. 自定义数据类型1)枚举类型(ENUMERATED)TYPE PCI_BUSstate IS(Idle,busbusy,write,read,Back off); --PCI总线状态机变量TYPEstd_ulogic IS('U',‘X',‘1',‘0',‘Z',‘W',‘L',‘H',‘-‘);TYPE boolean IS(false,true);TYPE BITIS(‘0',‘1');2)整数类型(INTEGER)TYPE digit IS INTEGER RANGE -128 TO 1283)实数类型和浮点类型(REAL & FLOATING)4)数组类型(ARRAY)TYPE MYARRAY IS ARRAY(INTEGER 0 TO 9)OFstd_LOGIC5)存取类型(ACCESS)TYPE line IS ACCESS string; --Line是指向字符串的指针6)文件类型(FILES)TYPE text IS FILE OF string;TYPE input-type IS FILE OF character;7)记录类型(RECODE)--RECORD适于描写总线,通讯协议TYPE PCI_BUS IS RECORDADDR:std_LOCIG_VECTOR(31 DOWNTO 0);DATA:std_LOGIC_VECTOR(31 DOWNTO 0);END RECORD;SEGINAL DECODE1,DECODE2:PCI_BUS;PCI_DEVICE1 <= DECODE1.ADDR;PCI_DEVICE1RAM <= DECODE1.DATA;8)时间类型(TIME)9)VHDLstd_logic在VHDL中,设计人员经常使用的数据类型是枚举类型std_ulogic和它的子类型std_logic,它们都是一个九值逻辑系统。

vhdl循环语句

vhdl循环语句

vhdl循环语句VHDL循环语句是在数字电路设计中非常重要的一部分,它可以用来实现很多常见的功能,比如计数器、数据移位等。

在本文中,我们将介绍VHDL中的10种循环语句,包括for循环、while循环、repeat循环等等。

1. for循环for循环是VHDL中最常见的循环语句之一,它的语法格式如下:for i in range loopstatement;end loop;其中range可以是任何一个范围,比如:for i in 0 to 10 loopstatement;end loop;这个循环将会执行11次,从0到10。

在for循环中,i是一个临时变量,它在每次循环中都会被赋上新的值。

2. while循环while循环是另外一个常见的循环语句,它的语法格式如下:while condition loopstatement;end loop;其中condition是一个逻辑表达式,只有在条件为真的情况下,循环才会继续执行。

当条件为假时,循环将会退出。

3. repeat循环repeat循环是一个比较少用的循环语句,它的语法格式如下:repeatstatement;until condition;其中condition是一个逻辑表达式,只有在条件为真的情况下,循环才会退出。

和while循环类似,repeat循环也是先执行一次循环体,然后再判断条件是否为真。

4. loop循环loop循环是一个比较通用的循环语句,它的语法格式如下:loopstatement;end loop;这个循环将会无限循环下去,直到遇到break语句或者其他的退出循环的语句为止。

5. foreach循环foreach循环是一个比较新的循环语句,它的语法格式如下:foreach element in collection loopstatement;end loop;其中collection可以是任何一个集合,比如一个数组或者一个列表。

(完整word版)vhdl基本语法

(完整word版)vhdl基本语法

VHDL 基础语法篇——VHDLVHDL硬件描述语言1。

1 VHDL概述1。

1。

1 VHDL的特点VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原语句,如if语句、子程序和函数等,便于阅读和应用。

具体特点如下:1。

支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下(top—down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。

2. VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数据传送.利用单元(componet)、块(block)、过程(procure)和函数(function)等语句,用结构化层次化的描述方法,使复杂电路的设计更加简便。

采用包的概念,便于标准设计文档资料的保存和广泛使用。

3. VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。

既支持预定义的数据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类型语言。

4. 数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构和行为状态。

1.1.2 VHDL语言的基本结构VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。

但是VHDL毕竟是一种描述数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者感到枯燥无味,不得要领.较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整体的程序结构,再逐步介绍程序中的语法概念。

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基本结构与语法

第5章 VHDL 基本结构与语法本章通过几个例题介绍VHDL 语言的基本结构和语法规则5.1 VHDL 基本结构一个相对完整的VHDL 设计由以下四部分组成:(1) 库LIBRARY 、程序包PACKAGE :库用于存储预先完成的程序包和数据集合体;程序包用于声明在设计中将要用到的常数、数据类型、元件及子程序等。

(2) 实体ENTITY :定义设计的输入输出端口。

(3) 结构体ARCHITECTURE :定义实体的实现,即电路的具体描述。

可有多个结构体,但只有一个起作用。

(4) 配置CONFIGURA TION :为实体选定某个特定的结构体。

以上四个部分不是每个VHDL 程序必须的,但每个VHDL 程序至少含有1个实体和1个结构体。

1个实体可有多个结构体,通过配置选择1个结构体对实体起作用,其他结构体不起作用。

当只有1个结构体时不要实体。

【例5-1】2选1多路数据选择器,其功能见图5-1。

功能描述为当S=0时A 送Y , S=1时B 送Y 。

其对应的VHDL 描述为:ENTITY mux21a IS --给出实体名mux21a 和管脚定义 PORT (a,b : IN BIT ;s : INBIT ; y : OUT BIT );END mux21a ;ARCHITECTURE one OF mux21a IS --结构体,描述电路器件的内部逻辑 BEGIN功能或电路结构。

y <=a WHEN s=’0’ ELSE b;END one ;综合后结构体的门电路见图5-3。

5.1.1 实体ENTITY :定义本设计的输入输出端口/信号。

图5-1 例5-1功能示意图图5-3 例5-1综合后的门电路A S约定:[]表示为可选项;--开始的语句为注释,不参与编译和综合;黑体单词为保留字。

1、实体框架:ENTITY实体名IS--此处无分号[GENERIC(常数名:数据类型[:设定值]);]PORT - -端口定义(端口1:端口模式端口类型;…端口n:端口模式端口类型- -最后一个无分号);END[ENTITY] 实体名;注:END中带ENTITY、ARCHITECTURE为IEEESTDl076_1993版的语法要求,不带为IEEESTD1076 1987的语法要求。

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为信号类型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上篇基础元素目录:数据类型数据对象运算符语句基本程序结构电路描述方式数据类型预定义类型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并行语句; -- 被保护的变量前需加上保留字guarded end 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 (时钟)程序基本结构-- 主程序与元件程序在同一文件中,library ieee;use 主程序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 用户库的格式和用法单文件元件-- 主程序与元件程序在同一文件中,library ieee;use 主程序entity work1 isport ( r,s,t,u : in std_logic;v : out std_logic);end entity work1;architecture struc of work1 iscomponent 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;begin u1 : 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 ym isport ( a,b : in std_logic;c : out std_logic);end entity ym;architecture ym1 of ym isbeginc <= a and b;end architecture ym1;-- hm元件实体定义程序library ieee;use hm isport ( a,b : in std_logic;c : out std_logic);end entity hm;architecture hm1 of hm isbeginc <= a or b;end architecture hm1;多文件元件-- 主程序文件和定义元件的程序文件都要添加到工程中-- 主程序文件,不需要...声明用户库文件library ieee;use 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 ym isport ( a,b : in std_logic;c : out std_logic);end entity ym;architecture ym1 of ym isbeginc <= a and b;end architecture ym1;-- hm元件实体定义程序library ieee;use hm isport ( a,b : in std_logic;c : out std_logic);end entity hm;architecture hm1 of hm isbeginc <= a or b;end architecture hm1;单文件函数library ieee;use 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 is variable temp : std_logic_vector( 0 to 3 );begintemp := d1 + d2;return temp;end function;-- 定义函数结束begindout <= ls_xj ( din1, din2 ); --调用函数end architecture;多文件函数-- 主程序文件和定义函数的程序文件都要添加到工程中-- 主程序文件,必须声明用户库文件library ieee;use -- 作为用户库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;-- 定义函数的文件library ieee;use 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 is variable temp : std_logic_vector( 0 to 3 );begintemp := d1 and d2;return temp;end function;end use_func;单文件过程library ieee;use 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;多文件过程-- 主程序文件和定义过程的程序文件都要添加到工程中-- 主程序文件,必须声明用户库文件library ieee;use -- 作为用户库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;-- 定义过程的文件library ieee;use 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 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 ) -- 变换状态begin if 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 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 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' then state <= s1;end if;when s1 => if din = '1' then state <= s2;end if;when s2 => if din = '1' then state <= s3;end if;when s3 => if din = '1' then state <= 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";else dout <="111";end if;end case;end process;end architecture;三进程mealy状态机library ieee;use mealy_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 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秒。

相关文档
最新文档