




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章,VHDL数据类型与顺序语句,3.1 VHDL数据类型,VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用。VHDL作为强类型语言的好处是使VHDL编译或综合工具很容易地找出设计中的各种常见错误。,3.1 VHDL数据类型,3.1.1 BIT和BIT_VECTOR类型,(1) 位类型( BIT ),在程序包STANDARD中定义的源代码是: TYPE BIT IS (0,1); 其值只能为1或者0,通常用来表示信号的不同状态。,(2) 位矢量类型( BIT_VECTOR ),位矢量只是基
2、于位类型的数组,在程序包STANDARD中定义的源代码是: TYPE BIT _VECTOR IS ARRAY(NATURAL RANGE) OF BIT; 使用位矢量必须注明位宽,即数组中的元素个数和排列. 例如: SIGNAL aBIT_VECTOR(7 DOWNTO 0);,3.1 VHDL数据类型,3.1 VHDL数据类型,3.1.2 STD_LOGIC和STD_LOGIC_VECTOR类型,(1)标准逻辑位类型(STD_LOGIC),在程序中使用此数据类型前,需加入语句:,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;,数据类型STD_LOGIC
3、的定义如下: TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);,3.1 VHDL数据类型,3.1.2 STD_LOGIC和STD_LOGIC_VECTOR类型,U, -未初始化 X, -强未知 0, -强0 1, -强1 Z, -高阻态,W, -弱未知 L, -弱0 H, -弱1 -, -忽略,数据类型STD_LOGIC共定义了9种值,具体为:,VHDL数据对象、数据类型和操作符,(2)标准逻辑矢量类型(STD_LOGIC_VECTOR),STD_LOGIC_VECTOR类型定义如下: TYPE STD_LOGIC_VECTOR IS ARRAY ( NATURAL
4、 RANGE ) OF STD_LOGIC ;,它是定义在STD_LOGIC_1164程序包种的标准一维数组,数组中每个元素的数据类型都是STD_LOGIC。,同位宽和数据类型的矢量间才能进行赋值。,例如:Signal a: std_logic_vector(7 downto 0); a = B“00111010”;,一般用于定义数据总线、地址总线等。,3.1 VHDL数据类型,3.1.2 STD_LOGIC和STD_LOGIC_VECTOR类型,3.1 VHDL数据类型,3.1.3 整数类型INTEGER,取值范围为:-(231 1) 231 1。 例如:,3.1 VHDL数据类型,3.1.
5、4 布尔数据类型BOOLEAN,3.1.5 SIGNED和UNSIGNED类型,程序包STANDARD中定义布尔数据类型的源代码如下: TYPE BOOLEAN IS (ture, false); 其值只能为“ ture”和“false”两者之一。,(1)无符号数据类型(UNSIGNED TYPE),十进制的8可以作如下表示: UNSIGNED(1000),两个无符号数据定义的示例: VARIABLE var : UNSIGNED(0 TO 10) ; SIGNAL sig : UNSIGNED(5 DOWNTO 0) ;,3.1 VHDL数据类型,(2)有符号数据类型(SIGNED TYPE
6、),例如: SIGNED(0101) 代表 +5,5 SIGNED(1011) 代表 5 若将上例的VAR定义为SIGNED数据类型,则数值意义就不同了,如: VARIABLE VARSIGNED(0 TO 10); 其中,变量VAR有11位,最左位VAR(0)是符号位。,3.1 VHDL数据类型,3.1 VHDL数据类型,3.1.6 其他预定义类型,1. 字符类型,2. 实数类型,也称为浮点性,取值范围为:-1.0E38+1.0E38,用单引号扩起来,例如:a、A、1、 0等,字符类型区分大小写,3.1 VHDL数据类型,3.1.6 其他预定义类型,3. 字符串类型,用双引号扩起来的字符串数
7、组,一般用于程序的提示和说明。,例如: VARIABLE string_varSTRING(1 TO 7); string_var“A B C D”,3.1 VHDL数据类型,4. 时间类型,VHDL数据对象、数据类型和操作符,5. 用户自定义的数据类型,通用格式: TYPE 数据类型名 IS 数据类型定义,用户可以定义的数据类型: 枚举类型enumberated、整数型integer、实数型real、数组类型array、记录类型record等,VHDL允许用户自己定义新的数据类型,VHDL数据对象、数据类型和操作符,(1) 枚举类型( enumberated ),type 数据类型名 is
8、(元素,元素.),例如: type week is (sun,mon,tue,wes,thu,fri,sat); type std_logic is (1,0,x,z);,格式,把类型中的各个元素都列举出来。,例: TYPE Door IS( open, close);-定义了一个名为Door的数据类型 SIGNAL door1: Door:=open; -定义了一个名为Door1的Door类型的信号,VHDL数据对象、数据类型和操作符,(2)整数类型和实数类型(Integer and Real Types),TYPE 数据类型名 IS 数据类型定义 约束范围,例如: TYPE int IS
9、INTEGER RANGE 0 TO 255; VARIABLE num:int,格式,整数和实数的数据类型在标准的程序包中已作了定义,但在实际应用中,特别在综合中,由于这两种非枚举型的数据类型的取值定义范围太大,综合器无法进行综合。,VHDL数据对象、数据类型和操作符,(3)数组类型(Array Type),把一组具有相同数据类型的元素集合到一起形成一个新的数据类型,可以是一维或多维的。,限定性数组,限定性数组定义语句格式如下: TYPE 数组名 IS ARRAY (数组范围) OF 数据类型;,非限定性数组,其中,数组名是新定义的限定性数组类型的名称,可以是任何标识符,其类型与数组元素相同
10、;数组范围明确指出数组元素的定义数量和排序方式,以整数来表示其数组的下标;数据类型即指数组各元素的数据类型。,VHDL数据对象、数据类型和操作符,例如: type x is array(2 downto 0) of std_logic; type a is array (natural range ) of bit; variable c1: a(1 to 4);,【例】 TYPE STB IS ARRAY(7 DOWNTO 0) OF STD_LOGIC; 这个数组类型的名称是STB,它有八个元素,它的下标排序是7,6,5,4,3,2,1,0,各元素的排序是STB(7),STB(6),STB
11、(1),STB(0)。 【例】 TYPE X IS (LOW,HIGH); TYPE DATA_BUS IS ARRAY (0 TO 7,X) OF BIT; 首先定义X为两元素的枚举数据类型,然后将DATA_BUS定义为一个数组类型,其中每一元素的数据类型是BIT。,VHDL数据对象、数据类型和操作符,(3)数组类型(Array Type),非限制性数组的定义语句格式如下: TYPE 数组名IS ARRAY (数组下标名RANGE )OF 数据类型;,例如: TYPE BIT_VECTOR IS ARRAY(NATURA RANGE) OF BIT; VARIABLE VA:BIT_VECT
12、OR(1 TO 6);-将数组取值范围定在16 type a is array (natural range ) of bit; variable c1: a(1 to 4);,VHDL数据对象、数据类型和操作符,(4)记录类型(Record Type),记录类型把不同数据类型的对象构成数组,记录的元素由它的字段名访问。,type 数据类型名 is record 元素名:数据类型名; 元素名:数据类型名; . end record;,VHDL数据对象、数据类型和操作符,type order is record id:integer; date:string; security:boolean;
13、 end record;,signal flag:boolean; signal order1:order; order1=(3423,”1999/07/07”,true); flag=order1.security;,引用:,VHDL数据对象、数据类型和操作符,(5)时间(TIME)类型(物理类型),时间类型定义的一般格式为: TYPE 数据类型名 IS 范围; UNITS 基本单位; 单位; END UNITS;,表示时间的数据类型, 在仿真时是必不可少的。,VHDL数据对象、数据类型和操作符,例如:TYPE time IS range 1e18 TO 1e18; UNITS fs; ps
14、=1000fs; ns=1000ps; s=1000ns; ms=1000s; set=1000ms; min=60set; hr=60min; END UNITS; 这里的基本单位是“fs”。时间是物理类型的数据,当然对容量、阻抗值也可以做定义。,VHDL数据对象、数据类型和操作符,(5) 子类型(SUBTYPE) 子类型是一个具有限制条件的类型,通常用来定义具有一定限制条件的基本类型的数据对象。,子类型定义的一般格式为: SUBTYPE 子类型名 IS 数据类型名约束范围;,例如: 如下 Byte 被定义作为一个子类型,而后数据对象被定义为从属于该子类型。 SUBTYPE Byte IS
15、Bit_Vector(7 downto 0); SIGNAL Byte1, Byte2:Byte; SIGNAL Data1, Data2:Byte; SIGNAL Addr1, Addr2:Byte;,3.1 VHDL数据类型,6. 文件类型,3.1 VHDL数据类型,3.1.7 数据类型转换函数,对于某一数据类型的变量、信号和常量赋值时,类型一定要一致,否则要进行数据类型转换。,3.1 VHDL数据类型,3.1.7 数据类型转换函数,3.1 VHDL数据类型,3.1.7 数据类型转换函数,3.1 VHDL数据类型,顺序语句的特点: 语句的执行按书写的先后次序,从前到后顺序执行,并且在结构层
16、次中前面的语句执行结果会直接影响后面各语句的执行结果。这种方式和其他普通编程语言(如c,pascal)是一样的。,顺序描述语句只能出现在进程或子程序中,用来定义进程或子程序的算法。顺序语句可以用来进行算术运算、逻辑运算、信号和变量的赋值、子程序调用等,还可以进行条件控制和迭代。,顺序语句,3.2 VHDL最常用的顺序语句,信号赋值语句,变量赋值语句,赋值目标,赋值符号,赋值源,赋值语句是将一个值或者一个表达式的运算结果传递给某一数据对象,如:信号或变量,或由此组成的数组。,功能,变量赋值语句和信号赋值语句的语法格式如下: 变量赋值目标:= 赋值源; 信号赋值目标:= 赋值源;,3.2.1 赋值
17、语句,3.2 VHDL最常用的顺序语句,赋值目标:,标识符赋值目标 数据单元赋值目标 段下标赋值目标 集合块赋值目标,例:variable x,y: std_logic_vector(1,3); x(1 to 2) := “10” ; -等效于x(1) :=1, x(2):=0 x(1 to 3) := “101”;,3.2 VHDL最常用的顺序语句,type jilu is record a1:time; a2:real; a3:integer; end record;,Variabel com:jilu; com:=(2ms, 1, 3) -整体赋值位置关联方式 com:=(a1= 2ms
18、 ,a2=1, a3= 3) -整体赋值名字关联方式 等价 于单个元素的赋值情况: com.a1=2ms; com.a2=1; com.a3=3;,对变量com的赋值:,3.2 VHDL最常用的顺序语句,例: VARIABLE s:BIT := 0; PROCESS(s) VARIABLE count:INTEGER := 0 -变量说明 BEGIN count := s+1 -变量赋值 END PROCESS;,3.2 VHDL最常用的顺序语句,信号赋值,分析: 当A、B、C、D中任一信号发生变化时,进程将开始执行,当执行 Z = A and B 后, Z 的值不会立即变化 ;同理执行Z =
19、 C and D 后Z 的值也不会立即变化。当执行end process后, Z 的值才开始更新,同时系统挂起开始等待敏感信号。,3.2 VHDL最常用的顺序语句,变量赋值,分析: 变量的赋值是立刻发生的,即赋值的延迟时间为零。,variable a, b: std_logic; a:=1; -立即将a置为1 b:=2; -立即将b置为2 a:=0; -将a置入新值0 b:=1; -将b置入新值1,3.2 VHDL最常用的顺序语句,3.2 VHDL最常用的顺序语句,3.2.2 CASE语句,CASE语句的结构如下:,多条件选择值的一般表达式为: 选择值 |选择值 ,选择值可以有四种不同的表达方
20、式: 单个普通数值,如6。 数值选择范围,如(2 TO 4),表示取值为2、3或4。 并列数值,如35,表示取值为3或者5。 混合方式,以上三种方式的混合。,条件句中的选择值必在表达式的取值范围内。 除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。 CASE语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。 CASE语句执行中必须选中,且只能选中所列条件语句中的一条。这表明CASE语句至少要包含一个条件语句。 对任意项 输入的条件表达式, VHDL不支持。 (即条件表达式的值不能含有X),例1 CASE语句
21、使用 CASE command IS WHEN “00”= c c c c NULL; -无效 END CASE; 例2 CASE语句使用 CASE sel IS WHEN 1TO 9 = c c c = 3; END CASE; 在例2中,第一个WHEN语句的意思是当sel 的值是从1到9 中任意一个数值时,信号c的值取1;第二个WHEN语句的意思是当sel 的值为11或12两者之一时,信号 c 的取值为2;第三个WHEN语句的意思是当sel 的值不为前面两种情况时,信号c 的取值为3。,-适合4选1数据选择器,【程序3】 -半加器描述(1) LIBRARY IEEE; USE IEEE.S
22、TD_LOGIC_1164.ALL; ENTITY h_adder IS PORT ( a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder is SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ; BEGIN abc so so so so NULL ; END CASE; END PROCESS; END ARCHITECTURE fh1 ;,例4 3-8译码器。 LIBRARY IEEE; USE IEEE. STD_L
23、OGIC_1164.ALL; ENTITY decoder3_8 IS PORT(a,b,c,g1,g2a,g2b:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR (7 DOWNTO 0); END decoder3_8; ARCHITECTURE rtl OF decoder3_8 IS SIGNAL indata:STD_LOGIC_VECTOR (2 DOWNTO 0); BEGIN indata = c USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (a,b,c,d: IN STD_LOGIC; enabl
24、e:in std_logic_vector(1 downto 0); p: OUT STD_LOGIC); END mux41; ARCHITECTURE choise OF mux41 IS BEGIN PROCESS (enable ) BEGIN CASE enable IS WHEN 00 = p p p pnull; END CASE; END PROCESS; END choise;,【例】四选一多路选择器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (a,b, c,d : IN_STD_LOGIC
25、; enable: in std_logic_vector(1 downto 0); p : OUT STD_LOGIC); END mux41; ARCHITECTURE choise OF mux41 IS BEGIN PROCESS (enable ) BEGIN IF (enable=00) THEN p=a; ELSIF(enable=01) then p=b; ELSIF(enable=10) then p=c; ELSE p=d; END IF; END PROCESS ; END choise ;,CASE语句与 IF语句的区别 : 在IF语句中,先处理最起始的条件,如果不满足
26、,再处理下一个条件。 在CASE语句中,没有值的顺序号,所有值是并行处理的。因此,在WHEN项中的值只能出现一次,且不能重复使用。,VHDL中最重要的语句,具有并行和顺序行为的双重性 进程和进程之间是并行执行的 进程内部所有语句都是顺序执行的 进程语句与构造体中的其余部分进行信息交流是靠信号完成的 在进程结构中必须包含一个显式的敏感信号量或包含一个WAIT语句,进程标号: PROCESS (敏感信号量表)IS 说明语句 BEGIN 顺序执行语句 END PROCESS 进程名;,格式,3.2 VHDL最常用的顺序语句,3.2.3 PROCESS语句,结构体的子结构形式,1. 由PROCESS语
27、句的敏感信号量表中的信号量触发 2. 由WAIT语句触发。,进程的启动方式:,当进程中的定义的任一敏感信号发生改变时,由顺序语句定义的行为就要重复执行一次,直到执行完最后一个语句执行过程返回第一个语句,等待下次敏感信号变化。 进程的敏感信号参数表中未列出敏感信号时,进程的启动需靠WAIT语句。,进程标号: PROCESS (敏感信号量表)IS 说明语句 BEGIN 顺序执行语句 END PROCESS 进程名;,结构体的子结构形式,(1) 无限等待 WAIT; (2) 敏感信号量变化等待 WAIT ON 信号名,信号名;-当指定的信号发生变化时,进程结束挂起状态,继续执行; (3) 条件等待
28、WAIT UNTIL 表达式;当条件表达式的值为TRUE时,进程才被启动; (4) 时间等待 WAIT FOR 时间表达式;当等待的时间到时,进程结束挂起状态; 例如 :WAIT FOR 20nS;-同步点在延时20nS后, WAIT ON clk, interrupt FOR 5nS;-当信号clk或 interrupt变化5nS后启动进程。,进程启动的WAIT语句,Example: ENTITY sync_df IS PORT(clk: IN BIT; d: IN STD_LOGIC_VECTOR(7 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(7 DOWNTO
29、0) ); END ENTITY sync_df; ARCHITECTURE behav OF sync_df IS BEGIN P1:PROCESS(clk) BEGIN IF(clkevent AND clk=1) THEN q=d; END IF; END PROCESS P1; END behav;,实体部分,结构体部分,进程部分,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-add
30、er; ARCHITECTURE behav OF half-adder IS BEGIN PROCESS (a, b) BEGIN sum= a XOR b; END PROCESS END behav;,利用进程语句设计一位加法器,latchlabel: PROCESS(oe) BEGIN IF oe=1 THEN y = a; END IF; END PROCESS if_label;,latchlabel: PROCESS(oe,a) BEGIN IF oe=1 THEN y = a; END IF; END PROCESS if_label;,多数VHDL综合要求敏感 信号表必须列出
31、本进 程中所有输入信号名,在同一结构体中可有多个进程出现,ENTITY mul IS PORT (a, b, c, x, y : IN BIT; data_out : OUT BIT); END mul; ARCHITECTURE ex OF mul IS SIGNAL temp : BIT; BEGIN p_a: PROCESS (a, b, x) BEGIN IF (x = 0) THEN temp = a; ELSE temp = b; END IF; END PROCESS p_a; p_b: PROCESS(temp, c, y) BEGIN IF (y = 0) THEN data
32、_out = temp; ELSE data_out = c; END IF; END PROCESS p_b; END ex;,实体部分,结构体部分,进程部分,进程部分,硬件的行为描述中,构造算法模型实际上就是把描述系统功能的自然语言翻译成为一组进程,每个进程完成不同的功能。为了方便系统的行为描述,通常用进程模型图(PMG)表示系统的行为。如图所示的系统分解成四个进程,每个进程完成一定的功能,进程之间的关联由箭头线表示。,复杂结构体的多进程组织方法,两个进程间的通信,ENTITY pro_com IS PORT (sa: IN BIT, q: OUT BIT) END pro_com; AR
33、CHITECTURE folow OF pro_com IS SINGAL sta, stb: BIT: =0; BEGIN A: PROCESS (sa, sta) BEGIN IF (saEVENT AND sa=1) OR (staEVENT AND sta=1) ; THEN stb=1 AFTER 20nS ; stb=0 AFTER 30nS; ENDIF; END PROCESS A;,B: PROCESS (stb) BEGIN IF (stbEVENT AND stb = 1) THEN sta=1 AFTER 10nS; sta=0 AFTER 20nS; ENDIF; E
34、ND PROCESS B; END folow;,进程语句本身是并行语句,ENTITY mul IS PORT (a, b, c, selx, sely : IN BIT; data_out : OUT BIT ); END mul; ARCHITECTURE ex OF mul IS SIGNAL temp : BIT; BEGIN p_a : PROCESS (a, b, selx) BEGIN IF (selx = 0) THEN temp = a; ELSE temp = b; END IF; END PROCESS p_a; p_b: PROCESS(temp, c, sely) B
35、EGIN IF (sely = 0) THEN data_out = temp; ELSE data_out = c; END IF; END PROCESS p_b; END ex;,一个进程中只允许描述对应于一个时钟信号的同步时序逻辑,PROCESS中的顺序语句具有明显的顺序/并行运行双重性,PROCESS(abc) BEGIN CASE abc IS WHEN “0000” = so so so so so NULL; END CASE; END PROCESS;,进程语句要点,进程的设计需要注意的问题: (1)进程语句本身是并行语句,它为一无限循环语句,只有两种状态:执行和等待。 (2
36、)进程必须由敏感信号的变化来启动或具有一个显式的wait语句来激励 使用了敏感表的进程不必再含有等待语句 (3)进程的敏感信号列表应保持完整,否则可能导致综合前后的仿真结果不一致。利用减少敏感信号来改变设计功能是错误的。 (4)所有的进程语句是并行执行的,信号是多个进程间的通信线,是进程间进行联系的重要途径。 在任一进程的说明部分不能定义信号和共享变量 (5)同一进程中的所有语句都是按照顺序来执行的。 (6)一个进程中只允许描述对应于一个时钟信号的同步时序逻辑 一个进程中可以放置多个条件语句,但只允许一个含有时钟边沿检测语句的条件语句,3.2 VHDL最常用的顺序语句,3.2.4 并置操作符
37、,3.2 VHDL最常用的顺序语句,3.2.5 IF语句,在VHDL语言中,IF语句的作用是根据指定的条件来确定语句的执行顺序。IF语句可用于选择器、比较器、编码器、译码器、状态机等的设计,是VHDL语言中最常用的语句之一。,例 设计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;,3.3 IF语句使用示例,3.3.1 D触发器的VHDL描述,3.3 IF语句使用示例,1. 上升沿检测
38、表达式和信号属性函数EVENT,2. 不完整条件语句与时序电路,区别:CLKEVENT和CLKEVENT AND CLK=1,3.3 IF语句使用示例,例 设计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)
39、; ELSIF (sel=01) THEN y=d(1); ELSIF (sel=10) THEN y=d(2); ELSE y=d(3); END IF; END PROCESS; END rtl;,顺序语句和并行语句,八-三优先级编码器真值表 输 入 输出 d7 d6 d5 d4 d3 d2 d1 d0 q2 q1 q0 0 x x x x x x x 1 1 1 1 0 x x x x x x 1 1 0 1 1 0 x x x x x 1 0 1 1 1 1 0 x x x x 1 0 0 1 1 1 1 0 x x x 0 1 1 1 1 1 1 1 0 x x 0 1 0 1 1
40、1 1 1 1 0 x 0 0 1 1 1 1 1 1 1 1 0 0 0 0,顺序语句和并行语句,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY priority_encoder IS PORT ( d : IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 ) ; q : OUT STD_LOGIC_VECTOR ( 2 DOWNTO 0 ) ) ; END priority_encoder ; ARCHITECTURE example_if OF priority_encoder IS BEGIN PROCESS ( d
41、),BEGIN IF ( d (7)=0 ) THEN q= ”111”; ELSIF ( d (6) = 0 ) THEN q= ”110”; ELSIF ( d (5) = 0 ) THEN q= ”101”; ELSIF ( d (4) = 0 ) THEN q= ”100”; ELSIF ( d (3) = 0 ) THEN q= “011”; ELSIF ( d (2) = 0 ) THEN q= “010”; ELSIF ( d (1) =0 ) THEN q= “001”; ELSE q= “000”; END IF; END PROCESS; END example_if ;,
42、d (7)=1,d (7)=1 d (6) = 1,3.3 IF语句使用示例,3.3.2 含异步复位和时钟使能的D触发器的VHDL描述,3.3 IF语句使用示例,3.3.2 含异步复位和时钟使能的D触发器的VHDL描述,3.3 IF语句使用示例,3.3.3 基本锁存器的VHDL描述,3.3 IF语句使用示例,3.3.3 基本锁存器的VHDL描述,3.3 IF语句使用示例,3.3.4 含清0控制的锁存器的VHDL描述,3.3 IF语句使用示例,3.3.5 VHDL实现时序电路的不同表述方式,3.3 IF语句使用示例,3.3.5 VHDL实现时序电路的不同表述方式,3.3 IF语句使用示例,3.3
43、.6 4位二进制加法计数器设计,3.3 IF语句使用示例,3.3.7 计数器更常用的VHDL表达方式,3.3 IF语句使用示例,3.3.7 计数器更常用的VHDL表达方式,3.3.8 实用计数器的VHDL设计,3.3 IF语句使用示例,3.3.8 实用计数器的VHDL设计,3.3 IF语句使用示例,3.3.8 实用计数器的VHDL设计,3.3 IF语句使用示例,3.3.9 含同步并行预置功能的8位移位寄存器设计,3.3 IF语句使用示例,3.3.9 含同步并行预置功能的8位移位寄存器设计,3.3 IF语句使用示例,3.3.10 优先编码器设计,3.3 IF语句使用示例,3.3.10 优先编码器
44、设计,3.4 VHDL其它顺序语句,3.4.1 LOOP循环语句,LOOP语句就是循环语句,它可以使包含的一组顺序语句被循环执行,其执行的次数受迭代算法控制。在VHDL中常用来描述迭代电路的行为。,(1)单个LOOP语句,其语法格式如下: LOOP标号: LOOP 顺序语句 END LOOP LOOP标号 ;,用法示例如下: . L2 : LOOP a := a+1; EXIT L2 WHEN a 10 ; - 当a大于10时跳出循环 END LOOP L2; .,这种循环语句需引入其他控制语句(如EXIT)后才能确定,否则为无限循环。其中的标号是可选的。,?,3. LOOP 语句,(2)FO
45、R_LOOP语句,语法格式如下: LOOP标号: FOR 循环变量,IN 循环次数范围 LOOP 顺序语句 END LOOP LOOP标号;,循环变量是一个临时变量,属于局部变量。循环变量只能作为赋值源,不能被赋值,它由LOOP语句自动定义。 循环变量是一个整数变量,不用事先说明。 循环范围是指循环变量在循环中依次取值的范围。,【例】 8位奇偶校验程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY p_check IS PORT ( a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); y : OUT STD_LOGI
46、C ); END p_check; ARCHITECTURE opt OF p_check IS SIGNAL tmp :STD_LOGIC ; BEGIN PROCESS(a) BEGIN tmp =0; FOR n IN 0 TO 7 LOOP tmp = tmp XOR a(n); END LOOP ; y = tmp; - -y=1,a为奇数个1。y=0, a为偶数个1。 END PROCESS; END opt;,例双向移位寄存器 ENTITY shift IS PORT(clr,clk,load,ctr,sr,sl : INSTD_LOGIC; d: IN STD_LOGIC_VE
47、CTOR(7 downto 0); q: OUT STD_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 1
48、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;,【例】 SIGNAL a, b, c : STD_LOGIC_VECTOR (1 TO 3); . FOR n IN 1 To 3 LOOP a(n) = b(n) AND c(n); END LOOP;,此段程序等效于顺序执行以下三个信号赋值操作: a(1)=b(1) AND c(
49、1); a(2)=b(2) AND c(2); a(3)=b(3) AND c(3);,(3)WHILE条件下的LOOP语句,其格式为: 循环标号:WHILE 条件 LOOP 顺序处理语句; END LOOP循环标号;,该语句中,如果条件为真,执行顺序处理语句;否则,结束循环。,summ:=0; bcdsumm: while (i10) loop summ:=i+summ; i:=i+1; end loop bcdsumm;,例: Summ := 0; sum:for i in 1 to 9 loop summ:=i+summ; end loop sum;,顺序语句和并行语句,例 用WHILE
50、条件下的LOOP语句描述奇偶校验电路。 LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY parity_check IS PORT(a:IN STD_LOGIC_VECTOR (7 DOWNTO 0); y:OUT STD_LOGIC); END parity_check ; ARCHITECTURE behav OF parity_check IS BEGIN PROCESS(a) VARIABLE tmp : STD_LOGIC; VARIABLE i : INTEGER; BEGIN tmp:=0; i:=0; WHILE(i8) LO
51、OP tmp:=tmp XOR a(i); i:=i+1; END LOOP; y=tmp; END PROCESS; END behav;,3.4 VHDL其它顺序语句,3.4.2 NEXT语句,NEXT语句主要用在LOOP语句执行中有条件的或无条件的转向控制。,第一种语句:执行到NEXT时,无条件中止当前循环,返回循环起点,开始下次循环。 第二种语句:执行到NEXT时,无条件中止当前循环,返回LOOP标号处,开始下次循环。 第三种语句: WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为真时,执行NEXT语句,进入跳转操作,否则继续向下执行。,NEXT; - 第一种语句格式
52、NEXT LOOP标号; - 第二种语句格式 NEXT LOOP标号 WHEN 条件表达式; - 第三种语句格式,NEXT 标号 WHEN 条件;,【程序 】 PROCESS BEGIN rst_loop : LOOP WAIT UNTIL clockEVENT AND clock =1; -等待时钟信号 NEXT rst_loop WHEN (rst=1); - 检测复位信号rst x = a ; - 无复位信号,执行赋值操作 WAIT UNTIL clockEVENT AND clock =1; - 等待时钟信号 NEXT rst_loop WHEN (rst=1); - 检测复位信号rs
53、t y = b ; - 无复位信号,执行赋值操作 END LOOP rst_loop ; END PROCESS; ,3.4 VHDL其它顺序语句,3.4 VHDL其它顺序语句,EXIT; - 第一种语句格式 EXIT LOOP标号; - 第二种语句格式 EXIT LOOP标号 WHEN 条件表达式;- 第三种语句格式,在LOOP语句中,用EXIT语句跳出并结束整个循环状态(而不是仅跳出本次循环),继续执行LOOP语句后继的语句。,EXIT 标号 WHEN 条件;,NEXT和EXIT两者的区别: NEXT语句跳转到LOOP标号指定的LOOP处即跳到LOOP语句的起点。 EXIT 语句跳转到LO
54、OP循环语句的结束处即跳出循环。,3.4.3 EXIT语句,3.4 VHDL其它顺序语句,【例】两元素位矢量比较 SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0); SIGNAL a_less_then_b : Boolean; . a_less_then_b b EXIT ; ELSIF (a(i)=0 AND b(i)=1) THEN a_less_then_b = TRUE ; - a b EXIT; ELSE NULL; END IF; END LOOP; - 当 i=1时返回LOOP语句继续比较,3.4 VHDL其它顺序语句,3.4.4 WAIT
55、语句,wait; -无限等待 wait on 信号列表 -等待信号变化 wait until 条件; -等待条件满足 wait for 时间值; -等待时间到,格式,WAIT语句是进程(含过程)的同步语句,是进程的启动点。在进程(或过程)中,当执行到WAIT 等待语句时,运行程序将被挂起,直到满足此语句的结束挂起条件后,将重新开始执行进程(或过程)中的程序。 WAIT作为进程体的一条语句同进程体内的其它语句顺序执行。,未设置挂起条件,表 永远挂起,即无限等待。,2. 敏感信号等待语句,即敏感信号一旦发生变化将结束挂起,再次启动进程。VHDL规定,已列出敏感信号表的进程中不能使用任何形式的WAI
56、T语句。一般, WAIT语句可用于进程中的任何地方。,3. 条件等待语句。被此语句挂起的进程需满足如下两个条件才能结束挂起状态,重新启动: 条件表达式中所含信号发生了变化; 此信号改变后,且满足WAIT语句所设的条件。 两条件缺一不可,且必须依照以上顺序完成。,4. 超时等待语句(此语句不可综合,故不再讨论)。,3.4.4 WAIT语句,3.4 VHDL其它顺序语句,Wait语句例子 process(a,b) begin y=a and b; end process,process begin wait on a,b; y=a and b; end process,等同于,process(a,b) begin wait on a,b; y=a and b; end process,错误: 如果process中已有敏感信号进程中不能使用wait 语句,顺序语句和并行语句,一般地,只有WAIT_UNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用) ,WAIT_UNTIL语句有以下三种表达方式: WAIT UNTIL 信号=Value ; - (1) WA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省信丰县2025届初三第二学期学分认定考试化学试题含解析
- 陕西省榆林市米脂县重点中学2025年初三第二次模拟考试试卷英语试题含答案
- 来凤县2025年数学三下期末经典模拟试题含解析
- 江西工业职业技术学院《全球化与企业文化》2023-2024学年第一学期期末试卷
- 江苏省盐城市大冈初中市级名校2024-2025学年初三质量检测试题(三)英语试题含答案
- 江苏省苏州市太仓达标名校2025年初三5月月考(一轮检测试题)语文试题含解析
- 互联网时代的亲子教育
- DB32/T+5096-2025+汽车充(换)电站雷电防护装置检测技术规范
- 邯郸市高三下学期第一次模拟考试理综生物试题
- 销售年终述职与总结报告(素材15篇)
- 教育政策的国际比较研究-深度研究
- 生活垃圾焚烧处理厂垃圾焚烧炉设计方案
- “趣”破“蛐蛐”小妙招社交魔法课主题班会
- 快递小哥交通安全课件
- 2025年青海能源投资集团有限责任公司招聘笔试参考题库含答案解析
- 2025年河南建筑职业技术学院单招职业技能测试题库审定版
- 2026年版广西高等职业教育考试(新职教高考)新闻传播大类《摄影摄像》模拟试卷(第1套)
- 山东省烟台市第二中学等校2021-2022学年高二下学期期中考试历史试题(原卷版)
- DB14-T 2779-2023 营造林工程监理规范
- 学校行政管理中的沟通艺术与效率
- 二零二五版风力发电工程监理服务合同示范文本3篇
评论
0/150
提交评论