




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 VHDL语法基础,3.1 顺序语句 3.2 并发语句,3.1 顺序语句,信号代入语句 变量赋值语句 WAIT语句 IF语句 CASE语句 LOOP语句 NEXT语句 EXIT语句 RETURN语句 NULL语句,顺序语句 用在进程或子程序中,用来定义进程或子程序的行为 。 顺序语句每一条语句的执行(指仿真执行)都是按语句排列的次序执行的。,顺序语句具有如下特征: 顺序语句只能出现在进程或子程序中。 顺序语句描述的系统行为有时序流、控制流、条件分支和迭代算法等。 顺序语句用于定义进程、子程序等的算法。 顺序语句的功能有算术、逻辑运算;信号、变量的赋值;子程序调用等 。,3.1.1 IF语
2、句,门闩控制的IF语句的语法格式为: IF 条件 THEN 顺序处理语句; END IF;,例:IF(a=1)THEN c=b; END IF;,该IF语句所描述的是一个门闩电路: 当门闩控制信号量a =1时,输入信号量 b 任何值的变化都将被赋予输出信号量 c 。既是说,此时 c值与 b值是永远相等的。 当a1时, c= b语句不被执行, c将维持原值不变,而不管信号量 b 值发生什么变化。 这种描述经逻辑综合,实际上可以生成一个 D触发器 。,顺序语句,IF语句是一种条件 语句。其语句结构有以下4种: 1. 门闩控制的IF语句; 2. 2选择控制的IF语句; 3. 多选择控制的IF语句;
3、4. 嵌套式的IF语句。,符号,特性表,D触发器,例3-1 设计D触发器(下页相关知识介绍)。 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY dff IS PORT (clk, d: INSTD_LOGIC; q: OUTSTD_LOGIC); END dff; ARCHITECTURE rtl OF dff IS BEGIN PROCESS (clk) BEGIN IF (clkevent and clk=1) THEN q=d; END IF; END PROCESS ; END rtl;,顺序语句,IF语句,2选择控制的IF语句的语法
4、格式为: IF 条件 THEN 顺序处理语句 l; ELSE 顺序处理语句 2; END IF;,顺序语句,例3-2 设计2选1的数据选择器。 ARCHITECTURE rtl OF mux2_1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel=1) THEN c=a; ELSE c=b; END IF; END PROCESS; END rtl;,顺序语句,IF语句,多选择控制的IF语句的语法格式为: IF 条件1 THEN 顺序处理语句1; ELSIF 条件2 THEN 顺序处理语句2; ELSIF 条件n THEN 顺序处理语句n; ELSE 顺序处理语句
5、n+l; END IF;,顺序语句,例a 设计4选1的多路选择器 ENTITY mux4_1 IS PORT(d : INSTD_LOGIC_VECTOR(3 DOWNTO 0); sel : INSTD_LOGIC_VECTOR(1 DOWNTO 0); y : OUT STD_LOGIC); END mux4_1; ARCHITECTURE rtl OF mux4_1 IS BEGIN PROCESS (d, sel) BEGIN IF (sel=00) THEN y=d(0); ELSIF (sel=01) THEN y=d(1); ELSIF (sel=10) THEN y=d(2);
6、 ELSE y=d(3); END IF; END PROCESS; END rtl;,IF语句至少应有一个条件句,条件句必须由布尔 表达式构成。 IF语句根据条件句产生的判断结果为 true 或 false , 有条件地选择执行其后的顺序语句。 在IF语句的条件表达式中只能使用关系运算操作 (=、/=、 = )及逻辑运算操作的组 合表达式。,顺序语句,【例b】 SIGNAL A,B,C,P1,P2,Z : std_logic; . IF (P1=1) THEN Z=A; -满足此语句的执行条件是(P1=1) ELSIF (P2=0) THEN Z=B; -满足此语句的执行条件是(P1=0)A
7、ND(P2=0) ELSE Z=C; -满足此语句的执行条件是(P1=0)AND(P2=1) END IF;,从本例可以看出, IF_THEN_ELSIF语句中顺序语句的执行条件具有向上相与的功能,有的逻辑设计恰好需要这种功能。例3-3正是利用了这一功能以十分简洁的描述完成了一个8线_3线优先编码器的设计。 向上相与:写在前面的条件句的优先级高于后面的条件语句,次序不能颠倒。,8线3线优先编码器(为高电平时进行编码),例3-3 设计8线3线优先编码器(低电平时进行编码) LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY priencoder I
8、S PORT(input : IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0); END priencoder;,ARCHITECTURE rtl OF priencoder IS BEGIN PROCESS (input) BEGIN IF (input(7)= 1) THEN y= 111; ELSIF (input(6)= 1) THEN y= 110; ELSIF (input(5)= 1 ) THEN y= 101; ELSIF (input(4)= 1) THEN y= 100; ELSIF (
9、input(3)= 1 ) THEN y= 011; ELSIF (input(2)= 1) THEN y= 010; ELSIF (input(1)= 1 ) THEN y= 001; ELSE y= 000 ; END IF; END PROCESS; END rtl;,顺序语句,IF 条件 THEN IF 条件 THEN : : END IF ; END IF ; 应注意“END IF”语句的数量应和嵌入式“IF”语句的数量一致。 还需要注意的是:所有IF语句的条件判断输出是布尔量,即是“真”或“假”。因此在IF语句的条件表达式中只能使用关系运算操作及逻辑运算操作的组合表达式。,嵌套式I
10、F语句,3.1.2 CASE语句,CASE语句的一般格式为: CASE 条件表达式 IS WHEN 条件表达式的值=顺序处理语句; WHEN 条件表达式的值=顺序处理语句; END CASE;,CASE语句可以用来描述总线或编码、译码的行为,其功能是从众多不同语句的序列中选择其中之一执行之。 IF语句也具有类似的功能,但CASE语句具有比IF语句更强的可读性。,顺序语句,CASE语句中条件表达式的值可以有以下4种不同的表示形式: WHEN 条件表达式的值=顺序处理语句; WHEN 条件表达式的值 | 值 | 值=顺序处理语句; WHEN 条件表达式的值 to 值=顺序处理语句; WHEN OT
11、HERS=顺序处理语句;,CASE语句是无序的,所有表达式的值都是并行处理的; CASE语句所有表达式的值都必须穷举 ,且不能重复 , 不能穷尽的值用 OTHERS 表示 ; CASE语句中至少要包含一个条件语句。 对任意项 输入的条件表达式, VHDL不支持。 (即条件表达式的值不能含有X),顺序语句,四选一数据选择器,例3-4: 4选1多路选择器 ENTITY mux4_1 IS PORT(d : INSTD_LOGIC_VECTOR(3 DOWNTO 0); sel : INSTD_LOGIC_VECTOR(1 DOWNTO 0); y : OUT STD_LOGIC); END mux
12、4_1; ARCHITECTURE arch OF mux4_1 IS BEGIN PROCESS (d, sel) BEGIN CASE sel IS WHEN 00 =yyyyy=X; END CASE; END PROCESS; END arch;,CASE语句与 IF语句的区别 : 在IF语句中,先处理最起始的条件,如果不满足,再处理下一个条件。 在CASE语句中,没有值的顺序号,所有值是并行处理的。因此,在WHEN项中的值只能出现一次,且不能重复使用。,顺序语句,3线8线译码器,输入输出逻辑关系,例3-5a:3-8译码器 LIBRARY ieee; USE ieee.std_logi
13、c_1164.ALL; ENTITY decode3_8 IS PORT(a,b,c : IN STD_LOGIC; g1,g2a,g2b : IN STD_LOGIC; y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END decode3_8;,顺序语句,ARCHITECTURE rtl OF decode3_8 IS SIGNAL ind : STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN indyyyyyyyyy=XXXXXXXX; END CASE; ELSE y=“11111111; END IF; END PROCESS; EN
14、D rtl;,顺序描述语句,例3-5b:8-3编码器 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY encoder8_3 IS PORT(input : IN STD_LOGIC_VECTOR(7 DOWNTO 0); y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); END encoder8_3; ARCHITECTURE rtl OF encoder8_3 IS BEGIN PROCESS (input) BEGIN CASE input IS WHEN 01111111 =yyyyyyyyy=“XXX; EN
15、D CASE; END PROCESS; END rtl;,该例中,当某一项输入同时出现两个或两个以上的0时,y输出值就将变成X(可能是0 也可能是1 )。在逻辑综合时就认为是不可能的输出项,从而就可以大大简化逻辑电路的设计。在仿真时如果出现了不确定的X值,可以检查是否出现了不正确的输入。,顺序语句,CASE语句存在以下问题 : 对相同的逻辑功能,一般经综合后, CASE语句比IF语句的描述耗用更多的硬件资源,而且对于有的逻辑, CASE语句无法描述,只能用IF语句来描述,这是因为IF-THEN-ELSIF语句具有条件相与的功能和自然将逻辑值“_”包括进去的功能,有利于逻辑化简,而CASE语句
16、只有条件相或的功能。,顺序语句,3.1.3 LOOP语句 LOOP语句的书写格式一般有两种:,FOR 循环变量形成的LOOP语句,其一般格式为: 循环标号:FOR 循环变量 IN 循环范围 LOOP 顺序处理语句; END LOOP 循环标号;,循环变量是一个临时变量,属于局部变量。循环变量只能作为赋值源,不能被赋值,它由LOOP语句自动定义。 循环变量是一个整数变量,不用事先说明。 循环范围是指循环变量在循环中依次取值的范围。,顺序语句,例3-6 奇偶校验电路 ENTITY parity_check IS PORT(a : INSTD_LOGIC_VECTOR(7 downto 0); y
17、: OUT STD_LOGIC); END parity_check; ARCHITECTURE rtl OF parity_check IS BEGIN PROCESS(a) VARIABLE tmp : STD_LOGIC; BEGIN tmp:=0; FOR i IN 0 to 7 LOOP tmp:=tmp XOR a(i); END LOOP; y=tmp; END PROCESS; END rtl;,顺序语句,例3-6a 双向移位寄存器 ENTITY shift ISPORT(clr,clk,load,ctr,sr,sl : INSTD_LOGIC;d: INSTD_LOGIC_V
18、ECTOR(7 downto 0);q: OUTSTD_LOGIC_VECTOR(7 downto 0);END shift; ARCHITECTURE arc OF shift IS SIGNAL a : STD_LOGIC_VECTOR(7 downto 0); BEGIN q=a; PROCESS(clr,clk) BEGIN IF (clr=0) THEN a=00000000;,顺序语句,ELSIF (clkEVENT AND clk=1) THEN IF load=0 THEN a=d; ELSIF (load=1 AND ctr=0) THEN FOR i IN 7 downto
19、 1 LOOP a(i)=a(i-1); END LOOP; a(0)=sr; ELSIF (load=1 AND ctr=1) THEN FOR i IN 0 to 6 LOOP a(i)=a(i+1); END LOOP; a(7)=sl; END IF; END IF; END PROCESS; END arc;,顺序语句,LOOP语句,WHILE条件下的LOOP语句,其格式为: 循环标号:WHILE 条件 LOOP 顺序处理语句; END LOOP循环标号;,该语句中,如果条件为真,执行顺序处理语句; 否则,结束循环。,顺序语句,例3-7 用WHILE条件下的LOOP语句描述奇偶校验电
20、路。 ARCHITECTURE behave OF parity_check IS BEGIN PROCESS(a) VARIABLE tmp : STD_LOGIC; VARIABLE i : INTEGER; BEGIN tmp:=0; i:=0; WHILE(i8) LOOP tmp:=tmp XOR a(i); i:=i+1; END LOOP; y=tmp; END PROCESS; END behave;,虽然上述的两种描述都可以用来进行逻辑综合,但一般都不采用 WHILE-LOOP语句来进行描述。,顺序语句,NEXT语句 在LOOP语句中,NEXT语句用于跳出 本次循环 。,NE
21、XT语句的书写格式为: NEXT 标号 WHEN 条件;,NEXT后面的“标号 ”表示下一次循环的起始位置 ; “WHEN 条件 ”是NEXT语句的执行条件 。 NEXT后面若既无“标号” ,又无“WHEN 条件”, 则程序 立即无条件 跳出本次循环,从LOOP语句的起始位置转入 下一次循环。,顺序语句,例a: L1: WHILE i10 LOOP L2: WHILE j10 LOOP NEXT L1 WHEN i = j; END LOOP L2; END LOOP L1;,当 i = j 时, NEXT语句被执行,程序跳出内循环, 下一次从外循环开始执行。,顺序语句,例b: PROCESS
22、(a) CONSTANT maxlim :=255; BEGIN FOR i IN 0 to maxlim LOOP IF (done(i)=true) THEN NEXT; ELSE done(i)=true; END IF; q(i)=a(i) AND b(i); END LOOP; END PROCESS;,顺序语句,EXIT语句 在LOOP语句中,用EXIT语句跳出并结束整个循环状态(而不是仅跳出本次循环),继续执行LOOP语句后继的语句。,EXIT语句的书写格式为: EXIT 标号 WHEN 条件;,当 “WHEN条件”为真时,跳出LOOP至程序标号处。 如果EXIT后面无“标号”和
23、“WHEN 条件”,则程序执行到 该语句时即无条件从LOOP语句跳出,结束循环状态,继 续执行后继语句。,顺序语句,例a:PROCESS(a) VARIABLE int_a : INTEGER; BEGIN int_a:=a; FOR i IN 0 to maxlim LOOP IF (int_a =0) THEN EXIT; ELSE int_a := int_a -1; q(i)=3.1416/real(int_a*i); END IF; END LOOP; y=q; END PROCESS;,EXIT语句是一条很有用的控制语句,它提供了一个处理 保护、出错和警告等状态的简便方法。,顺序语
24、句,3.1.4 信号代入语句,信号代入语句的语法格式为: 目的信号量=信号量表达式;,该语句表明,将右边信号量表达式的值赋予左边目的信号量。 例如:a= b; 该语句表示: 将信号量 b 的当前值赋予目的信号量 a 。 需要指出的是: 1. 代入语句的符号“=”和关系运算的小于等于符“=”相同,应根据上下文的含义和说明正确判别其意义。 2. 信号代入语句符号两边的信号量的类型和长度应该是一的。,顺序语句,3.1.5 变量赋值语句,变量赋值语句的语法格式为: 目的变量 := 表达式;,该语句表明,目的变量的值将由表达式所表达的新值替代,但两者的类型必须相同。目的变量的类型、范围及初值应事先说明。
25、右边的表达式可以是变量、信号或字符。例如: a := 2; b := c+d; 注意:变量只在进程或子程序中使用,无法传递到进程之外。 它类似于一般高级语言的局部变量,只在局部范围内有效。,顺序语句,3.1.6 WAIT语句,WAIT语句有以下四种形式: WAIT -无限等待 WAIT ON 敏感信号表; -敏感信号量变化,进程启动 WAIT UNTIL 条件表达式; -表达式成立时,进程启动 WAIT FOR 时间表达式; -时间到,进程启动,WAIT语句是进程(含过程)的同步语句,是进程的启动点。在进程(或过程)中,当执行到WAIT 等待语句时,运行程序将被挂起,直到满足此语句的结束挂起条
26、件后,将重新开始执行进程(或过程)中的程序。 WAIT作为进程体的一条语句同进程体内的其它语句顺序执行。,未设置挂起条件,表示 永远挂起,即无限等待。,2. 敏感信号等待语句,即敏感信号一旦发生变化将结束挂起,再次启动进程。VHDL规定,已列出敏感信号表的进程中不能使用任何形式的WAIT语句。一般, WAIT语句可用于进程中的任何地方。,3. 条件等待语句。被此语句挂起的进程需满足如下两个条件才能结束挂起状态,重新启动: 条件表达式中所含信号发生了变化; 此信号改变后,且满足WAIT语句所设的条件。 两条件缺一不可,且必须依照以上顺序完成。,4. 超时等待语句(此语句不可综合,故不再讨论)。,
27、例 1:利用WAIT语句设计与非门电路。 nandx:PROCESS BEGIN y=a NAND b; WAIT ON a,b; END PROCESS nandx;,顺序语句,3.1.7 RETURN语句 RETURN语句是一段子程序结束后,返回主程序的控制语句。,返回语句的两种语法格式: RETURN; RETURN 条件表达式;,RETURN 用于函数和过程体内,用来结束最内层函数或过程体的执行。 第一种语法格式只能用于过程,它只是结束过程,并不返回任何值。 用于函数中的RETURN语句必须有条件表达式,并且必须返回一个值。 每一个函数必须至少包含一个返回语句,也可以拥有多个返回语句,
28、 但在函数调用时只有其中一个返回语句可以将值带出。,顺序语句,例a:RS触发器 PROCEDURE rs (SIGNAL s,r: IN STD_LOGIC; SIGNAL q,nq: OUT STD_LOGIC) IS BEGIN IF (s =1 AND r =1) THEN REPORT Forbidden state:s and r are equal to 1 ; RETURN; ELSE q=s AND nq AFTER 5ns; nq=r AND q AFTER 5ns; END IF; END PROCEDURE rs;,当 r、s 同时为1时,在IF语句中的RETURN语句将
29、中断过程。 程序中的时间延迟语句和REPORT语句是不可综合的。,顺序语句,例b:函数opt FUNCTION opt (a,b,opr : STD_LOGIC) RETURN STD_LOGIC IS BEGIN IF (opr=1) THEN RETURN(a AND b); ELSE RETURN(a OR b); END IF; END FUNCTION opt;,顺序语句,3.1.8 NULL语句,空操作语句的语法格式: NULL;,NULL语句不完成任何操作,类似于汇编语言中的 NOP语句,其作用只是使程序运行流程跨入下一步语句的执行。 NULL语句常用于CASE语句中,为满足所有
30、可能的条件,利用NULL来表示所余的不用条件下的操作行为。,顺序语句,例a:CASE opcode IS WHEN ”001”= tmp:= rega AND regb; WHEN ”101”= tmp:= rega OR regb; WHEN ”110”= tmp:= NOT rega; WHEN others= NULL; END CASE;,该例类似于CPU内部的指令译码器功能,“001”, “101”,“110”分别代表指令操作码,对于它们所对应在寄存器中的操作数的操作算法,CPU只对应这三种指令作反应,当出现其它码时不作任何操作。 对于有的EDA工具,MAX+PLUS对NULL语句的
31、执行会出现擅自加入锁存器的情况,对此应避免使用NULL语句,改用确定操作。如: WHEN others= tmp:= rega ;,顺序语句,3.2 并行语句,并发语句主要包括: 进程语句 BLOCK语句 并发代入语句 条件代入语句 选择信号语句 ASSERT语句 COMPONENT语句 GENERATE语句,并行语句结构是最具VHDL特色的。 在VHDL中,并行语句有多种语句格式,它们在结构体中的执行是同步进行的,或者说是并行运行的;其执行方式与书写顺序无关。 在执行中,并行语句之间可以有信息往来;也可以是互为独立、互不相关、异步运行(如多时钟情况)。但每一并行语句内部的语句运行方式可以不同
32、,即有并行执行方式(如块语句)和顺序执行方式(如进程语句)。,3.2.1 信号代入语句,顺序语句有两类: 一类是真正的顺序语句,一类是可以做顺序语句、又可以做并发语句、具有双重特性的语句。这类语句放在进程、子程序之外是并发语句,放在进程、子程序之内是顺序语句。 注意:信号代入语句根据所在位置不同,可以做顺序语句、又可以做并发语句。,信号代入语句分3种类型: 并行信号代入语句 条件信号代入语句 选择信号代入语句,三种语句的共同点是:赋值目标必须都是信号,所有代入语句与其他并行语句一样,在结构体内的执行是同时发生的,与它们的书写顺序无关。,并行信号代入语句 并行信号代入语句实际上是一个缩写的进程。
33、,例如: ARCHITECTURE behav OF a_var IS BEGIN output= a(i); END behav; 可以等效于 ARCHITECTURE behav OF a_var IS BEGIN PROCESS(a,i) BEGIN output=a(i); END PROCESS; END behav;,并发描述语句,并行信号代入语句在仿真时刻同时运行,它表征了各个独立器件的独立操作,从而真实地描述了实际硬件系统的工作情况。例如: a=b+c; d=e*f 并行信号代入语句可以仿真加法器、乘法器、除法器、比较器及各种逻辑电路的输出。因此,“=”的右面可以是算术运算表达
34、式,也可以是逻辑运算表达式,或者是关系运算表达式。,并发描述语句,条件信号代入语句 条件信号代入语句也是并发描述语句。,条件信号赋值语句的格式为: 目标信号 = 表达式1 WHEN 条件1 ELSE 表达式2 WHEN 条件2 ELSE 表达式n;,1. 条件信号代入语句与进程中的IF语句相同,具有顺序性,但ELSE不能省略。 2. 执行该语句时,每一赋值条件是按书写的先后关系逐项测定的,一旦发现条件为“true”,立即将表达式的值赋予目标信号。 3. 赋值条件的数据类型是布尔量。 4. 由于条件测试的顺序性,条件信号代入语句的赋值具有优先级别,其中第1子句优先级别最高,依次类推。,并发描述语
35、句,例3-9:设计xor_gate LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY xor_gate IS PORT(a,b: in std_logic; c: out std_logic); end xor_gate; ARCHITECTURE data_flow OF xor_gate IS BEGIN C = 0WHEN a=0AND b=0ELSE 1WHEN a=0AND b=1ELSE 1WHEN a=1AND b=0ELSE 0WHEN a=1AND b=1ELSE 0; END data_flow;,例a:4选1多路选择器 E
36、NTITY wmux4_1 IS PORT(i0, i1,i2,i3,a,b: INSTD_LOGIC; q: OUTSTD_LOGIC); END wmux4_1; ARCHITECTURE rtl OF wmux4_1 IS SIGNAL sel : STD_LOGIC_VECTOR(1 downto 0); BEGIN sel=b,并发描述语句,选择信号代入语句,选择信号赋值语句的格式为: WITH 条件表达式 SELECT 目标信号 = 表达式1 WHEN 条件1, 表达式2 WHEN 条件2, 表达式n WHEN 条件n;,1. 选择信号语句与进程中的CASE语句相似,但不能在进程中
37、应用。 2. 选择信号语句具有敏感量,即WITH后面的选择条件表达式。每当选择表达式的值发生变化,便启动该语句对各子句的选择值(条件)进行测试对比,当发现有满足条件的子句时,就将此子句表达式的值赋予目标信号。 3.与CASE语句相类似,该语句对子句条件选择值具有同期性(非顺序性)。 4. 不允许有条件重叠现象,也不允许存在条件涵盖不全的情况。,并发描述语句,例3-10:设计xor_gate LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY xor_gateA IS PORT (sel:IN Bit_vector(0 TO 1); C: out
38、Bit); END ENTITY xor_gateA; ARCHITECTURE data_flow OF xor_gateA IS BEGIN WITH sel SELECT -选择信号赋值语句 C =0 WHEN 00 | 11, 1 WHEN 01 | 10; END DATA_FLOW; 选择信号赋值语句等效于一个进程语句(如下),并发描述语句,- P1:PROCESS - BEGIN - CASE sel IS -此进程目标信号不同. -WHEN 00|11= c c=1; -END CASE; -WAIT ON sel; -END PROCESS P1; -END ARCHITEC
39、TURE data_flow;,例3-11:4选1多路选择器 ENTITY smux4_1 IS PORT(i0, i1,i2,i3,a,b: INSTD_LOGIC; q: OUTSTD_LOGIC); END smux4_1; ARCHITECTURE behav OF smux4_1 IS SIGNAL sel : INTEGER; BEGIN WITH sel SELECT q= i0 WHEN 0, i1 WHEN 1, i2 WHEN 2, i3 WHEN 3, X WHEN OTHERS; sel=0 WHEN a=0AND b=0 ELSE 1 WHEN a=1AND b=0
40、ELSE 2 WHEN a=0AND b=1 ELSE 3 WHEN a=1AND b=1 ELSE 4; END behav;,并发描述语句,PROCESS语句是一种并发处理语句,在一个结构体中多个PROCESS语句可以同时并行运行。因此,PROCESS语句是VHDL中描述硬件系统并发行为的最常用、最基本的语句。,3.2.2 PROCESS语句,并发描述语句,PROCESS语句的表达格式如下: 进程标号: PROCESS (敏感信号1,敏感信号2,) 进程说明语句; BEGIN 顺序描述语句; END PROCESS 进程标号;, PROCESS语句的特点: 多个进程之间是并发执行的。 进程
41、内部的所有语句都是顺序执行的。进程实际上是用顺序语句描述的一种进行过程,也就是说进程用于描述顺序事件,它提供了一种用算法(顺序语句)描述硬件行为的方法。 进程中必须包含一个显式的敏感信号表或者包含一个WAIT语句。 进程可存取结构体或实体所定义的信号。 进程之间的通信是通过信号量传递来实现的。,3.2.2 PROCESS语句,并发描述语句,PROCESS语句要点: (1) PROCESS语句结构由三个关键部分组成,即进程说明语句部分、顺序描述语句部分和敏感信号参数表(可能有多个敏感信号). (2)虽然PROCESS语句结构的括号内容,如“进程标号”、“敏感信号表” 可以省略,但一般都需标明至少
42、一个的敏感信号。这是因为当进程中定义的任一敏感信号发生变化时,进程立即“启动”,即进程中的顺序语句就立刻顺序执行一次,当进程中最后一个语句执行完成后,执行过程将返回到第一个语句,以等待下一次敏感信号变化,如此循环往复以至无限。否则若不标明敏感信号,除了初始化阶段,进程永远不会被再次激活。,(3)进程说明语句部分主要定义一些局部变量,可包括数据类型、常数、属性、子程序等。但需注意,在进程说明语句中不允许定义信号。 (4)在进程中,只能将信号列入敏感信号表,而不能将变量列入敏感信号表,即进程只对信号敏感,而对变量不敏感。 (5)进程启动是由敏感信号表中的敏感信号的变化激活的,但也可用WAIT语句(
43、有四种书写格式),替代敏感信号表的功能。,例3-12:利用进程语句设计半加器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY half_adder IS PORT(a,b:in std_logic; sum,Carry :out std_logic); END half_adder; ARCHITECTURE behave OF half_adder IS BEGIN Padder: PROCESS(a,b) BEGIN Sum = a XOR b; Carry = a AND b; END PROCESS Padder; END behav
44、e;,例3-13:由时钟控制的进程语句 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY sync_device IS PORT (ina,clk: IN Bit; outb: OUT Bit); END sync_device; ARCHITECTURE example OF sync_device IS BEGIN P1: PROCESS (CLK) BEGIN Outb = ina; - FMAX=100MHz END PROCESS P1; END Example;,由时钟控制数据的传输速度,例3-14:可选择边沿的由时钟控制的进程语句
45、 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dff IS PORT (clk,d: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ARCHITECTURE structure OF dff IS BEGIN P1:PROCESS(clk) BEGIN IF (clk EVENT AND clk=1) THEN q = d; END IF; END PROCESS P1; END structure;,3.2.4 模块语句block 当一个电路比较复杂时,可考虑把它划分为几个模块,这时就可以使用块语句
46、。 块语句的应用类似于利用PROTEL画电路原理图时,可以将一个总的原理图分成多个子模块,则这个总的原理图成为一个由多个子模块原理图连接而成的顶层模块图。 事实上,将结构体以模块划分的方法有好几种。如元件例化语句的应用,其区别只是后者涉及到新的实体和结构体,且综合后硬件结构的逻辑层次有所增加。,实际上,结构体本身就等价于一个BLOCK,或者说结构体就是一个“功能块”。因而能在结构体的说明部分进行说明的对象都能在BLOCK说明部分中进行说明。 应用块语句的目的是改善并行语句结构,增加其可读性,在逻辑电路图上,一条块语句对应一个子电路图。,Block语句的一般格式如下: 块名:Block(保护表达
47、式) 类属子句 -用于信号的映射及参数的定义,常用类属接口表; -GENERIC语句、GENERIC_MAP语句、 端口子句 -PROT语句、PORT_MAP语句实现,主要 端口接口表; -对该块用到的客体加以说明。可以说 -明的项目有USE子句,子程序说明及 BEGIN -子程序体,类型说明及常数说明、信 -号说明和元件说明 END Block块标号;,模块说明部分有点类似于实体的定义部分,它可包含由关键词PORT、GENERIC、PORT MAP和GENERIC MAP引导的接口说明等语句,对BLOCK的接口设置以及与外界信号的连接状况加以说明。 块的类属说明部分和接口说明部分的适用范围仅
48、限于当前BLOCK。所有这些在BLOCK内部的说明对于这个块的外部来说是完全不透明的,即不能适用于外部环境,但对于嵌套于内层的块却是透明的。块的说明部分可以定义的项目主要有:USE语句、子程序、数据类型、子类型、常数、信号、元件。 块中的并行语句部分可包含结构体中的任何并行语句结构。BLOCK语句本身属并行语句,BLOCK语句中所包含的语句也是并行语句。,BLOCK的应用 BLOCK的应用可使结构体层次鲜明,结构明确。利用BLOCK语句可以将结构体中的并行语句划分成多个并列方式的BLOCK,每一个BLOCK都像一个独立的设计实体,具有自己的类属参数说明和界面端口,以及与外部环境的衔接描述。 在
49、较大的VHDL程序的编程中,恰当的块语句的应用对于技术交流、程序移值、排错和仿真都是十分有益的。,例3-16 半加器的设计 example:Block -块名example PORT(a,b: IN Bit; -端口接口表, S,c: OUT Bit); -参数的定义 PORT MAP (a,b,s,c);-信号的映射 BEGIN P1:PROCESS (a,b) IS -进程1的标号P1 BEGIN S = a XOR b; END PROCESS P1; P2:PROCESS (a,b) IS -进程2的标号P2 BEGIN C = a and b; END PROCESS P2; END
50、 Block example;,【增加例子】 例如设计一个电路,它包含有一个半加器,一个半减器,分别 计算输入信号值的A+B及A-B的结果。下表是该电路的真值表。,与门,异或门,与门,异或门,半加器 半减器,Half Subtractor,Half Adder,Carry=AB,Sum=A B,Borrow=AB,Differ=A B,A,B,+,+,半加法器: Sum=AB Carry=AB 半减法器 Difference= AB Borrow=AB 思路:若是将加法器与减法器分成两个功能模块,这时就可以使用BLOCK语句将电路分成两个方块。 LIBRARY IEEE; USE IEEE.S
51、TD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CH ; PORT(A,B : IN STD_LOGIC; Carry,Sum,Borrow,Difference : OUT STD_LOGIC); END CH ;,Architecture a of CH IS BEGIN HALF_ADDER : BLOCK BEGIN Sum=A XOR B; Carry=A AND B; END BLOCK HALF_ADDER ; HALF_Subtractor : BL
52、OCK Begin Difference=A XOR B; Borrow= NOT A AND B; END BLOCK HALF_Subtractor; END a ;,模块间的信号传递和端口映射 Block块是可以嵌套的,内层Block块可以使用外层Block所定义的信号,外层Block块不能使用内层Block块定义的信号。 Block块是一个独立的子结构,可以包含PORT语句、GENERIC语句,允许设计者通过这两个语句将Block块内的信号变化传递给Block块的外部信号。同样,也可以将Block块的外部信号变化传递给Block块的内部信号。 PORT语句和GENERIC语句允许在一个
53、新的设计中使用Block块。新设计的块完成新的功能,PORT和GENERIC的端口名不一致,在块中采用PORT和GENERIC映射就能解决这个问题。例如为增加ALU功能,在设计中采用GENERIC映射产生参数,就能建立一个ALU新模块。,Block语句嵌套 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; PACKAGE BIT32 IS TYPE tw32 IS ARRAY (31 DOWN TO 0)OF STD_LOGIC; END BIT32; USE IEEE.STD_LOGIC_1164.ALL; USE WORK.BIT32.ALL; ENT
54、ITY CPU IS PORT(CLK,interrupt: IN STD_LOGIC; addr: OUT TW32;-上面已定义 data: INOUT TW32); END CPU;,ARCHITECTURE CPU_BLK OF CPU IS SIGNAL addr_bus,data_bus: TW32;-类型已定义过. BEGIN ALU:Block -块标记ALU SIGNAL AD_bus:TW32; BEGIN -ALU行为描述; register8:Block -块标记register8 SIGNAL BIDIR_bus;TW32; BEGIN REGISTER1:Block
55、 -嵌套块标记register1 SIGNAL AD_bus:TW32;-内层块信号使用了外层块 BEGIN ,-REGISTER1的行为描述 END Block REGISTER1; -REGISTER8的其余描述语句 END Block register8; -ALU的其余描述语句 END Block ALU; -CPU_blk的其余描述 END ARCHITECTURE cpu_blk; -实体cpu的其他结构体描述,子程序是主程序调用它以后,能将处理结果返回给主程序的模块。子程序可以反复调用。调用时,首先要初始化,执行结束后,子程序就终止。子程序内部的值不能保持,子程序返回,才能被再次
56、调用。 在VHDL语言中,子程序(subprogram)分两类: (1) 过程(PROCEDURE) (2) 函数(FUNCTION) 过程语句的一般书写格式为: PROCEDURE 过程名(参数1;参数2;) IS 定义语句;-变量定义 BEGIN 顺序处理语句 END 过程名; -过程语句,3.2.5 过程语句,PROCEDURE Bitvector_to_integer (z: IN STD_LOGIC_VECTER; X_flag: OUT Boolean; q: INOUT INTEGER) IS BEGIN Q := 0; X_falg := FALSE; FOR i IN Z R
57、ANGE LOOP Q := q 2; IF (Z(i) = 1) THEN Q := q + 1; ELSEIF (Z(i) /= 0 ) THEN X_flag := TRUE; ENDIF; END LOOP; END Bitvector_to_integer;,调用规则如下: 并发过程调用语句是个完整的语句,独立的行为表现形式,在语句前面可以加标号。 并发过程调用语句应带IN,OUT,INOUT参数,列于过程名后跟的括号内。 并发过程调用可以有多个返回值,这些值通过过程中所定义的输出参数带回。 过程调用举例: ARCHITECTURE结构体名OF实体名IS BEGIN Bitvector_to_integer(z,X_ftag,q);-过程参数定义. END,【例a】 PROCEDURE check(SIGNAL a : IN STD_LOGIC_VECTOR; - 在调用时 SIGNAL error : OUT BOOLEAN ) IS - 再定位宽 VARIABLE found_one : BOOLEAN := FALSE ; - 设初始值 BEGIN FOR i IN aRANGE LOOP - 对位矢量a的所有的位元素进行循环检测 IF a(i) =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 固定资产转让合同
- 劳务分包安全合同
- 儿童玩具购销合同书
- 工程装饰装修合同文书
- 木门签订合同协议怎么写
- 合同代保管协议
- 学术推广合同协议
- 石头加工合同协议
- 公寓楼转卖合同协议
- 员工解除合同协议书丢失
- DB21-T 3413-2021地下工程自防护混凝土结构耐久性技术规程
- 学校食品安全管理
- 2024年安徽六安城市建设投资有限公司招聘笔试参考题库含答案解析
- 无人驾驶除冰车研发及示范应用
- 痉挛性斜颈的物理治疗与按摩技术
- 团队沟通与协作培训
- 工作交接表表格模板
- 媒介的欺骗性:后图灵时代的人工智能和社会生活
- 老年专科护士准入(选拔)考试理论试题及答案
- 国开学习行为表现(通用11篇)
- 废气治理设施运行管理规程制度
评论
0/150
提交评论