vhdl基本语法 下载本文

内容发布更新时间 : 2024/12/23 22:17:52星期一 下面是文章的全部内容请认真阅读。

ELSE

语句方块B END IF 格式四: PROCESS (CLK) BEGIN

IF CLK'event AND CLK='1' THEN 语句方块 END IF;

END PROCESS;

语句格式一是IF语句的完整形式,格式二和格式三是IF语句的简化形式,格式四是IF语句的一种特例,它用于描述带有时钟信号CLK上升沿触发的时序逻辑电路。IF语句可以嵌套使用。

IF 语句中至少应包含一个条件表达式,先判断条件表达式的结果是否为真,若为真,则执 行THEN后面的语句方块的语句,执行完以后就跳转到END IF之后的语句。若条件条件表达式的结果为假,则执行ELSE之后的语句方块。 例如采用IF-ELSE实现的四选一数据选择器结构体如下: ARCHITECTURE archmux OF mux4 IS BEGIN

PROCESS(s, a0, a1, a2, a3) BEGIN

IF s= “00” THEN y <= a0 ;

ELSIF s= “01” THEN y <= a1 ;

ELSIF s= “10” THEN y <= a2; ELSE y <= a3; END IF;

END PROCESS; END archmux;

每一个 IF语句都必须有一个对应的 END IF语句, IF语句可以嵌套使用,即在一个IF 语句中可以调用另一个 IF语句。ELSEIF允许在IF语句中出现多次。

例1-3-4用格式四描述一般的D触发器程序如下,D触发器的电路符号如图1-3-1所示。

图1-3-1 D触发器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY dff1 IS PORT(

CLK, D : IN STD_LOGIC; Q : OUT STD_LOGIC ); END dff1;

ARCHITECTURE a OF dff1 IS BEGIN

PROCESS (CLK) BEGIN

IF CLK'EVENT AND CLK='1' THEN Q <= D;

END IF;

END PROCESS; END a;

程序中,时钟信号(CLK)是敏感信号,用表达式CLK.EVENT AND CLK=.1.判断CLK 是否产生上升沿(由低电平变成高电平),若CLK产生上升沿,则执行Q <= D,否则,Q保

持不变。 小提示:

判断上升沿还可以写成 IF RISING_EDGE(CLK);如果要判断时钟信号产生下降沿, 可以用表达式CLK.EVENT AND CLK=.0.。或者 FALLING_EDGE(CLK)。其中CLK右 上角的.表示信号的属性,其中EVENT表示信号内涵变化,是最常用的属性。对于信号 的其他属性可以查阅相关书籍,由于使用并不多则不作介绍了。 1.3.6 CASE-WHEN语句

CASE-WHEN语句属于顺序语句,只能在进程中使用,常用来选择有明确描述的信号。 语法格式:

CASE 选择信号X IS WHEN 信号值1 => 语句方块1 WHEN 信号值2 => 语句方块2 WHEN 信号值3 =>

WHEN OTHERS => 语句方块 N

CASE-WHEN语句的功能与WITH-SELECT语句的功能相似,都是通过选择信号X的值 的变化来选择相应的操作。但两者之间不同的是:

(1)CASE-WHEN语句必须放在进程中,而WITH-SELECT语句是并行语句必须放在进 程外;

(2)CASE-WHEN语句根据选择信号的值,执行不同的语句方块,完成不同的功能。 而WITH-SELECT语句根据选择信号的值只能执行一个操作。

(3) 使用CASE-WHEN语句时,WHEN语句中的信号值必须在选择信号的取值范围内, 如果WHEN语句中列举的信号值不能覆盖选择信号S的所有取值,就用关键字 OTHERS表示未能列出的其他可能的取值。

例如采用CASE-WHEN实现的四选一数据选择器结构体: ARCHITECTURE archmux OF mux4 IS BEGIN

PROCESS(S, A0, A1, A2, A3) BEGIN

CASE S IS

WHEN “00” => y <= A0 ; WHEN “01” => y<= A1 ; WHEN “10” => y <= A2 ; WHEN OTHERS => y <= A3; END CASE;

END PROCESS; END archmux;

该结构体的功能是:通过PROCESS对信号S进行感测,当S= “00”时,Y=A0,当S= “01”时,Y=A1,当S= “10”时,Y=A2,当S= “11”时,Y=A3,程序中用关键字OTHERS表示S= “11”。 小提示:

使用CASE语句的时候要注意: 1. 至少要有一条分支条件 2. 分支条件之间不能重叠

3. 分支条件要覆盖完全,如果不能完全列出,则要使用OTHERS关键字。以免综合出 不必要的锁存器,

1.3.7 FOR-LOOP语句

FOR-LOOP语句是一种循环执行语句,它可以使包含的一组顺序语句被循环执行,其执 行的次数可由设定的循环参数决定,只要设计到重复的动作需求时,就可以考虑使用循环语 句。FOR-LOOP语句分为递减方式和递增方式,两种语法格式为: (1) 递减方式

FOR I IN 起始值 DOWNTO 结束值 LOOP 顺序语句 END LOOP; (2) 递增方式

FOR I IN 起始值 TO 结束值 LOOP 顺序语句 END LOOP;

在循环语句中,I是循环变量决定循环次数,循环变量的变化范围由起始值和结束值的大 小确定,起始值和结束值都应该取整数。当采用DOWNTO递减方式时,取起始值大于结束 值,I从起始值开始,每执行一次循环后I递减1,直到结束值为止;当采用TO递增方式时, 取结束值大于起始值,I也是从起始值开始执行,每次循环增加1。

例1-3-5 用FOR-LOOP语句描述奇偶校验器中的奇校验。输入四位二进制数,当检测到数据中1的位数为奇数时,输出Y=1,否则,Y=0。 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY loop1 IS

PORT(

D : IN STD_LOGIC_VECTOR(0 TO 7); --输入D是八位二进制数 Y : OUT STD_LOGIC );

END loop1; tmp := .0.; BEGIN

FOR I IN 0 TO 7 LOOP

tmp := tmp XOR D(I); --变量赋值语句是立即赋值,tmp=tmp⊕D(I) END LOOP; Y<= tmp ;

END PROCESS; END a;

1.3.8 WHILE-LOOP语句

WHILE-LOOP循环语句,WHILE-LOOP循环是LOOP循环的另外一种形式,其语法格式为: 循环标号:while 条件表达式 loop 顺序处理语句

end loop 循环标号;

循环标号用来作为该WHILE-LOOP循环语句的标识符。WHILE后面的条件表达式是布尔表达式。WHILE-LOOP循环语句在每次执行前要先检查条件表达式的值,当条件表达式的值为TRUE时,就执行循环体中的顺序处理语句,执行完毕好返回到该循环的开始,然后再次检查条件表达式的值;若表达式值为FASLE,那么结束循环并转而执行WHILE-LOOP后的语句。 1.3.9 跳出循环语句 小提示:

一般综合器不支持WHILE-LOOP语句,所以对于循环,推荐使用FOR-LOOP语句。 (1)NEXT跳出循环语句

在LOOP中,NEXT语句用于跳出本次循环,转入下次循环,并重新开始。其语法格式为: NEXT 循环标号 WHEN 条件表达式;

其中循环标号用来表明结束本次循环后下一次循环的起始位置;条件表达式的值为布尔量, 是跳出本次循环的条件,条件表达式的值为真时,跳出本次循环,循环标号和条件表达式是 可选项。当NEXT后无循环标号和条件表达式时,要执行到该语句就立即无条件跳出本次循环,从LOOP语句的起始位置进入下一次循环。 (2)EXIT退出循环语句

在LOOP中,EXIT语句在循环体内用来描述退出循环并结束循环这一功能。其语法格式为: EXIT 循环标号 WHEN 条件表达式; WHEN后的条件表达式是布尔表达式,exit退出循环语句在条件表达式为真时,退出循环标

号指定的循环体。

EXIT出循环语句WHEN后面的条件表达式可以缺少,成为无条件退出循环语句 EXIT 循环标号;

当遇到无条件退出循环语句时,立即从循环标号指明的循环体中退出,EXIT退出循环语句 后的循环标号也可缺少,成为默认无条件退出循环语句时,立即从EXIT所在的循环体中退 出。

小提示:

NEXT 与 EXIT 语句类似于C语言中的 CONTINUE 与 BREAK 语句。

VHDL还有WAIT语句,ASSERT语句,NULL语句,这些语句并不常用,如果要了解这些语句的用法,请查阅相关教材。 1.4 VHDL高级语句

前面详细地介绍的VHDL常用的并行语句和顺序语句,在此基础上进一步介绍VHDL 中用于结构化和模块化的设计语句,包括:进程语句(PROCESS)、元件和元件例化语句、 生成语句、子程序和程序包等。

1.4.1 进程(PROCESS)语句

进程语句是在结构体中用来描述特定电路功能的程序模块。进程语句的内部主要是由一 组顺序语句组成的。进程中的语句具有顺序处理和并行执行的特点。在一个结构体中可以包 含多个进程语句,多个进程语句之间的是并行同时执行的,所以并行语句本身属于并行语句。 进程语句即可以用来描述组合逻辑电路,也可以描述时序逻辑电路。进程语句的语法结构格 式为:

<进程名称> : PROCESS <敏感信号表>

进程说明区:说明用于该进程的常数,变量和子程序。 BEGIN

变量和信号赋值语句 顺序语句

END PROCESS <进程名称>;

(1)每个进程语句结构都可以取一个进程名称,但进程语句的名称是可以选用的。进 程语句从PROCESS开始至END PROCESS结束。进程中的敏感信号表(sensitivity list)只 能是进程中使用的一些信号,而不能是进程中的变量。当敏感信号表中的某个信号的值发 生变化时,立即启动进程语句,将进程中的顺序语句按顺序循环执行,直到敏感信号表中 的信号值稳定不变为止。也可以用WAIT语句来启动进程。

(2)在进程说明部分能定义常数、变量和子程序等,但不能在进程内部定义信号,信 号只能在结构体说明部分定义。

(3)在进程中的语句是顺序语句,包括信号赋值语句、变量赋值语句、IF语句、CASE 语句和LOOP语句等

用PROCESS语句描述的计数器的程序如下: PROCESS(CLK, Rd) --进程(敏感信号表) BEGIN

IF (Rd=.0.) THEN Q <= “0000”;

ELSIF (CLK. EVENT AND CLK=.1.) THEN IF(en=.1.) then Q <= Q+1; END IF;