VHDL顺序描述语句.ppt

上传人:sh****n 文档编号:13561207 上传时间:2020-06-22 格式:PPT 页数:79 大小:325.55KB
返回 下载 相关 举报
VHDL顺序描述语句.ppt_第1页
第1页 / 共79页
VHDL顺序描述语句.ppt_第2页
第2页 / 共79页
VHDL顺序描述语句.ppt_第3页
第3页 / 共79页
点击查看更多>>
资源描述
第18讲 VHDL顺序语句(4) 主要知识点: RETURN语句 NULL语句 函数调用语句 过程调用语句,VHDL语言的顺序语句,顺序语句(Sequential Statements)用来实现模型的算法描述。,顺序语句和并行语句是VHDL程序设计中两大基本描述语句系列。,并行语句(Concurrent Statements)用来表示各模型算法描述之间的连接关系。,顺序语句只能出现在 进程(PROCESS) 过程(PROCEDURE) 函数(FUNCTION) 中,其它都是并行语句。,顺序语句是相对于并行语句而言的,其特点是每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,,理解,一个进程是由一系列顺序语句构成的,而进程本身属并行语句。也就是说,在同一设计实体中,所有的进程是并行执行的,每个进程内部是顺序执行的。,VHDL有如下六类基本顺序语句:,信号赋值语句 变量赋值语句,1、赋值语句,2、流程控制语句,3、等待语句,4、子程序调用语句,5、返回语句,6、空操作语句,IF语句 CASE语句 LOOP语句 NEXT语句 EXIT语句,RETURN语句,NULL语句,WAIT语句,过程调用 函数调用,返回语句 RETURN RETURN语句是一段子程序结束后,返回主程序的控制语句。它只能用于函数与过程体内,并用来结束当前最内层函数或过程体的执行。 RETURN语句的书写格式为: RETURN; RETURN 表达式;,第一种格式只能用于过程,它后面一定不能有表达式;第二种格式只能用于函数,它后面必须有条件表达式,它是函数结束的必要条件,函数结束必须用RETURN语句。,例1:在函数体中使用RETURN语句 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY example IS PORT(a,b:IN INTEGER range 0 to 10; y:OUT INTEGER range 0 to 10); END example;ARCHITECTURE rtl OF example IS BEGIN PROCESS(a,b) FUNCTION maximum(a,b:INTEGER range 0 to 10) RETURN INTEGER IS VARIABLE tmp:INTEGER;,BEGIN IF(a b)THEN tmp := a; ELSE tmp := b; END IF; return tmp; END maximum; BEGIN y tmp := rega AND regb ; WHEN 101 = tmp := rega OR regb ; WHEN 110 = tmp := NOT rega ; WHEN OTHERS = NULL ; END CASE ;,例2:采用NULL语句的四选一数据选择器。 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(d0 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); d1 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); d2 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); d3 :IN STD_LOGIC_VECTOR (7 DOWNTO 1); s0 :IN STD_LOGIC; s1 :IN STD_LOGIC; y :OUT STD_LOGIC_VECTOR (7 DOWNTO 1) ); END mux4 ; ARCHITECTURE behave OF mux4 IS,BEGIN lable:PROCESS(d0,d1,d2,d3,s0,s1) VARIABLE tmp:INTEGER; BEGIN tmp := 0; IF(s0=1)THEN tmp := tmp+1; END IF; IF(s1=1)THEN tmp := tmp+2; END IF;,CASE tmp IS WHEN 0 = y y y y NULL; END CASE; END PROCESS; END behave; 上例是通过对用于选通8位总线的四选一多路选择器进行功能描述,具体说明NULL语句的使用。,子程序调用语句 A.过程调用语句(Procedure Call) 与其他高级程序设计语言相似,VHDL提供了子程序的概念。其中在进程、函数和过程中,可以使用过程调用语句,此时它是一种顺序语句。一个过程被调用时将去执行它的过程体。,调用过程的语句格式如下: 过程名(形参名= 实参表达式 ,形参名= 实参表达式) ;,一个过程的调用将分别完成以下三个步骤:,(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;,(2)执行这个过程;,(3)将过程中IN和INOUT模式的形参值返回给对应的实参。,例3: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; USE IEEE. STD_LOGIC_UNSIGNED.ALL; ENTITY max IS PORT(in1:IN STD_LOGIC_VECTOR (7 DOWNTO 0); in2:IN STD_LOGIC_VECTOR (7 DOWNTO 0); in3:IN STD_LOGIC_VECTOR (7 DOWNTO 0); q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END max;,ARCHITECTURE rtl OF max IS procedure maximum(a,b:IN STD_LOGIC_VECTOR; c:out std_logic_vector) IS BEGIN IF(a b)THEN c := a; ELSE c:= b; END IF; END maximum;,BEGIN PROCESS(in1,in2,in3) VARIABLE tmp1,tmp2:STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN maximum(in1,in2,tmp1); -过程调用 maximum(tmp1,in3,tmp2); -过程调用 q = tmp2; END PROCESS; END rtl; 上例是一个取三个输入位矢量最大值的功能描述,它在结构体中的进程语句中使用了两个过程调用语句。,B. 函数调用语句 函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。,函数语句分为两个部分,函数首和函数体。 (1)函数首的格式为: FUNCTION 函数名称(参数列表) RETURN 数据类型名; (2)函数体的格式为: FUNCTION 函数名称(参数列表) RETURN 数据类型名 IS 说明部分 BEGIN 顺序语句 RETURN 返回变量 END 函数名称; 调用函数语句的格式为: Y=函数名称(参数列表);,练习1: 将例3改为函数调用实现. 练习2:用函数实现求三个数中的最大数。 三个整数(0-15之间):A,B,C; 最大数:MAX。,断言语句(Assert) 断言语句分为顺序断言语句和并行断言语句,顺序断言语句主要用于进程、函数和过程仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息。断言语句的书写格式如下: ASSERT 条件 REPORT 报告信息 SEVERITY 出错级别; 在执行过程中,断言语句对条件(布尔表达式)的真假进行判断,如果条件为“TURE”,则向下执行另外一条语句;如果条件为“FALSE”,则输出错误信息和错误严重程度的级别。在REPORT后面跟着的是设计者写的字符串,通常是说明错误的原因,字符串要用双引号括起来。SEVERITY后面跟着的是错误严重程度的级别,他们分别是:,NOTE(注意) WARNING(警告) ERROR(错误) FAILURE(失败) 若REPORT子句缺省,则默认消息为“Assertion violation”;若SEVERITY子句缺省,则出错级别的默认值为“ERROR”。,例4: RS触发器的VHDL描述中断言语句的使用 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY rsff IS PORT(s :IN BIT; r:IN BIT; q:OUT BIT; qb :OUT BIT); END rsff; ARCHITECTURE rtl OF rsff IS BEGIN PROCESS(s,r) VARIABLE last_state :BIT;,BEGIN ASSERT(NOT(s =1AND r =1) REPORT Both s and r equal to 1 SEVERITY ERROR; IF(s =0 AND r =0) THEN last_state := last_state; ELSIF(s =0AND r =1) THEN last_state := 0; ELSE last_state := 1; END IF; q = last_state; qb = not(last_state); END PROCESS; END rtl;,上例中,如果 r 和 s 都为1时,表示一种不定状态。在进程中先是设定了一条断言语句,目的是:当判断 r 和 s 都为1时,输出终端将显示字符串“Both s and r equal to1.”,同时可能终止模拟过程,并显示错误的严重程度。接下来用IF语句判别触发器的其他三种情况,最后将值送到触发器的两个输出端口上。,REPORT 语句 REPORT语句不增加硬件任何功能,但提供顺序断言语句的短格式,在仿真时使用REPORT语句可以提高程序的可读性。 REPORT语句的书写格式为: REPORT 输出信息 SEVERITY 出错级别; 例: RS触发器的VHDL描述中REPORT语句的使用 (本例中,用REPORT语句代替上例进程中的断言语句。),例5: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY rsff IS PORT(s :IN BIT; r :IN BIT; q :OUT BIT; qb :OUT BIT); END rsff; ARCHITECTURE rtl OF rsff IS BEGIN PROCESS(s,r) VARIABLE last_state :BIT;,BEGIN IF(s =1AND r =1)THEN REPORT “Both s and r equal to1.”; ELSIF (s =0AND r =0)THEN last_state:= last_state; ELSIF (s =0AND r =1)THEN last_state := 0; ELSE last_state := 1; END IF; q = last_state; qb = not(last_state); END PROCESS; END rtl;,在VHDL中,并行语句在结构体中的执行是同时并发执行的,其书写次序与其执行顺序并无关联,并行语句的执行顺序是由他们的触发事件来决定的。 我们知道,实际的硬件系统中很多操作都是并发的,因此在对系统进行模拟时就要把这些并发性体现出来,并行语句正是用来表示这种并发行为的。 在结构体语句中,并行语句的位置是: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句 END 结构体名;,VHDL并行语句,其中并行语句主要有以下几种: PROCESS -进程语句 BLOCK -块语句 CONCURRENT SIGNAL ASSIGNMENT -并行信号代入语句 CONDITIONAL SIGNAL ASSIGNMENT - -条件信号代入语句 SELECTIVE SIGNAL ASSIGNMENT - -选择信号代入语句 CONCURRENT PROCEDURE CALL -并行过程调用语句 ASSERT - -并行断言语句 GENERIC - -参数传递语句 COMPONENT_INSTANT -元件例化语句 GENERATE -生成语句 并行描述语句语句可以是结构性的,也可以是行为性的。下面对这些语句的应用加以介绍。,进程语句(PROCESS) 进程语句是最主要的并行语句,它在VHDL程序设计中使用频率最高,也是最能体现硬件描述语言特点的一条语句。进程语句的内部是是顺序语句,而进程语句本身是一种并行语句。进程语句的综合是比较复杂的,主要涉及这样一些问题:综合后的进程是用组合逻辑电路还是用时序逻辑电路来实现?进程中的对象是否有必要用寄存器、触发器、锁存器或是RAM等存储器件来实现。 进程语句结构中至少需要一个敏感信号量,否则除了初始化阶段,进程永远不会被再次激活。这个敏感量一般是一个同步控制信号,同步控制信号用在同步语句中,同步语句可以是敏感信号表、WAIT UNTIL语句或是WAIT ON语句。一般来说,只有一个同步点或者是具有多个同步点但都使用完全相同的同步控制信号的进程不需要“记忆”在哪一个同步点上被挂起时,不会形成存储器。如下例所示:,-综合后不需要存储器的VHDL进程 label1:PROCESS(a,b,c) BEGIN -其中没有其他同步描述 AND PROCESS label1; -综合后需要存储器的VHDL进程 label2:PROCESS BEGIN WAIT UNTIL clkEVENT AND clk=1; s =0; WAIT UNTIL clkEVENT AND clk=1; s state := stop;- -这两个语句是并发关系 END CASE; AND PROCESS label4;,-综合为触发器的进程 label5:PROCESS BEGIN WAIT UNTIL clkEVENT AND clk=1; q A,a_B=B,a_Cin= Cin, a_Co= Co,a_S=S); SIGNAL tmp1,tmp2:STD_LOGIC; BEGIN label1:PROCESS(a_A,a_B) BEGIN tmp1= a_A XOR a_B; END PROCESS label1;,label2:PROCESS(tmp1,a_Cin) BEGIN tmp2= tmp1AND a_Cin ; END PROCESS label2; label3:PROCESS(tmp1,a_Cin) BEGIN a_S = tmp1XOR a_Cin ; END PROCESS label3; label4:PROCESS(a_A,a_B,tmp2) BEGIN a_Co = tmp2 OR(a_A AND a_B); END PROCESS label4; END BLOCK ex; END dataflow;,在上面的例子中,结构体内含有4个进程语句,这4个进程语句是并行关系,共同形成了一个块语句。 在实际应用中,一个块语句中又可以包含多个子块语句,这样循环嵌套以形成一个大规模的硬件电路。,并行信号代入语句 信号代入语句有两种:一种是在结构体中的进程内使用,此时它作为一种顺序语句出现;另一种是在结构体的进程之外使用,此时它是一种并行语句,因此称之为并行信号代入语句。 并行信号代入语句的语法格式为: 信号量 = 敏感信号量表达式; 需要注意的是,一条信号代入语句与一个信号代入的进程语句是等价的,我们可以把一条信号代入语句改写成一个信号代入的进程语句。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and_gat IS PORT(a:IN STD_LOGIC; b:IN STD_LOGIC; y:OUT STD_LOGIC); END and_gat; ARCHITECTURE behave OF and_gat IS BEGIN y = a AND b; -并行信号代入语句(在结构体进程之外) AND behave; 本例是一个2输入与门的VHDL描述,在结构体中使用了并行信号代入语句。下面是2输入与门的另一种VHDL描述,在描述的结构体中采用了与上述并行信号代入语句等价的进程语句。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY and_gat IS PORT(a:IN STD_LOGIC; b:IN STD_LOGIC; y:OUT STD_LOGIC); END and_gat; ARCHITECTURE behave OF and_gat IS BEGIN PROCESS (a,b) BEGIN y = a AND b; -进程语句( 顺序语句) AND PROCESS; AND behave;,通过对上述两个例子的分析可见:从并行信号代入语句描述来看,当代入符号“=”右边的值发生任何变化时,信号代入语句的操作立即执行,将信号代入符号“=”右边的表达式代入给左边的信号量;从进程语句的描述来看,当进程敏感信号表中的敏感信号量发生变化时,进程将被启动,顺序信号代入语句将被执行以完成信号的代入操作。 在VHDL中提供了三种并行信号代入语句: 并发信号代入语句 条件信号代入语句 选择信号代入语句,(1) 并发信号代入语句 信号代入语句在进程内部执行时,它是一种顺序语句;信号代入语句在结构体的进程之外出现时,它作为并发语句的形式出现。作为并发信号代入语句,在结构体中他们是并行执行的,他们的执行顺序与书写无关。 并发信号代入语句是靠事件驱动的。对于并发信号代入语句来说,只有代入符号“=”右边的对象有事件发生时才会执行该语句。 在实际设计中,并发信号代入语句常用来进行加法器、乘法器、除法器和比较器等多种逻辑电路的描述。下面是一个用VHDL并发语句描述的全加器的例子。,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY add IS PORT(A:IN STD_LOGIC; B:IN STD_LOGIC; Cin:IN STD_LOGIC; Co:OUT STD_LOGIC; S:OUT STD_LOGIC); END add; ARCHITECTURE dataflow OF add IS SIGNAL tmp1,tmp2:STD_LOGIC;,BEGIN tmp1 = A XOR B; tmp2 = tmp1 AND Cin; -4条并发信号代入语句 S = tmp1 XOR Cin; Co = tmp2 OR(A AND B); AND dataflow;,在上例的结构体中有4条并发信号代入语句,他们的执行顺序与书写顺序是无关的,因此上面的4条并发信号代入语句可以任意颠倒书写顺序,不会对执行结果产生任何影响。上面提到的并发信号代入语句是事件驱动的,例如: tmp2 = tmp1 AND Cin; S = tmp1 XOR Cin; 两条语句,只要tmp1 和 Cin中的值有一个发生变化,即有事件发生,那么这两条语句就会立即并发执行。,(2)条件信号代入语句 条件信号代入语句也是一种并发描述语句,它是一种根据不同条件将不同的表达式代入目的信号的语句。条件信号代入语句的书写格式为: 目的信号 = 表达式1 WHEN 条件1 ELSE 表达式2 WHEN 条件2 ELSE 表达式2 WHEN 条件3 ELSE 表达式n-1 WHEN 条件 ELSE 表达式; 条件信号代入语句执行时要先进行条件判断,如果条件满足,就将条件前面的那个表达式的值代入目的信号;如果不满足条件,就去判断下一个条件;最后一个表达式没有条件,也就是说在前面的条件都不满足时,就将该表达式的值代入目的信号。,下面的例子是用条件信号代入语句来描述的七段显示译码器 例: 采用条件代入语句描述的七段显示译码器 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY se7 IS PORT(input:IN STD_LOGIC_VECTOR (3 DOWNTO 0); output:OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END se7; ARCHITECTURE rtl OF se7 IS BEGIN output =(0,1,1,1,1,1,1) WHEN input =“0000”ELSE (0,0,0,0,1,1,0)WHEN input =“0001”ELSE (1,0,1,1,0,1,1)WHEN input =“0010”ELSE,(1,0,0,1,1,1,1)WHEN input =“0011”ELSE (1,1,0,0,1,1,0)WHEN input =“0100”ELSE (1,1,0,1,1,0,1)WHEN input =“0101”ELSE (1,1,1,1,1,0,1)WHEN input =“0110”ELSE (0,0,0,0,1,1,1)WHEN input =“0111”ELSE (1,1,1,1,1,1,1)WHEN input =“1000”ELSE (1,1,0,1,1,1,1)WHEN input =“1001”ELSE (1,1,1,0,1,1,1)WHEN input =“1010”ELSE (1,1,1,1,1,0,0)WHEN input =“1011”ELSE (0,1,1,1,0,0,1)WHEN input =“1100”ELSE (1,0,1,1,1,1,0)WHEN input =“1101”ELSE (1,1,1,1,0,0,1)WHEN input =“1110”ELSE (1,1,1,0,0,0,1)WHEN input =“1111”ELSE (0,0,0,0,0,0,0); - -灭灯 END rtl;,在上例中,七段显示译码器有一个输入端口input和一个输出端口output。输入端口input是一个四位总线,表示3到0的四位逻辑向量,表示输入是一个四位二进制数。输出端口output也以总线形式表示,它表示6到0的7位逻辑向量,表示输出是一个七位二进制数,以驱动共阴极显示七段数码管。 在上例的结构体中,用一个条件代入语句来完成所有状态的显示译码。在保留字WHEN的前面是驱动显示数码管的七位位矢量,WHEN的后面是译码的条件。需要说明的是条件信号代入语句中的书写顺序不是固定的,位置是可以任意颠倒的,他们并不表示执行的先后顺序,实际上他们是并发执行的。,(3) 选择信号代入语句 选择信号代入语句的书写格式为: WITH 表达式 SELECT 目的信号 = 表达式1 WHEN 条件1; 表达式2 WHEN 条件2; 表达式3 WHEN 条件3; 表达式n WHEN 条件n; VHDL在执行选择信号代入语句时,目的信号是根据表达式的当前值来进行表达式代入的。当表达式的值符合某个条件时,就把该条件前的表达式代入目的信号;当表达式的值不符合条件时,语句就继续向下判断,直到找到满足的条件为止。选择信号代入语句与case语句相类似,都是对表达式进行测试,当表达式的值不同时,将把不同的表达式代入目的信号。需要注意的是,选择信号代入语句与case语句一样,必须把表达式的值在条件中都列出来,否则编译将会出错。,下面的例子是一个采用选择信号代入语句描述的选通8位总线的四选一多路选择器。 例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(d0:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d1:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d2:IN STD_LOGIC_VECTOR (7 DOWNTO 0); d3:IN STD_LOGIC_VECTOR (7 DOWNTO 0); s0:IN STD_LOGIC; s1:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END mux4;,ARCHITECTURE rtl OF mux4 IS SIGNAL comb:STD_LOGIC_VECTOR (1 DOWNTO 0); BEGIN comb in2,c = out); END structure;,注意:名称映射的书写顺序要求并不是很严格,只要把要映射的对应信号连接起来就可以了,顺序是可以颠倒的 .,生成语句 生成语句(GENERATE)是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成语句就可以避免多段相同结构的VHDL程序的重复书写(相当于复制)。 生成语句有两种形式:FOR- GENERATE模式和IF- GENERATE模式。 FOR- GENERATE 模式的生成语句 FOR- GENERATE 模式生成语句的书写格式为: 标号:FOR 循环变量 IN 离散范围 GENERATE ; END GENERATE 标号;,其中循环变量的值在每次的循环中都将发生变化;离散范围用来指定循环变量的取值范围,循环变量的取值将从取值范围最左边的值开始并且递增到取值范围最右边的值,实际上也就限制了循环的次数;循环变量每取一个值就要执行一次GENERATE语句体中的并行处理语句;最后FOR- GENERATE模式生成语句以保留字END GENERATE 标号:;来结束GENERATE语句的循环。 生成语句的典型应用是存储器阵列和寄存器。下面以四位移位寄存器为例,说明FOR- GENERATE模式生成语句的优点和使用方法。 下图所示电路是由边沿D触发器组成的四位移位寄存器,其中第一个触发器的输入端用来接收四位移位寄存器的输入信号,其余的每一个触发器的输入端均与左面一个触发器的Q端相连。,图用D触发器构成的四位移位寄存器 根据上面的电路原理图,写出四位移位寄存器的VHDL描述如下。,LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY shift_reg IS PORT(di:IN STD_LOGIC; cp:IN STD_LOGIC; do:OUT STD_LOGIC); END shift_reg;,ARCHITECTURE structure OF shift_reg IS COMPONENT dff PORT(d:IN STD_LOGIC; clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; SIGNAL q:STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN dff1:dff PORT MAP (d1,cp,q(1)); dff2:dff PORT MAP (q(1),cp,q(2)); dff3:dff PORT MAP (q(2),cp,q(3)); dff4:dff PORT MAP (q(3),cp,do); END structure;,元件说明,元件例化,在上例的结构体中有四条元件例化语句,这四条语句的结构十分相似。我们对上例再做适当修改,使结构体中这四条元件例化语句具有相同的结构,如下例所示:,例 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY shift_reg IS PORT(di:IN STD_LOGIC; cp:IN STD_LOGIC; do:OUT STD_LOGIC); END shift_reg; ARCHITECTURE structure OF shift_reg IS,COMPONENT dff PORT(d:IN STD_LOGIC; clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; SIGNAL q:STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN q(0)= di dff1:dff PORT MAP (q(0),cp,q(1)); dff2:dff PORT MAP (q(1),cp,q(2)); dff3:dff PORT MAP (q(2),cp,q(3)); dff4:dff PORT MAP (q(3),cp,q(4)); do= q(4) END structure;,元件例化,元件说明,这样便可以使用FOR- GENERATE模式生成语句对上例中的规则体进行描述,如例所示。,例: FOR- GENERATE模式生成语句应用 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY shift_reg IS PORT(di:IN STD_LOGIC; cp:IN STD_LOGIC; do:OUT STD_LOGIC); END shift_reg; ARCHITECTURE structure OF shift_reg IS,COMPONENT dff PORT(d:IN STD_LOGIC; clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; SIGNAL q:STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN q(0)= di label1:FOR i IN 0 TO 3 GENERATE dffx:dff PORT MAP (q(i),cp,q(i+1)); END GENERATE label1; do = q(4) END structure;,可以看出用FOR- GENERATE模式生成语句替代例中的四条元件例化语句,使VHDL程序变的更加简洁明了。在例的结构体中用了两条并发的信号代入语句和一条FOR- GENERATE模式生成语句,两条并发的信号代入语句用来将内部信号q和输入端口di、输出端口do连接起来,一条FOR- GENERATE模式生成语句用来产生具有相同结构的四个触发器。,IF- GENERATE模式生成语句 IF- GENERATE模式生成语句的书写格式如下: 标号:IF 条件 GENERATE ; END GENERATE 标号;,IF- GENERATE模式生成语句主要用来描述一个结构中的例外情况,例如,某些边界条件的特殊性。当执行到该语句时首先进行条件判断,如果条件为“TRUE”才会执行生成语句中的并行处理语句;如果条件为“FALSE”,则不执行该语句。,例: IF- GENERATE模式生成语句应用 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY shift_reg IS PORT(di:IN STD_LOGIC; cp:IN STD_LOGIC; do:OUT STD_LOGIC); END shift_reg; ARCHITECTURE structure OF shift_reg IS,COMPONENT dff PORT(d:IN STD_LOGIC; clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 1); BEGIN label1: FOR i IN 0 TO 3 GENERATE IF(i=0)GENERATE dffx:dff PORT MAP (di,cp,q(i+1)); END GENERATE;,IF(i=3)GENERATE dffx:dff PORT MAP (q(i),cp,do); END GENERATE; IF(i /=0)AND(i /=3)GENERATE dffx:dff PORT MAP (q(i),cp,q(i+1)); END GENERATE; END GENERATE label1; END structure;,在例的结构体中,FOR- GENERATE模式生成语句中使用了IF- GENERATE模式生成语句。IF- GENERATE模式生成语句首先进行条件i = 0和i = 3的判断,即判断所产生的D触发器是移位寄存器的第一级还是最后一级;如果是第一级触发器,就将寄存器的输入信号di代入到PORT MAP语句中;如果是最后一级触发器,就将寄存器的输出信号do代入到PORT MAP语句中。这样就解决了硬件电路中输入输出端口具有不规则性所带来的问题。,
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!