多路选择器是VHDL设计中最为基础的设计之一。在数字电路中,其具备了组合逻辑电路的简单性和典型性的特征。
以下,北北就以此电路模块来讲解其对应的VHDL表述及设计,并以“2选1多路选择器”为例,详细介绍其代码的基本结构、语句表述、数据特点和语法规则!
目录
①我们先了解“2选1多路选择器”的电路模型:
a和b是输入端。“s”的取值(0或1)将决定 y 输出 a 还是 b。
②现在,让我们来看看“2选1多路选择器”的代码吧!
ENTITY mux2la IS
PORT (a,b,s : IN BIT ;
y:OUT );
END ENDENTITY mux2la;
ARCHITECTURE bhv OF mux21a IS
BEGIN
PROCESS (a,b,s)
BEGIN
IF(s='1') THEN y<=a; ELSE y<=b;
END IF;
END PROCESS;
END ARCHITECTURE bhv;
以下是逐句讲解:
(1)以“ENTITY”开始的实体
ENTITY mux2la IS --mux21a为实体名(假设的模块名),IS后固定不加符号
PORT (a,b,s : IN BIT ; --PORT为端口,IN表示为输入 ,非末句,后加;
y:OUT ); --OUT为输出,PORT语句内最后一句,后不加;语句外加;
END ENDENTITY mux2la;
(2)以 “ARCHITECTURE”开始的结构体
ARCHITECTURE bhv OF mux21a IS --bhv为结构体名,IS后固定不加符号
BEGIN
PROCESS (a,b,s) --PROCESS进程语句起始,(a,b,c)为敏感信号表
BEGIN
IF(s='1') THEN y<=a; ELSE y<=b; --y<=a表示将 a 的值赋给 y
END IF; --IF顺序语句结束
END PROCESS; --PROCESS进程语句结束
END ARCHITECTURE bhv;
③相关语句结构及语法含义
(以下参考了书籍:EDA技术实用教程——VHDL版(第六版)[潘松、黄继业])
1.条件语句
两种语句:在 VHDL 结构体中用于描述逻辑功能和电路结构的语句可分为顺序语句和并行语句。
顺序语句的执行方式类似于普通软件语言的程序执行方式,是按照语句的前后排列方式逐条顺序执行的;并行语句,无论有多少行语句,都是同时执行的,与语句的前后次序无关。
用于描述电路功能的 IF THEN ELSE 语句属于顺序语句。
根据语句排列的先后顺序,由关键词 IF 首先引导判断表达式(s='1')作出判断,若满足条件,即 s 为高电平,于是执行赋值语句 y<=a,即将a 端口的数据向y输出;否则(即 ELSE),即 s为低电平,执行赋值语句 y<=b。最后以“END IF;”结束 F 引导的条件语句。
IF(s='1') THEN y<=a; ELSE y<=b; --y<=a表示将 a 的值赋给 y
END IF; --IF顺序语句结束
2.数据类型
在 VHDL设计中,必须预先定义好要使用的数据类型
与verilog 相比VHDL是一种强类型语言。VHDL规定,任何一种数据对象的应用都必须严格限定其取值范围和数值类型,即对其传输或存储的数据的类型要作明确的界定。这对于大规模电路描述的排错是十分有利的,也是 VHDL 的优势所在。
数据类型有 BIT、整数类型INTEGEB、布尔类型BOOLEAN和标准逻辑类型STD LOGIC等。
INTEGER,即理解为1、2、3的1,而非二进制0、1的1,或逻辑位的 1。
在PORT 语句中,端口信号a、b、s和y的数据类型都定义为 BIT
即表示它们的取值范围,或者说数据范围都被限定在逻辑位'1’和0两个值的范围内。
BIT数据类型的信号规定的取值范围是逻辑位'1'和 '0' 注:'1' 和 '0' 应为单引号修饰
在 VHDL 中,逻辑位01的表达必须加单引号,否则 VHDL 综合器将其解释为整数数据类型
BIT 数据类型可以参与逻辑运算,其结果仍是逻辑位的数据类型。
由条件判断式计算出来的值“'的数据类型是BOOLEAN,不是二进制的 '1'
VHDL 综合器用一个二进制位表示 BIT类型或 BOOLEAN类型。
实际上,条件语句中判断表达式,如(s1='0'),输出的是判断结果,分别是“TRUE或“FALSE”,其数据类型是 BOOLEAN,在数值上分别对应 '1' (真)或 '0' (伪)。如果 s1 为低电平,则在综合器中:(s1=0')=1。
3.进程语句和顺序语句
在VHDL中,所有顺序描述语句都必须放在进程语句中(也包括放在过程语句)中
顺序语句“IF THEN ELSE ENDIF:”是放在由 PROCESS至ENDPROCESS引导的进程语句中的。
进程中所有的输入信号都放在敏感信号表中
PROCESS 旁的(a,b,s)称为进程的敏感信号表。输入信号a和s出现在了进程语句中所以须将它们全部列入敏感信号表中。由于 PROCESS 语句的执行依赖于敏感信号的变化(或称发生事件),即当某一敏感信号,如 a,从原来的'1'跳变到 '0',或者从原来的 '0' 跳变到 '1' 时,就将启动此进程语句,于是此 PROCESS 至 END PROCESS引导的语句(包括其中的顺序语句) 被执行一遍;然后返回进程的起始端,进人等待状态,直到下一次敏感信号表中某一信号或某些信号发生事件后才再次进入这种“启动-运行”状态。
在一个结构体中可以包含任意个进程语句结构,所有的进程语句本身都是并行语句
PROCESS (a,b,s) --PROCESS进程语句起始,(a,b,c)为敏感信号表
BEGIN
IF(s='1') THEN y<=a; ELSE y<=b; --y<=a表示将 a 的值赋给 y
END IF; --IF顺序语句结束
END PROCESS; --PROCESS进程语句结束
4.端口语句和端口信号名
描述电路的端口及其端口信号必须用端口语句 PORT()来引导,并在语句结尾处加分号“ ;”
上述代码中由语句 PORT()引导的语句主要是对信号名 a、b、s和进行端口模式和端口数据类型的定义。
PORT (a,b,s : IN BIT ; --PORT为端口,IN表示为输入 ,非末句,后加;
y : OUT ); --OUT为输出,PORT语句内最后一句,后不加;语句外加;
5.端口模式
在实体描述中,用IN 和 OUT 分别定义端口 a、b和 s 为信号输入端口,y为信号输出端口。
一般地,可综合的,即能将 VHDL 序编译成可实现的电路端口模式有如下四种,用于定义端口上数据的流动方向和方式:
(1) IN:输入端口。定义的通道为单向只读模式,即规定数据只能出此端口被读入实体中。
(2)QUT:输出端口。定义的通道为单向输出模式,即规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值。
(3)INOUT:双向端口。定义的通道确定为输入输出双向端口,即从端口的内部看,可以对此端口进行赋值,或通过此端口读入外部的数据信息;而从端口的外部看,信号既可由此端口流出,也可向此端口输入信号,如 RAM 的数据口、单片机的 IO 口等。
(4)BUFFER:缓冲端口。其功能与INOUT 类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器设计,可将计数器输出的计数信号回读,以作为下一计数值的初值。与INOUT 模式相比,BUFFER 回读的信号不是由外部输入的,而是由内部产生、向外输出的信号。
6.关键词
关键字,或关键词(key word)是指 VHDL 中预定义的有特殊含义的英文词语。VHDI程序中是不能用关键字命名自用对象的,如用作标识符等。
ENTITY、ARCHITECTURE、END、IF、ELSE、OUT和IN等,还有AND、OR等逻辑操作符,都属于关键字。由于现在的多数 VHDL 文本编辑器,包括 Quartus I 的编辑器,都是关键字敏感型的,即当遇到关键字时会以特定颜色显示,所以在编辑程序时通常不会误用关键字。
不要误将 EDA 软件工具库中已定义好的关键词或元件名当作普通标识符来用
VHDL 的关键字是大小写不敏感的,即在同一程序中,关键字大小写可混用
7.标识符
标识符(identifier)是设计者在 VHDL 程序中自定义的,用于标识不同名称的词语例如用作实体名、结构体名、端口名或信号名等。如出现过的 mux2la、b、one等。
标识符也不区分大小写。在同一 VHDL 序中,标识符A和a、y和Y分别表示同一信号。
标识符不应用数字、数字起头的文字或中文来表述。
符号“- -”是注释符号。注释符号可用于隔离程序,添加程序说明文字。注释符号“--”后的文字仅仅是为了使对应的数据或语句更容易被看懂,它们本身没有功能含义,也不参加逻辑综合。
以上就是北北分享的全部内容啦!第一次写博客,内容较为浅显,若有什么错误,请多多批评!