VHDL概述

发布时间 2023-04-11 15:21:50作者: 我就一水

VHDL概述

实体说明

不论是简单的数字电路还是一个微处理器或者系统,都由实体构成,实体的结构

ENTITY 实体名 IS
    [类属参数说明];
	[端口说明];
END ENTITY 实体名

以上就是一个基本设计单元的实体说明

类属参数说明

必须放在端口说明之前,用于指定参数

端口说明

端口说明是对基本设计实体(单元)与外部接口的描述, 书写格式的描述

PORT(端口名{, 端口名}:方向 数据类型名;
	……
	端口名{, 端口名}:方向 数据类型名;
	);

端口名

一般是赋予外部引脚的名称,为英文字母加数字

端口方向

image

用BUFFER时与该端口连接的另外一个元器件的端口也要用BUFFER说明,而OUT则没有此要求

顺序语句

与书写顺序有关,只能出现在进程、过程、函数中

变量赋值语句

格式[variable]目标变量名[: 数据类型]: = 表达式

variable a,b: std_logic
a:='1';
b:='0';

注: 变量是局部的,暂时性的数据对象,变量的赋值立即生效

std_logic

std_logic是长度为1的逻辑 与bit 相似,只是bit只能是'0 ’和'1‘ 而std_logic有以下九种状态:

'U'——初始值, 'X'——不定,

‘0’——0, '1'——1,

‘Z’——高阻, 'W'——弱信号不定,

‘L’——弱信号0, 'H'——弱信号1,

'-'——不可能的情况

单元素赋值

VARIABLE a, b: STD_LOGIC; 
VARIABLE x,y:INTEGER RANGE 15 DOWNTO 0;
a:='1';
b:='0'; 
x:=11; 
y:=2+x;

注意: signal e:integer range 0 to 8; 是不是指随便怎么编,e的...答:e的取值只能是0 1 2 3 4 5 6 7 8 超过8会自动返回到0,

数组赋值

数组元素赋值目标的表示格式

单个元素:标识符(下标名) 比如 b(5)

多个元素:标识符(下标1 to / downto 下标2)

VARIABLE a,b:STD_LOGIC_VECTOR(7  DOWNTO  0); 
b(7  DOWNTO  0):=“10110010”;    
a:=b; 



VARIABLE a,b : STD_LOGIC_VECTOR (1 TO 4);
b(1 TO 4):="1011";
a(1 TO 2):=b(3 TO 4);               

image

信号赋值语句

格式目标信号名 <= 表达式[after时间量]

注: 信号的赋值时有延时性的,信号量是全局量

SIGNAL y,z : STD_LOGIC;
SIGNAL a,b :STD_LOGIC_VECTOR(0 TO 3);
a <= "1010"; 
b <= "1000";
y <= a(1);                   
z <= b(3);                  

STD_LOGIC_VECTOR是数组

延时性举例

PROCESS ( a, b, c, d )
BEGIN 
  d<=a;
  x <= c XOR d;
  d<=b;
  y <= c XOR d;
  END PROCESS;

​ x <= c XOR b;

​ y <= c XOR b;

IF语句

IF 条件 THEN
顺序处理语句;
ENDIF

# 二选一
IF 条件 THEN
	顺序处理语句1;
ELSE
	顺序处理语句2;
ENDIF

# 多路选择
IF 条件1 THEN
	顺序处理语句1;
ELSIF 条件2 THEN
	顺序处理语句2;
	……
ELSE
	顺序处理语句x;
ENDIF

示例

IF sel='1'THEN
	c<=a;
ELSE
	c<=b;
END IF;

case 语句

CASE 表达式 IS
	WHEN 选择值=>顺序语句1;
	WHEN 选择值=>顺序语句2;
	【WHEN OTHERS=>顺序语句n】;
END CASE 

注意:IF语句是具有优先级;case语句没有优先级,必须穷举尽

loop语句

无限loop

[标号]:LOOP
	顺序处理语句;
END LOOP[标号];

无线循环功能,只有通过控制转向语句才可退出循环。

示例

L2:LOOP
	A:=A+1;
	EXIT L2 WHEN A>10;
END LOOP L2

for loop

[标号]:FOR 循环变量 IN 循环次数范围 LOOP
	顺序处理语句;
END LOOP[标号];

实现循环功能,每次循环时变量在范围内变化一次。循环变量不用事先说明,但不能含有信号和变量。

while loop

[标号]:WHILE 循环条件  LOOP
	顺序处理语句;
END LOOP[标号];

若条件为真,则进行循环;若条件为假则结束循环

next 语句

  • NEXT

    无条件终止当 前循环,跳回到本次循环LOOP语句处,开始下一次循环。

  • NEXT LOOP

    标号表明下一次循环的起始位置。当有多重LOOP语句嵌套时,可以跳转到指定标号的LOOP语句处,重新开始执行循环操作。

  • NEXT LOOP标号WHEN条件表达式

    如果条件表达式的值为TRUE,则执行NEXT语句,否,则循环正常继续。

exit 语句

  • exit
  • exit loop
  • exit loop 标号 when 条件表达式

wait语句

  • wait 无线等待

  • wait on 敏感信号变化是结束挂起

    PROCESS
     BEGIN  
         Y<=a AND b; 
          WAIT ON a, b;			-- 当a,b任一信号变化时发生变化时,结束挂起,继续执行之后的语句
     END PROCESS;
    
  • wait until 布尔表达式 条件满足时结束挂起

    表达式方式

    信号=VALUE;
    信号’EVENT AND 信号=VALUE;
    NOT信号’STABLE AND 信号=VALUE; 
    
  • wait for 表达式 时间到时结束挂起

    当执行到该语句时,进程被挂起,直到指定的时间到,结束挂起,继续执行后面的语句。

  • 多条WAIT语句

    指WAIT语句可以使用多个等待条件,只要一个或多个满足,则结束挂起。

  • 超时等待处理

    为防止“死锁”增加的超时处理语句。常与断言语句合用。

子程序调用语句

子程序包括过程和函数,子程序可以在结构体或程序包的任何位置被调用

  • 过程调用格式

    过程名(参数表 );=
    
  • 函数调用格式

    函数名(参数表);
    
  • 过程和函数的区别

    过程的参数可以是IN、INOUT或OUT模式,而函数只能是IN模式。

    函数调用返回一个指定类型的值,过程没有。

return

子程序返回。当“表达式”缺省时,只能用于过程;当有“表达式”时,只能用于函数,并且必须返回一个值。

RETURE [表达式];

null语句

空操作

格式:   NULL;

预定义属性描述语句

属性:是关于实体、结构体、类型、信号、变量等项目的一些特征。属性可通过一个值或一个表达式表示。

属性描述语句作用:实现对项目的特性进行检测或统计。

预定义属性描述语句的格式:项目名’属性标识符

格式 含义
信号’event 在一段时间内若有信号事件发生则返回“true”,反之,返回“false”。
信号’active 在一段时间内若信号活跃则返回“true”,反之,返回“false”。
信号’last_event 返回信号从前一个事件发生到现在时刻所经历的时间值;
信号’last_value 返回信号在最近一个事件发生以前的值;
信号’last_active 返回信号从前一次信号活跃到现在时刻所经历的时间值;
信号’STABLE[t] 在时间t内若没有事件发生则返回“true”的布尔信号,反之,返回“false”的布尔信号。

[示例]

-- 检查时钟信号clk上升沿方式:
clk‘EVENT AND clk=‘1’;
NOTclk‘STABLE AND clk=‘1’;



-- 检查脉冲宽度方式
(falling_edge(clk)) AND (clk'LAST_EVENT>=10 ns);    ---最小正脉冲宽度检查
( rising_edge(clk)) AND (clk'LAST_EVENT>=10ns);      --最小负脉冲宽度检查


并行语句

语句的执行与书写顺序无关。各并行语句之间可以通过信号交换信息或相互独立。

每个并行语句代表一个功能单元,一个或多个功能单元组成一个结构体。

进程语句(PROCESS)

PROCESS语句格式:
     [进程名]:PROCESS[(敏感信号参数)] 
           [变量说明语句;] 
     		BEGIN   
              	顺序描述语句;
     END   PROCESS[标号];

PROCESS内部语句为顺序执行语句 ,但进程本身是并发语句。

进程在敏感信号变化时触发执行,也可以用WAIT等待语句实现触发。

但需要注意,在进程语句中,敏感信号表和WAIT语句不能共同存在于一个进程之中。

  • 不含敏感信号表的进程

    ARCHITECTURE ART OF STAT IS
    BEGIN
        P1:PROCESS
        BEGIN
            WAIT UNTIL CLOCK;   
            IF(DRIVER=‘1’)THEN
                CASE OUTPUT IS
                    WHEN S1=>OUTPUT<=S2;
                    WHEN S2=>OUTPUT<=S3;
                    WHEN S3=>OUTPUT<=S4
                    WHEN S4=>OUTPUT<=S1;
                END CASE;
            END IF;
    END PROCESS P1;
    END ART;
    
  • 含敏感信号表的进程

    • 同步进程的敏感信号表中只有时钟信号

      PROCESS(CLOCK)
      BEGIN
      IF(CLOCK’EVENT  AND  CLOCK=‘1’ ) THEN
              IF RESET=‘1’ THEN
                  DATA<=“00”;           
              ELSE DATA<=IN_DATA; 
              END IF;
          END IF;
      END PROCESS;
      
    • 异步进程的敏感信号表中除时钟信号外还有其他信号

      PROCESS(CLK,RESET)    
         BEGIN
          IF RESET=‘1’ THEN
              DATA<=“00”;
          ELSE IF CLK’EVENT AND CLK=‘1’ THEN
              DATA<=IN_DATA;
              END IF;
          END IF;
      END PROCESS;
      

并发信号赋值语句

简单信号赋值语句

格式:赋值目标 <= 信号量表达式;

当右边值发生变化时完成代入功能。
在进程之外执行语句,等效于一个进程的缩写。

ARCHITECTURE behave OF a_bar IS
      BEGIN
         output <= a;
END behave;

-- 等价于

ARCHITECTURE behave OF a_bar IS
BEGIN
PROCESS(a,)
  output <= a;
END PROCESS;
END behave;

并发信号赋值语句

  • S<=S1&S2; 中 & 是连接操作