目录
1 VHDL结构
1.1库,程序包和配置
库的语句格式
LIBRARY 库名;
USE语句的两种常用格式
USE 库名.程序包名.项目名;
USE 库名.程序包名.ALL;
例:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
1.2实体
1.2.1实体语句结构
ENTITY 实体名 IS
【GENERIC(类属表);】
PORT (端口表);
END 【ENTITY】实体名;
1.2.1类属
GENERIC (参数名:数据类型);
1.2.2端口
PORT (端口名:端口模式数据类型;
端口名:端口模式数据类型);
1.2.3结构体
ARCHITECTURE 结构体 OF 实体名 IS
[说明语句;]
BEGIN
功能描述语句;
END 结构体名;
1.3端口模式
IN | 输入端口,单向输入,将数据通过改端口读入 |
OUT | 输出端口,单向输出,将数据从该端口输出 |
BUFFRE | 是具有读功能的输出端口,可以读出数据,该数据也可以写入,只有一个驱动源 |
INOUT | 输入输出双向端口,可以通过同一端口从电路内部读数据,从电路外,写入数据 |
1.4数据类型
布尔数据类型 | BOOLEAN |
位数据类型 | BIT |
位矢量数据类型 | BIT_VECTOR |
整数数据类型 | INTEGER |
1.4.1IEEE预定义标准逻辑位与标准逻辑矢量
标准逻辑位数据类型 | STD_LOGIC |
标准逻辑矢量数据类型 | STD_LOGIC_VECTOR |
1.4.2其他预定义标准数据类型
无符号数据类型 | UNSIGNED |
有符号数据类型 | SIGNED |
小整型 | SMALL INT |
1.4.3自行定义的数据类型
枚举类型
type color_t is (red, green, blue, yellow);
数组类型
type bit_array is array (0 to 7) of std_logic;
1.5数据对象
信号 | SIGNAL | 信号可以与电路中的其他组件连接,并允许电路中的不同部分之间数据传输 |
变量 | VARIABLE | 在VHDL代码中临时存储数据的数据对象。 变量只在其定义的过程或函数中可见,并在进程中不具备存储能力 |
常量 | CONSTANT | 定义后不可更改其值的数据对象。 通常用于定义电路中的一些基本参数,如时钟周期、计数器位数 |
文件 | FILE | 可用于读取和写入外部文件。 文件通常用于与外部环境交互 |
计时器 | TIMER | 可用于向电路中添加基于时间的功能。 计时器可以帮助实现电路的时间同步和协调 |
1.5.1信号的定义格式
signal <signal_name> : <type>;
其中,<signal_name>
是信号的名称,可以根据需求命名。<type>
是信号的数据类型,可以是标准的数据类型,例如std_logic
、integer
或boolean
等,也可以是用户自定义的数据类型。以下是两个示例信号的定义格式:
signal clock : std_logic;
signal data_bus : std_logic_vector(7 downto 0);
在第一个示例中,clock
是一个标准类型的信号,其数据类型为std_logic
。在第二个示例中,data_bus
是一个自定义类型的信号,其数据类型为std_logic_vector
,长度为8位(即7至0)。注意,信号的定义只用于指定其名称和数据类型,在创建电路之前,需要将信号与其他组件连接起来才能使用。
1.5.2变量的定义格式
variable <variable_name> : <type> := <initial_value>;
其中,<variable_name>
是变量的名称,可以根据需求命名。<type>
是变量的数据类型,可以是标准的数据类型,也可以是用户自定义的数据类型。<initial_value>
是变量的初始值,可以省略。
以下是两个示例变量的定义格式:
variable count : integer := 0;
variable temp : std_logic_vector(7 downto 0);
在第一个示例中,count
是一个整型变量,其初始值为0。
在第二个示例中,temp
是一个自定义类型的变量,其数据类型为std_logic_vector
,长度为8位(即7至0)。
在VHDL中,变量定义的作用域仅限于定义它的过程或函数,它们不能用于连接其他电路组件。相比之下,信号的作用域可以是整个电路,并通过连接和传输实现跨组件使用。
1.5.3常量的定义格式
constant <constant_name> : <type> := <value>;
其中,<constant_name>
是常量的名称,可以根据需求命名。<type>
是常量的数据类型,可以是标准数据类型,也可以是用户自定义的数据类型。<value>
是常量的值。例如,
constant pi : real := 3.1415;
1.5.4文件的定义格式
file <file_name> : <file_type> is "<file_path>";
其中,<file_name>
是文件的名称,可以根据需求命名。<file_type>
是文件的类型,通常是text
或line
. "<file_path>" 是文件在计算机中的路径,可以是相对路径或绝对路径。例如:
file log_file : text is "logs/my_log_file.txt";
在此示例中,log_file
是文件的名称,text
是文件的类型。文件名为my_log_file.txt
,位于logs
文件夹下。文件用于记录模拟器或程序运行过程中的数据。
文件通常用于与外部环境(如计算机文件系统)进行交互,而不是数字电路本身。文件的读取和写入可以通过使用read
和write
等相关操作来实现。
1.5.5计时器的定义格式
signal <timer_name> : <type> := <initial_value>;
其中,<timer_name>
是计时器的名称,可以根据需求命名。<type>
是计时器的数据类型,通常是无符号整数 (unsigned) 或整数 (integer)。<initial_value>
是计时器的初始值,其单位可以是秒、微秒或时钟周期。
以下是一个示例计时器的定义格式:
signal timer : unsigned(31 downto 0) := (others => '0');
在此示例中,timer
是一个无符号整数类型的计时器,其初始值为0。
计时器通常需要与其他电路组件(如时钟产生器或状态机)以及其他计时器一起使用,以实现复杂的时间控制功能。
1.5.6变量、常量和信号的比较
变量 | 常量 | 信号 |
变量在过程中声明,具有局部作用域。 | 常量在程序中声明,具有全局作用域。 | 信号是需要在电路中定义。 |
变量可以被多次赋值。变量的值可以被修改。 | 常量的值不能被修改。 | 信号的值可以被修改。 |
变量在过程执行完毕后失效。 | 常量在程序执行过程中一直存在。 | 信号的值在赋值后不会立即更新电路中的值,而是产生一个事件,需要等待下一次模拟才会更新。 |
变量在VHDL中常用于过程中的临时存储数据或计算结果。 | 常量在VHDL中常用于存储不变的数据或常用的值,例如数字常量、字符常量等。 | 信号在VHDL中常用于表示电路中的输入、输出、中间信号等。 |
1.6操作符
1.6.1算术运算符
加运算符 | + |
减法运算符 | - |
乘法运算符 | * |
除法运算符 | / |
取模运算符 | mod |
1.6.2逻辑运算符
与运算符 | and |
或运算符 | or |
非运算符 | not |
异或运算符 | xor |
1.6.3比较运算符
等于 | = |
不等于 | /= |
大于 | > |
小于 | < |
大于等于 | >= |
小于等于 | <= |
1.6.4位运算符
位与运算符 | & |
位或运算符 | | |
位非运算符 | not |
位异或运算符 | xor |
左移运算符 | sll |
右移运算符 | srl |
1.6.5其他运算符
连接运算符 | & |
范围运算符 | to |
数组索引运算符 | () |
符号运算符 | + |