VHDL硬件描述语言(五)VHDL的顺序语句

顺序语句并行语句是VHDL中的两大基本描述语句系列。

一、前言

所谓顺序语句,是指在仿真意义上具有一定顺序性(或者说在逻辑上有先后之分),并不意味着这些语句对于的硬件结构也有相同的顺序性。
所有门电路是并行地工作,并没有先后之分。以并行的工作方式实现顺序的逻辑是硬件描述语言的一大特点。

1.1 顺序语句的特点:

  1. 语句的执行和书写顺序相同。
  2. 顺序语句只能应用在进程和子程序中。

1.2 VHDL中常用的几种顺序描述语句:

  1. 简单信号赋值语句(signal assignment)
  2. 变量赋值语句(variable assignment)
  3. wait语句
  4. if 语句
  5. case 语句
  6. loop语句
  7. next语句
  8. exit语句
  9. null 语句
  10. return 语句
  11. 断言(assert)语句

二、wait语句

进程在仿真运行中总处于两种状态:执行或者挂起。
当执行到wait语句时,运行程序将被挂起,直到满足此语句设置的结束挂起条件后,将重新开始执行进程中的程序。

wait语句格式

对不同的结束挂起条件的设置,wait语句有以下四种不同的语句格式:

(1)WAIT;

表示永远挂起

(2)WAIT ON 信号表;

敏感信号等待语句,信号表中列出的信号是等待语句的敏感信号,敏感信号的变化将结束挂起,重新启动进程。

(3)WAIT UNTIL 条件表达式;

条件等待语句,被此语句结束挂起的进程需顺序满足如下两个条件,才能脱离挂起状态。
(1)在条件表达式中所含的信号发生了变化;
(2)此信号改变后,且满足wait语句所设的条件。
常用表达方式:

WAIT UNTIL 信号 = Value ; 
WAIT UNTIL 信号’EVENT AND 信号 = Value;

例:寄存器
VHDL硬件描述语言(五)VHDL的顺序语句_第1张图片

library ieee;
use ieee.std_logic_1164.all;

entity example is
	port(pin : in bit_vector(3 downto 0);
			clk,cnt : in bit;
			pout : out bit_vector(3 downto 0)
			);
end example;

architecture behave of example is
begin
	process
	begin
		wait until clk'event and clk='1';
		if cnt='1' then 
			pout<=pin;
		end if;
	end process;
end behave;

(4)WAIT FOR 时间表达式;

超时等待语句,时间表达式说明需要等待的时间

三、if语句

if语句格式

1)

if 条件句 then 顺序语句;
end if;

例:带控制口的加法器
VHDL硬件描述语言(五)VHDL的顺序语句_第2张图片

library ieee;
use ieee.std_logic_1164.all;

entity example is
 port(a , b : in integer;
		cnt : in bit;
		cout : out integer
	  );
end example;

architecture behave of example is
 begin
  process(cnt)
   begin
	 if cnt='1' then
		cout<=a+b;
	 end if;
  end process;
end behave;

2)

if 条件句 then 顺序语句; 
else 顺序语句;
end if;

3)

if 条件句 then
	if 条件句 then
		…
	end if;
end if;

4)

if 条件句 then 顺序语句; 
	elsif 条件句 then 顺序语句;
			…
	else 顺序语句; 
end if;

以4选1数据选择器为例

真值表:

s y
00 a
01 b
10 c
11 d
library ieee;
use ieee.std_logic_1164.all;

entity example is
 port ( a,b,c,d : in std_logic_vector(3 downto 0);
		  s : in std_logic_vector(2 downto 0);
        y : out std_logic_vector(3 downto 0)
		 );
end example;

architecture behave of example is
begin
 p1:process(d) 
    begin
	   --if 案例
     if s="00" then y<=a;
	  elsif s="01" then y<=b;
	  elsif s="10" then y<=c;
	  else  y<=d;  
     end if;
 end process p1;
end behave; 

四、case语句

4.1 case语句格式

CASE 表达式 IS
	When 选择值 => 顺序语句;
	When 选择值 => 顺序语句;
		...
END CASE ;

选择值可以有四种不同的表达方式:

  1. 单个普通数值,如6。
  2. 数值选择范围,如(2 TO 4),表示取值为2、3或4。
  3. 并列数值,如3|5,表示取值为3或者5。
  4. 混合方式,以上三种方式的混合。

使用CASE语句需注意:
1. 条件句中的选择值必须在表达式的取值范围内;
2. 所有条件句中的选择值应完全覆盖case语句中表达式的取值。
3. 每一条件句的选择值只能出现一次。
4. case语句中至少要包含一个条件句

4.2 案例

以8-3译码器为例

library ieee;
use ieee.std_logic_1164.all;

entity example is
 port ( d : in std_logic_vector(7 downto 0);
        q : out std_logic_vector(2 downto 0)
		 );
end example;

architecture behave of example is
begin
 p1:process(d) 
    begin
    --case 案例
     case d is
       when "01111111" =>q<="111";
       when "10111111" =>q<="110";
       when "11011111" =>q<="101";
       when "11101111" =>q<="100";
		 when "11110111" =>q<="011";
       when "11111011" =>q<="010";
       when "11111101" =>q<="001";
       when "11111110" =>q<="000";
       when others =>null;
     end case;
 end process p1;
end behave; 

五、LOOP语句

LOOP语句就是循环语句,使所包含的一组顺序语句被循环执行,循环次数可由设定的参数决定。一般用来描述片逻辑及迭代电路的行为。

常用的书写格式

1)FOR循环变量

[标号:] FOR 循环变量 IN 离散范围 LOOP
				顺序语句
			  END LOOP [标号];

说明:

  • FOR后的循环变量是一个临时变量,属LOOP语句的局部变量,不必事先定义;每次循环中,循环变量都要在离散范围内变化。
  • LOOP循环的次数最好以常数表示,否则,在LOOP体内的逻辑可以重复任何可能的次数。
    例:0~9累加
sum:=0;
for i in 0 to 9 loop
	sum:=sum+i;
end loop;

2)While条件

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

与FOR_LOOP语句不同的是:WHILE_LOOP语句并没有给出循环次数范围,没有自动递增循环变量的功能,而是给出了循环执行顺序语句的条件。
这里的循环控制条件可以是任何布尔表达式,当条件为TRUE时继续循环,否则跳出循环。

3)单个LOOP语句

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

这种循环方式是一种最简单的语句形式,它的循环方式需引入其他控制方式(如next语句、exit语句)后才能确定。

六、NEXT语句

6.1 语句格式next [标号][when条件];

1)NEXT;

执行到NEXT时,无条件中止当前循环,返回循环起点,开始下次循环。

2)NEXT LOOP标号;

执行到NEXT时,无条件中止当前循环,返回LOOP标号处,开始下次循环。

3)NEXT LOOP标号 WHEN 条件表达式;

WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为时,执行NEXT语句,进入跳转操作,否则继续向下执行。

七、EXIT语句

7.1语句格式EXIT[标号][WHEN条件];

1)EXIT;

执行到NEXT时,无条件中止当前循环,跳出循环

2)EXIT LOOP标号;

执行到NEXT时,无条件中止当前循环,返回LOOP循环语句的结束处,跳出循环。

3)EXIT LOOP标号 WHEN 条件表达式;

WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为时,执行EXIT语句,跳出循环。

注:EXIT语句与NEXT语句十分相似,都是LOOP语句的内部循环控制语句。

NEXT语句与EXIT 语句的区别:

  1. NEXT语句跳转到LOOP标号指定的LOOP处----即跳到LOOP语句的起点
  2. EXIT 语句跳转到LOOP循环语句的结束处----即跳出循环

八、null语句

null语句表示一个空操作,不发生任何行为,目的只是使得程序执行到下一句。
空操作语句的语句格式:NULL;

九、顺序断言(ASSERT)语句

断言语句主要用于程序仿真、调试时使用,在综合时忽略。

其格式为:ASSERT 条件 [REPORT 输出信息] [SEVERITY 级别]

当执行ASSERT语句时,如果条件为,则继续向下执行;如果条件为假,则输出错误信息和错误严重程度的级别,在REPORT后面跟的是设计者所写的字符串,通常是说明错误的
原因,并且用双引号“ ”将字符串括起来。在VHDL中,错误的严重程度可分为4个级别,并跟在SEVERITY后面,按严重程度由重到轻分别是:NOTE、WARNING、ERROR、FAILURE

你可能感兴趣的:(FPGA,硬件工程)