硬件描述语言 VHDL
(正好最近的小学期在弄计算机组成原理实验,在实验maxplus时发现看不太懂器件程序,因此顺便将VHDL语言学了一下)
先框架 再从程序中讲每个用法
这份笔记是观看b站视频 自己总结下来的 之后会把视频的链接附在后面 大家可以一同讨论交流
第一章 VHDL程序的基本结构
五个基本部分组成
库 程序包 实体说明 结构体 配置
主要部分:实体说明entity declaration 结构体 architecture
一个实体里有多个结构体时 需要配置configuration
1.1 实体和结构体
二选一器件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lKxGAaLs-1626187176106)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708215536277.png)]
ENTITY max21a IS
PORT(a,b:IN BIT; --a,b,s 为端口名称
s :IN BIT; - - IN ,OUT 为方式
y :OUT BIT); ---BIT 数据类型
END ENTITY mux21a; --文件名称要和实体名称对应 vhd后缀
ARCHITECTURE one OF max21a IS
BEGIN
y<=a WHEN s='0' ELSE
b;
END ARCHITECTURE one; ---one 结构体名称 max21a实体名称
实体:描述电路器件的外部情况及各信号端口的基本性质
结构体:描述电路器件的内部逻辑功能或电路结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWxMwWOL-1626187176107)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708220453786.png)]
ENTITY max21a IS
PORT(a,b:IN BIT; --a,b,s,y为端口名称 即在外面的端口
s :IN BIT; - - IN ,OUT 为方式
y :OUT BIT); ---BIT 数据类型
END ENTITY mux21a; --文件名称要和实体名称对应 vhd后缀
ARCHITECTURE one OF max21a ---内部信号不用说明流动方向
SIGNAL d,e:BIT;
BEGIN
d<=a AND (NOT S); ---d,e为在电路内部的端口
e<=b AND S;
y<=d OR e;
END ARCHITECTURE one;
process是进程语句
if是顺序语句 不能直接放在结构体里 需要放在进程或者子程序 里面
ENTITY max21a IS
PORT (a,b,s:IN BIT;
y :IN BIT);
END ENTITY max21a;
ARCHITECTURE one OF max21a IS
BEGIN
PROCESS(a,b,s)
BEGIN
IF s='0'THEN
y<=a;
ELSE
y<=b;
END IF;
END IF;
END PROCESS;
END ARCHITECTRUE one;
1.1.2 相关语句结构和语法说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vulTBvO5-1626187176108)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708222729853.png)]
1.实体:电路器件的端口构成和信号属性
2.实体名:用英文字母、数字和下划线“_”来命名;
注意:用英文字母开头,不能使用连续的下划线或以下划线结束;也不能用元件名或关键字作实体名。
3.PORT语句和端口信号名:描述电路的端口及其端口信号必须用端口语句PORT(```)
4.端口模式:定义端口上数据的流动方向和方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1AhRhh8I-1626187176110)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709142108256.png)]
注意:端口名称要求与实体名一致 同一时刻输入或输出 附加另外控制端口
5.数据类型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFHVp8ZJ-1626187176111)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709142252511.png)]
BIT:取值范围是逻辑位’0‘和’1‘,必须加单引号,否则认为是整数数据类型interger
STO_LOGIC:有9种不同取值 较完整的概括了数字系统中的所有可能的数据表现形式。其实际电路有更好的适应性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CVl74Hf-1626187176111)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709142429215.png)]
6.结构体:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyhfOIYH-1626187176112)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708223603776.png)]
说明语句:可有可无 结构体种需要说明 可用于说明内部信号(包括在结构体中需要说明和定义的数据对象、数据类型、元件调用声明等)
功能描述语句:必须要;并行执行(无先后顺序)
7.信号传输(赋值)符号和数据比较符号:
y<=a 两边信号类型必须一致 --根据前后语句判断是赋值还是比较
表示输入端口中a的数据向输出端口y传输,或信号b向信号y赋值
s='0' --没有赋值意义,只是一种数据比较符号。其表示的输出结构的数据类型是布尔数据类型
8.WHEN_ELSE 条件信号赋值语句:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TfV9ATZ-1626187176112)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708224033865.png)]
流程:通过测定赋值条件1的比较结果,确定由哪一端口向y赋值
条件信号赋值语句是并行表述语句,它的功能与在进程中的IF语句相同,可直接放在结构体里
注意:由于条件测试的顺序性,条件信号赋值语句中的第一字句具有最高赋值优先级,第二句其次,依次类推(每一赋值条件是按书写的先后关系逐项测定的) 即第一条若满足,不需要判断下面的条件了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2iSw59Pc-1626187176113)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709143923503.png)]
9.PROCESS 进程语句 (并行语句)
PROCESS(a,b,s)
BEGIN
顺序语句
END PROCESS;
PROCESS进程语句可以直接放在结构体里
所有的顺序描述语句只能出现在进程或子程序中
一个结构体中可包含多个进程语句,所有的进程语句都是并行语句;由任一进程引导的语句为顺序语句。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oe7tjJM2-1626187176113)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709144042781.png)]
其中任意一个发生变化 整个进程将会从前到后执行一遍
10.IF 语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pZkHEWw-1626187176114)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708224626592.png)]
流程:判断是否满足条件表达式,若满足,执行顺序语句;若不满足,跳出IF语句,结束IF语句执行
是一种非完整条件语句,通常用于产生时序电路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwX8DEnf-1626187176114)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708224730068.png)]
流程:与(1)的区别就是若不满足条件表达式,就转向ELSE下的另一端顺序语句来执行。执行完其中一组后结束IF语句的执行。具有条件分支功能。
是完整条件语句 ,给出了条件语句的所有可能,通常用于产生组合逻辑电路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNhPgFFA-1626187176114)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708224833176.png)]
特点:IF 语句的嵌套 END IF 与离它的最近的IF相匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLnIDw4y-1626187176115)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708224917248.png)]
流程:先判断条件表达式1是否正确,若正确,执行顺序处理语句1,然后结束IF语句;若不正确,判断条件表达式2是否正确,、、、、。
本质与(2)一致,都是分支语句
多分支语句 最后一个else可以没有,但最多只有一个;最后一个END IF是和最上面的IF对应
IF语句实战:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cks4x9s-1626187176115)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708225337754.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LW6sNQws-1626187176116)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708225502561.png)]
1.2 时序逻辑电路的VHDL描述
1.2.1D触发器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZzRvLcZ-1626187176116)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210708225754592.png)]
LIBRARY IEEE; --表示打开IEEE库;
USE IEEE.STD_LOGIC_1164.ALL; --表示允许使用IEEE库中
--STD_LOGIC_1164程序包的所有内容
ENTITY DFF1 IS
PORT(CLK:IN STD_LOGIC;
D :IN STD_LOGIC;
Q :OUT STD_LOGIC);
END ENTITY DFF1;
ARCHITECTURE bhv OF DFF1 IS
SIGNAL Q1:STD_LOGIC; --表示在描述的器件DFF1内部定义标识符
--Q1的数据对象为信号(IGNAL),其数据类型为STD_LOGIC;
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN --CLK上升沿检测
Q1<=D;
END IF;
END PROCESS;
Q<=Q1; --将内部的暂存数据向端口输出
END bhv;
D触发器是
1.设计库和标准程序包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-novLDu1D-1626187176117)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709145959498.png)]
VHDL标准库STD和工作库WORK都是默认打开的,在使用其内容前,不必事先给予声明
IEEE不属于VHDL标准库,在使用其内容前,必须实现给予声明
2.信号定义和数据对象
SIGNAL:定义某标识符为信号的关键词
数据对象有3类:信号(SIGNAL) 变量(VARIABLE) 常量(CONSTANT)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjRCJH50-1626187176117)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709151054818.png)]
注意:程序里面的Q1为器件的内部节点信号,不必定义其端口模式
语句仅规定了Q1的属性特征,而其功能定位需要由结构体中的语句描述具体确定
定义内部信号的目的是为了在设计更复杂的电路时使用由此引入的时序电路的信号,这是一种常用的时序电路设计的方式。当然,有些简单的电路不定义内部信号也可以。
1.3 全加器的VHDL描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qWxNqqQq-1626187176117)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709151832071.png)]
用到了两个半加器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsMEJeGx-1626187176118)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709151933331.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BbCx6vle-1626187176118)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709152254719.png)]
结构体内容是根据半加器逻辑电路图写出的、用并行赋值语句表示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJQZyU4m-1626187176119)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709152525289.png)]
根据半加器的逻辑功能真值表写出结构体的内容
1.3.1 半加器描述
1.标准逻辑矢量数据类型STD_LOGIC_VECTOR
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1MhnA6Y-1626187176119)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709152808289.png)]
B<=“01011101”; B(7)为’0‘B(0)为“1”
A<=“0111” ;A(1)为“0” A(4)为“1”
B(7 DOWNTO 4)<=A; B(6)等于A(2)
2.并置操作符(串联)&
将操作数或数组合并起来形成新的数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YEIEQBrK-1626187176119)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709153717772.png)]
m(3)=’1‘ m(2)=‘0’
3.CASE 语句 属于顺序语句,必须放在进程或子程序中使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZDyqSgQ-1626187176121)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709153953714.png)]
注意:=>不是操作符,相当于“THEN”(或“于是”)
虽然case是顺序语句,但when语句的先后顺序没有关系,同时与所有选择值进行比较,并行执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLB19C9S-1626187176122)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709155935885.png)]
case语句不完整 因为信号声明的数据类型为std_logic_vector 有9种不同的数据类型 when里面没全
所以加一个WHEN OTHERS=>null;
1.3.2 例化语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuLreCTh-1626187176122)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709160401893.png)]
元件例化由两部分组成:
(1)元件声明语句
将一个现成的设计实体定义为一个元件
语句的功能是对待调用的元件作出调用声明
COMPONENT 元件 --对待调用的元件作声明 准备调用的元件声明里 端口语句完全一致 顺序不能颠倒
PORT(端口名表);
END COMPONENT 元件名;
相当于对一个现有的设计实体进行封装,使其只留出对外的接口界面。元件声明放在结构体的ARCHITECTURE和BEGIN之间
(2)端口映射语句
即将元件的引脚与调用该元件的端口的引脚相关联
1>位置关联方式
例化名:元件名 port map (信号1,信号2,....); --里面的名称对应的外部的端口名或信号名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hi8JpHdu-1626187176123)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709174319452.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKS63BcZ-1626187176123)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709174328814.png)]
ain与a相关联,bin与b,d与co,e与so关联 一定要注意位置
2>名字关联方式
例化名:元件名 port map(a=>a1,b=>b1,...); --=>左侧是内部元件的端口名 右侧是内部元件以外的端口名或信号名
将元件的引脚a与调用该元件的端口a1相关联。位置可以任意的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4dWpTThz-1626187176123)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709174840990.png)]
例题:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Iag2oiE-1626187176124)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709175232131.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJbJ2epo-1626187176124)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20210709175256809.png)]
1.4 计数器设计
Q即使输入又是输出 所以
1一定要区分有无单引号,
数据类型说明
默认32位
1.5一般计数器的VHDL设计方法
1.6数据对象
1.6
1.6.3
map(a=>a1,b=>b1,…); --=>左侧是内部元件的端口名 右侧是内部元件以外的端口名或信号名
将元件的引脚a与调用该元件的端口a1相关联。位置可以任意的
[外链图片转存中...(img-4dWpTThz-1626187176123)]
例题:
[外链图片转存中...(img-1Iag2oiE-1626187176124)]
[外链图片转存中...(img-vJbJ2epo-1626187176124)]
## 1.4 计数器设计
Q即使输入又是输出 所以
1一定要区分有无单引号,
数据类型说明
默认32位
## 1.5一般计数器的VHDL设计方法
## 1.6数据对象
1.6
### 1.6.3