版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 硬件描述语言VHDL基础,硬件描述语言概述 VHDL语言程序结构 VHDL常用语句 VHDL语法基础,3.1硬件描述语言概述,VHDL硬件描述语言的英文全名是Very High Speed Integrated Circuit Hardware Description Language,即超高速集成电路硬件描述语言,以下简称为VHDL语言。使用VHDL语言可以实现数字电子系统的行为级描述,RTL(寄存器传输级)描述以及结构级描述。目前在国内外应用的硬件描述语言有许多种,其中应用最广泛的有VHDL语言和Verilog-HDL语言。,3.1硬件描述语言概述,运用VHDL语言设计系统一般采用
2、自顶向下分层设计的方法,首先从系统级功能设计开始,对系统高层模块进行行为描述和功能仿真。系统的功能验证完成后,将抽象的高层设计自顶向下逐级细化,直到与所用可编程逻辑器件相对应的逻辑描述。,3.2 VHDL语言程序结构,VHDL语言程序可由实体(Entity)说明、结构体(Architecture)、程序包(Package)、库(Library)、配置(Configuration)5个部分组成。其中库、实体说明、结构体是一个VHDL语言程序的基本组成部分。,VHDL语言把这个设计单元作为一个设计实体处理,一个设计实体只能唯一地对应一个设定单元。一个设计实体由实体说明和结构体组成。一个实体说明可以
3、对应多个结构体。,【例3-1】二选一MUX的VHDL描述。 -2 to 1 mux VHDL LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux IS PORT(d0,d1,sel:IN STD_LOGIC; f:OUT STD_LOGIC); END mux; ARCHITECTURE structure OF mux IS SIGNAL temp:STD_LOGIC; BEGIN,库说明,实体说明,端口说明,结构体,信号定义,P0:PROCESS(d0,d1,sel) VARIABLE templ,temp2,temp3:STD_LO
4、GIC; BEGIN templ:=d0 AND(NOT sel); temp2:=d1 AND sel; temp3:=templ OR temp2; temp=temp3; f=temp; END PROCESS P0; END structure;,进程,变量定义,3.2.1 实体说明,实体说明的书写格式如下所示: ENTITY IS GENERIC (类属说明); PORT (端口说明); 实体语句部分; END ENTITY ; 其中“”中的部分是必选项,“ ”中的部分是可选项。,3.2.1 实体说明,例如,4位加法器作为一个设计实体的实体说明如下: ENTITY adder_rip
5、ple IS GENERIC (m: TIME:=5 ns); PORT(a,b: IN STD_LOGIC_VECTOR(3 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); Cout: OUT STD_ LOGIC); END adder_ripple;,3.2.1 实体说明,1.类属说明语句(GENERIC) 类属说明语句必须放在端口说明语句之前,用以设定实体或元件的内部电路结构和规模,其书写格式如下: GENERIC (常数名:数据类型:=设定值; 常数名:数据类型:=设定值); 例如:GENERIC (m:TIME:=5 ns);指定了结
6、构体内m的值为5ns。,3.2.1 实体说明,2.端口说明(PORT) 端口对应于电路图中元件符号的外部引脚。端口说明语句是对基本设计实体(单元)与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入输出方向的描述。端口说明语句的一般格式如下: PORT (端口名,端口名:模式 数据类型名; 端口名,端口名:模式 数据类型名);,3.2.1 实体说明,注意: (1)端口名是赋给每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名。各端口名在实体中必须是唯一的,不能重复。 (2)模式用来说明信号的方向,详细的端口方向说明见下表。需要指出的是,BUFFER是INOUT的
7、子集;做输入时,信号不是由外部驱动,而是从输出反馈得到。,3.2.1 实体说明,(3)数据类型名则是端口信号的取值类型,有: BIT:位类型,取值0、1,由STANDARD程序包定义; BIT_VECTOR:位向量类型,是BIT的组合; STD_LOGIC:工业标准的逻辑类型,取值0、1、X、Z等,由 STD_LOGIC_1164程序包定义; INTEGER:整数类型,可用作循环指针或常数,通常不用作I/O信号; BOOLEAN :布尔类型,取值FALSE、TRUE STD_LOGIC_VECTOR :工业标准的逻辑向量类型,是STD_LOGIC的组合;,3.2.2 结构体,结构体(Archi
8、tecture) 是对实体功能的具体描述。结构体主要是描述实体的硬件结构、元件之间的互连关系、实体所完成的逻辑功能以及数据的传输变换等方面的内容。 结构体对其实体的输入/输出关系描述有三种方式:行为描述方式(behavioral)、数据流描述方式(dataflow)和结构描述方式(structure)。最常用的是结构描述方式。,一个结构体的书写格式如下: ARCHITECTURE OF IS 定义语句; BEGIN END ;,3.2.2 结构体,一个实体中可以具有一个结构体,也可以具有几个结构体。一个实体内部若有几个结构体,则结构体名不能重复。 结构体中的定义语句位于ARCHITECTURE
9、 和BEGIN之间,用于对结构体内部所使用的信号(SIGNAL)、常数(CONSTANT)、数据类型、元件(COMPONENT)和过程(PROCEDURE)等进行定义。,3.2.2 结构体,【例3-2】一个RS触发器的结构体的行为描述方式。 ARCHITECTURE rs_behav OF rsff IS BEGIN q=NOT(qb AND set); qb=NOT(q AND reset); END rs_behav;,是一个RS触发器的结构体的行为描述方式。,【例3-3】一个RS触发器的结构体的结构描述方式。 ARCHITECTURE rs_stru OF rsff IS COMPONE
10、NT nand2 PORT(a,b:IN BIT; c:OUT BIT); END COMPONENT; BEGIN u1:nand2 PORT MAP(a=set,b=qb,c=q); u2:nand2 PORT MAP(a=reset,b=q,c=qb); END rs_stru;,-是一个RS触发器的结构体的结构描述方式。,【例3-4】使用RTL描述方式的全加器VHDL程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY full_adder IS GENERIC (tpd:TIME:=5 ns); -tpd=5 ns PORT (a,
11、b,Cin:IN STD_LOGIC; S,Co:OUT STD_ LOGIC); END full_adder; ARCHITECTURE rtl OF full_adder IS SIGNAL h:STD_LOGIC; -内部信号定义 BEGIN h=a XOR b AFTER tpd; S=h XOR Cin AFTER tpd; Co=(a AND b)OR(h AND Cin) AFTER 2*tpd; END rtl;,3.2.2 结构体,在实际的硬件电路设计中,当电路的规模较大时,全部电路用一个模块来描述很不方便。一般情况下,是将整个电路分成若干相对独立的子模块来进行描述。VHD
12、L语言的功能描述语句结构可以是含有五种不同类型、并以并行方式工作的语句结构。 VHDL语言中常用的三种子结构描述语句为BLOCK语句结构、PROCESS语句结构和SUBPROGRAM语句结构。,1. 块(BLOCK)语句结构,BLOCK的应用类似于将一个电路原理图分为几个子模块进行绘制,而其中每个子模块都可以是一个具体的电路原理图。也就是说,按照模块方式对结构体进行划分并不会改变电路的逻辑功能。设计者可以合理地将一个模块划分为数个区域,在每个区域中都能定义或描述局部信号、数据类型和常量。,1. 块(BLOCK)语句结构,所有能在结构体的说明部分进行说明的对象都可以在BLOCK的说明部分进行说明
13、。 BLOCK语句的书写格式如下: 块标号: BLOCK卫式表达式 类属子句类属接口表; 端口子句端口接口表; 块说明部分; BEGIN END BLOCK块标号;,【例3-5】采用BLOCK语句来描述的计数器电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter2 IS PORT(clk:IN STD_LOGIC;q1,q0:OUT STD_LOGIC); END counter2; ARCHITECTURE arch_counter2 OF counter2
14、IS SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN counter: BLOCK BEGIN PROCESS(clk) BEGIN IF(clkEVENT AND clk=1)THEN IF (count(0)=1 AND count(1)=1) THEN count=“00; ELSE count=count+1; END IF; END IF; q1=count(1); q0=count(0); END PROCESS;END BLOCK counter; END arch_counter2;,在对程序进行仿真时,BLOCK语句中所描述的
15、各条语句是并行执行的,执行顺序与书写顺序无关,【例3-6】含卫式表达式的VHDL程序。 ENTITY dlatch IS PORT (d,clk:IN BIT; q,qb:OUT BIT); END dlatch; ARCHITECTURE latch_guard OF dlatch IS BEGIN g1: BLOCK(clk=1) BEGIN q=GUARDED d AFTER 5ns; qbGUARDED NOT(d) AFTER 5ns; END BLOCK g1; END latch_guard;,当卫式表达式为真时,BLOCK语句被执行,否则将跳过BLOCK语句。在BLOCK块中的
16、信号传送语句前都要加一个前卫关键词GUARDED,以表明只有在条件满足时此语句才会执行。,2. 进程(PROCESS)语句结构,用PROCESS语句描述电路结构的书写格式为: 进程标号:PROCESS 敏感信号表 IS 进程语句说明部分; BEGIN END PROCESS进程标号;,2. 进程(PROCESS)语句结构,进程标号是进程的命名,是可选项。敏感信号表列出了进程语句敏感的所有信号,任意一个敏感信号改变,进程中由顺序语句定义的行为就会重新执行一遍。进程说明部分对该进程所需的局部数据环境进行定义。BEGIN和END PROCESS之间是描述进程行为的顺序执行语句。 进程行为的结果可以赋
17、给信号,通过信号可被其他的PROCESS或BLOCK读取或赋值。当执行完进程中最后一个语句后,执行过程将返回到进程的第一个语句,以等待下一次敏感信号变化。,2. 进程(PROCESS)语句结构,一个结构体中可以含有多个PROCESS结构,每个进程可以在任何时刻被激活或者启动。而所有被激活的进程都是并行运行的,所以PROCESS结构本身是并行语句。,【例3-7】带敏感信号表的进程语句实例。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dff IS PORT (d,clk,reset:IN STD_LOGIC; q:OUT STD_LOGIC
18、); END dff; ARCHITECTURE example OF dff IS BEGIN PROCESS(clk,reset) BEGIN IF reset=0THEN q=0; ELSIF (clkEVENT AND clk=1) THEN q=d; END IF; END PROCESS; END example;,异步复位的 D触发器,3. 子程序(SUBPROGRAM)语句结构,所谓子程序,就是在主程序调用它之后能将处理结果返回到主程序的程序模块,是一个VHDL程序模块,利用顺序语句来定义和完成各种算法;其含义与其他高级语句中的子程序概念相当,可以反复调用。在调用子程序时,要首
19、先对其进行初始化,执行结束再调用则需再次初始化。因此,子程序内部的值是不能保持的。 在VHDL中有两种类型的子程序:过程(Procedure)和函数(Function)。,函数(Function),函数语句的书写格式如下: FUNCTION (参数表) RETURN IS 函数说明; BEGIN RETURN (表达式); END FUNCTION ;,【例3-8】一个在包集合中使用的函数例子。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; PACKAGE bpac IS FUNCTION max(a:STD_LOGIC_VECTOR; b:STD_LO
20、GIC_VECTOR) RETURN STD_LOGIC_VECTOR; END bpac; PACKAGE BODY bpac IS FUNCTION max(a:STD_LOGIC_VECTOR; b:STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS VARIABLE temp:STD_LOGIC_VECTOR; BEGIN IF(ab)THEN temp:=a; ELSE temp:=b; END IF; RETURN temp; END; END bpac;,函数(Function),对于上述包集合中定义的函数,假设某个结构体中有如下所示的一条语
21、句: peak=max(data,peak); 此语句就是调用FUNCTION的语句。在包集合中的参数a和b,在这里用data和peak所代替。函数的返回值tmp被赋予peak。同时,由上面的例子可以看出,函数只能返回一个函数值。,过程(Procedure),过程语句的书写格式如下: PROCEDURE (参数表) IS 过程说明; BEGIN 过程语句部分; ENDPROCEDURE ; 在PROCEDURE结构中,参数可以是IN、OUT、INOUT等多种模式。,【例3-9】一个由过程语句实现的译码器例子。 PROCEDURE decoder (code:INTEGER RANGE 0 TO
22、 3; decoder_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) IS BEGIN VARIABLE decoder:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CASE code IS WHEN 0=decoderdecoderdecoderdecoder=B“1000”; END CASE; decoder_out=decoder; END decoder;,过程(Procedure),与函数相同的是,过程体中的参数说明部分只是局部的,其中的各种定义只能是用于过程体内部。过程体中的顺序语句部分可以包含任何顺序执行的语句,包括WAIT语
23、句。但需要注意的是,如果一个过程是在进程中调用,且该进程已列出了敏感参量表,则不能在此过程中使用WAIT语句。,3.2.3包集合、库及配置,除了实体和结构体外,包集合、库及配置是在VHDL语言中另外三个可以各自独立进行编译的设计元件。,1. 包集合(Package),为了使一组数据类型、常量、子程序等被多个实体公用,VHDL提供了包集合的机制。包集合就像是公用的工具箱,各个实体都可使用其中定义的工具。包集合结构如下所示: PACKAGE 包集合名 IS 说明语句 END 包集合名; PACKAGE BODY 包集合名 IS 说明语句 END BODY;,1. 包集合(Package),为了方便
24、设计,VHDL提供了一些标准的包集合。 LIBRARY IEEE; -打开IEEE库 USE IEEE.STD_LOGIC_1164.ALL; -调用其中的STD_LOGIC_1164包集合,【例3-10】包集合的例子。 -包集合说明 PACKAGE example IS TYPE alu_op IS(add,sub,mul,div,eq,gt,lt) ; -枚举类型 CONSTANT pi:REAL:=3.1415926; -常量 CONSTANT delayl:TIME; COMPONENT nand2 -元件 PORT(a,b:IN BIT; c:OUT BIT); END COMPON
25、ENT; FUNCTION mean(a,b,c:REAL) RETURN REAL; -函数 END example;,PACKAGE BODY example IS -包集合体 CONSTANT delay1:TIME:=15ns; -定义延时常量的值 FUNCTION mean(a,b,c:REAL) RETURN REAL IS BEGIN RETURN(a+b+c)/3.0; -求均值 END mean; END example;,1. 包集合(Package),自定义的包集合和标准包集合一样,也要通过调用才能使用。如要用上例中的example包集合,则要在实体说明前加上语句: US
26、E WORK.example.ALL;,2. 配置(Configuration),配置(Configuration)语句描述层与层之间的连接关系,以及实体与结构之间的连接关系。设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。在仿真某一个实体时,可以利用配置来选择各种不同的结构体,进行性能对比试验,以得到性能最佳的结构体。,2. 配置(Configuration),配置语句的基本书写格式如下: CONFIGURATION 配置名 OF实体名 IS 语句说明 END 配置名;,2. 配置(Configuration),例如,上述RS触发器的结构体,若要选用行为式结构体,可在
27、描述语句中加上下面这段配置说明。 CONFIGURATION confr OF rsff IS FOR rs_behav; END FOR; END confr;,3. 库(Library),VHDL语言中的库用来存放已编译过的设计单元(包括实体说明、结构体、配置说明、包集合),库中内容可以用作其他VHDL描述的资源。在VHDL语言中,库的说明总是放在设计单元的最前面: LIBRARY 库名;,3. 库(Library),在VHDL语言中库大致有5种:IEEE库、STD库、ASIC向量库、用户定义的库和WORK库。除WORK库外,其他4类库在使用前都要首先进行说明,第一个语句是LIBRARY
28、库名,表明使用什么库。另外还要说明设计者要使用的是库中哪一个包集合以及包集合中的项目名。这样第2个语句的格式为: USE 库名.程序包名.项目名;,3.3 VHDL常用语句,VHDL的描述语句分为并行语句和顺序语句两种。并行语句主要用来描述模块之间的连接关系,顺序语句一般用来实现模型的算法部分。并行语句之间是并行的关系,当某个信号发生变化时,受此信号触发的所有语句同时执行。顺序语句则是严格按照书写的先后次序顺序执行。,3.3.1 并行语句,在VHDL语言中,并行语句主要包括: 并行信号赋值语句; 块语句; 进程语句; 过程调用语句; 参数传递语句(也称GENERIC语句); 元件例化语句; 生
29、成语句; 并行断言语句。,1. 并行信号赋值语句,在VHDL语言中,并行信号赋值语句可分为以下3个子类型: 并发信号赋值语句; 条件信号赋值语句; 选择信号赋值语句。 上面信号赋值语句的共同特点就是语句执行都是并发的。,(1)并发信号赋值语句,并发信号赋值语句在进程内部使用时,它作为顺序语句的形式出现,信号赋值语句在结构体的进程之外使用时,它作为并发语句的形式出现。一个并发信号赋值语句是一个等效进程的简略形式。,若有两个信号赋值语句: q=a+b; -描述加法器的行为,第i行程序 q=a*b; -描述乘法器的行为。第i+1行程序 这个赋值语句是并发执行的,加法器和乘法器独立并行工作。第i行和第
30、i+1行程序在仿真时都并发处理,从而真实地模拟了实际硬件模块中加法器、乘法器的工作情况。这就是信号赋值语句的并发性问题。,并发信号赋值语句等效一个进程,请分析下面2个程序段: ARCHITECTURE example OF signal_assignment IS BEGIN q=a AND b AFTER 5 ns; -信号代入语句 END example; 它的等效的进程可以表述为: ARCHITECTURE example OF signal_assignment IS BEGIN p1:PROCESS(a,b) -敏感信号a,b BEGIN q=a AND b AFTER 5 ns;
31、END RPOCESS pl; END example;,(2)条件信号赋值语句,条件信号赋值语句属于并发描述语句的范畴,可以根据不同的条件将不同的表达式的值赋给目标信号。条件信号赋值语句书写的一般格式为 : 目标信号=表达式1 WHEN条件1 ELSE 表达式2 WHEN条件2 ELSE 表达式3 WHEN条件3 ELSE 表达式n-1 WHEN条件n-1 ELSE 表达式n;,【例3-11】用条件信号赋值语句设计四选一数据选择器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT(d0,dl,d2,d3,a,b:I
32、N STD_LOGIC; q:OUT STD_LOGIC); END mux4; ARCHITECTURE behave1 OF mux4 IS SIGNAL sel:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN sel=ba; -经过并置操作sel成为二位向量 q=d0 WHEN sel=“00” ELSE d1 WHEN sel=“01” ELSE d2 WHEN sel=“10” ELSE d3 WHEN sel=“11” ELSE Z; END behave1;,(3)选择信号赋值语句,选择信号赋值语句对选择条件表达式进行测试,当选择条件表达式取值不同时,将使
33、信号表达式不同的值赋给目标信号。选择信号赋值语句的书写格式如下: WITH 选择条件表达式 SELECT 目标信号=信号表达式1 WHEN 选择条件1 信号表达式2 WHEN 选择条件2 信号表达式n WHEN 选择条件n,【例3-12】用选择信号赋值语句设计四选一数据选择器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT (d0,dl,d2,d3,a,b:IN STD_LOGIC; q:OUT STD_LOGIC); END mux4; ARCHITECTURE behave2 OF mux4 IS SIGNAL
34、 sel:INTEGER; BEGIN WITH sel SELECT -选择信号赋值语句 q=d0 WHEN 0, d1 WHEN 1, d2 WHEN 2, d3 WHEN 3, ZWHEN OTHERS; sel=0 WHEN a=0AND b=0ELSE -条件信号赋值语句 1 WHEN a=1AND b=0ELSE 2 WHEN a=0AND b=1ELSE 3 WHEN a=1AND b=1ELSE 4; END behave2;,2. 元件例化语句,用VHDL语言实现一个大的系统设计时,层次化设计方法或者层次化设计思想是经常采用的。如果把一个大系统视为一个实体,那么在对这个实体的
35、结构体描述时,除了使用子程序(过程和函数)调用、BLOCK块语句之外,COMPONENT和COMPONENT INSTANT语句的联合使用最能体现结构体描述中的层次化设计思想。,2. 元件例化语句,COMPONENT语句用来指明结构体所要调用的文件、单元或模块。一般被调用的元件、单元、模块的结构体描述程序都是已编程好的,甚至都是通过逻辑综合、模拟仿真后认为都是最优的。通常把这些已编程好的结构体描述程序视为是现成的元件。单元、模块的程序都存放在某库的程序包中。在进行目标中的结构体描述时,若要用到被调用的元件、单元、模块,只要使用COMPONENT语句就可以实现将这些低层元件嵌入到高一层次的结构体
36、中。,2. 元件例化语句,COMPONENT语句的书写格式如下: COMPONENT GENERIC ; PORT ; END COMPONENT; COMPONENT INSTANT语句的书写格式: GENERIC MAP (参数映射) PORT MAP(端口映射);,假设WORK库中名为GATE的程序包已经存放了一位全加器的VHDL程序,其程序如下: ENTITY adder is PORT(a,b,cin:IN STD_LOGIC; cout,sum:OUT STD_LOGIC); END adder; ARCHITECTIRE structure OF adder IS SIGNAL
37、int:STD_LOGIC; BEGIN int=a XOR b AFTER 10 ns; cout=(a AND b) OR (int AND cin) AFTER 10 ns; sum=int XOR cin AFTER 10 ns; END structure;,【例3-13】调用WORK库中adder元件组成 8位加法器的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE WORK.GATE.ALL; ENTITY adder8 IS GENERIC (n:INTEGER:=8); PORT(a,b:IN STD_LOGIC_V
38、ECTOR(n DOWNTO 1); cin:IN STD_LOGIC; sum:OUT STD_LOGIC_VECTOR(n DOWNTO 1); cout:OUT STD_LOGIC); END adder8; ARCHITECTURE structure OF adder8 IS COMPONENT adder PORT(a:IN STD_LOGIC; b:IN STD_LOGIC; cin:IN STD_LOGIC; sum:OUT STD_LOGIC; cout:OUT STD_LOGIC); END COMPONENT; SIGNAL carry:STD_LOGIC_VECTOR(
39、1 TO n-1);,BEGIN gen:FOR i IN 1 TO n GENERATE first_bit:IF i=1 GENERATE first_cell:adder PORT MAP(a(i),b(i),cin,sum(i),carry(i); END GENERATE first_bit; middle_bits:IF i1 AND in GENERATE middle_cell:adder PORT MAP(a(i),b(i),carry(i-1), sum(i),carry(i); END GENERATE middle_bits; ms_bit:IF i=n GENERAT
40、E ms_cell:adder PORT MAP(a(n),b(n),carry(n-1),sum(n),cout); END GENERATE ms_bit; END GENERATE gen; END structure;,3. 生成语句,生成(GENERATE)语句适用于将简单元件扩展成相同结构或规则结构的更大电路的描述。GENERATE语句有二种形式,一种是FOR GENERATE,另一种是IF GENERATE。 FOR GENERATE语句的书写形式如下: 标号名: FOR 变量IN不连续区间GENERATE ; END GENERATE 标号名;,3. 生成语句,IF GENER
41、ATE 语句的书写形式如下: 标号名: IF 条件GENERATE ; END GENERATE 标号名;,【例3-14】 用元件例化语句描述由D触发器构成移位寄存器的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift_register IS PORT(a,clk:IN STD_LOGIC; b:OUT STD_LOGIC); END shift_register; ARCHITECTURE four_bit_shift_register OF shift_register IS COMPONENT dff -元件例化
42、dff PORT(a,clk:IN STD_LOGIC; b:OUT STD_LOGIC); END COMPONENT; SIGNAL s:STD_LOGIC_VECTOR(0 TO 4); BEGIN s(0)=a; dffl:dff PORT MAP(s(0),clk,s(1); dff2:dff PORT MAP(s(1),clk,s(2); dff3:dff PORT MAP(s(2),clk,s(3); dff4:dff PORT MAP(s(3),clk,s(4); b=s(4); END four_bit_shift_register;,【例3-15】 用FOR GENERAT
43、E语句实现电路的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift_register IS PORT(a,clk:IN STD_LOGIC; b:OUT STD_LOGIC); END shift_register; ARCHITECTURE four_shift_register OF shift_register IS COMPONENT dff -元件例化语句 PORT(c d,clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; SIGNAL s:STD_LOGI
44、C_VECTOR(0 TO 4); BEGIN s(0)=a: -输入信号代入语句 registerl:FOR i IN 0 TO 3 GENERATE dffx:dff PORT MAP(s(i),clk,s(i+1); -端口映射 END GENERATE; b=s(4); -输出信号代入语句 END four_shift_register;,【例3-16】由IF GENERATE语句描述由D触发器扩展成移位寄存器的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift IS GENERIC (n:INTEGER:=8
45、); PORT(a,clk:IN STD_LOGIC; b:OUT STD_LOGIC); END shift; ARCHITECTURE gen_shift OF shift IS COMPONENT dff PORT(d,clk:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; SIGNAL z:STD_LOGIC_VECTOR(1 TO(n-1);,BEGIN g1:FOR i IN 0 TO(n-1)GENERATE u0:IF i=0 GENERATE dffx:dff PORT MAP(a,clk,z(i+1); END GENERATE
46、; u1:IF i=(n-1) GENERATE dffx:PORT MAP(z(i),clk,b); END GENERATE; u2:IF(i /= 0)AND(i /= (n-1)GENERATE dffx:PORT MAP(z(i),clk,z(i+1); END GENERATE; END GENERATE; END gen_shift;,3.3.2顺序语句,顺序语句是相对于并行语句而言的。顺序语句的特点是:每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序相一致的。顺序语句只能出现在进程(PROCESS)和子程序中,子程序包括函数(FUNCTION)和过程(PROCEDURE
47、)。 顺序语句主要有: 顺序赋值语句;WAIT语句;IF语句;CASE语句;LOOP语句;EXIT语句;RETURN语句;NULL语句;REPORT语句;断言语句。,1. 顺序赋值语句(1)变量赋值语句,在VHDL语言中,变量的说明和赋值只能在VHDL语言程序的顺序部分进行说明和使用,也就是只能在进程、过程和函数中进行。变量赋值语句的书写格式为: 目标变量:=表达式; 对于变量赋值语句来说,赋值符号两边的目标变量和表达式的数据类型和长度必须保持一致,否则将会出现编译错误。 在变量赋值语句中,变量的赋值是直接的、立即生效的,因此在变量赋值语句中不允许出现附加延时。,(2) 信号赋值语句,信号赋值
48、语句只能在VHDL语言程序的并行部分进行说明,但可以用在并行部分,也可以用在顺序部分。 信号赋值语句的书写格式为: 目标信号=表达式; 对于信号赋值语句来说,赋值符号两边的目标信号和表达式的数据类型和长度必须保持一致,否则将会出现编译错误。 在信号赋值语句中,信号赋值的执行和信号值更新之间至少有DELTA延时,只有延时过后信号才能够得到新值。,2. WAIT语句,进程在仿真运行中总是处于两种状态之一:执行或挂起。进程状态的变化受WAIT语句控制,当进程执行到WAIT语句时就将被挂起,并设置好再次执行的条件。WAIT语句可以设置4种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类
49、条件可以混用,其书写格式如下: WAIT -无限等待 WAIT ON -敏感信号变化 WAIT UNTIL -条件满足 WAIT FOR -时间到,3. IF语句,IF语句是具有条件控制功能的语句,根据给出的条件,以及条件是否成立的结果来决定语句的执行顺序。IF语句有下面3种形式。 (1) IF_THEN语句,其语句形式如下。 IF标号: IF THEN ; END IF IF标号; 当程序执行到该IF语句时,要对该IF语句中所给出的条件进行判断。若条件成立,IF语句中的顺序处理语句将被执行;若条件不成立,程序则跳出IF语句,执行IF语句的结尾语句(END IF)之后的各条语句。,【例3-17
50、】在进程中使用IF_THEN语句实现D触发器功能的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dff IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_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;,3. IF语句,(2)IFTHENELSE语句,其语句形式如下: IF标号: IF
51、THEN ; ELSE ; END IF IF标号;,【例3-18】用IF_THEN_ELSE语句实现D触发至T触发器转换的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY tff IS PORT(T,clk:IN STD_LOGIC; q:BUFFER STD_LOGIC); END tff; ARCHITECTURE dff_tff OF tff IS BEGIN PROCESS(clk) BEGIN IF (clkEVENT AND clk=1) THEN IF (T=1) THEN q=NOT(q); ELSE q=q;
52、 END IF; END IF; END PROCESS; END dff_tff;,3. IF语句,(3) IFTHENELSIFELSE语句,其语句形式如下: IF THEN ; ELSIF THEN ; ELSIF THEN ; ELSE ; END IF,4. CASE语句,CASE语句是另一种形式的条件控制语句。CASE语句根据条件变量或表达式的取值来选择执行哪个顺序处理语句。CASE语句的格式如下: CASE 表达式 IS WHEN 表达式的取值1=顺序处理语句1; WHEN 表达式的取值2=顺序处理语句2; WHEN OTHERS=顺序处理语句n; END CASE;,【例3-1
53、9】用CASE语句实现3-8线译码器的VHDL程序。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY decoder_3to8 IS PORT(a,b,c,g1,g2,g3:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END decoder_3to8; ARCHITECTURE rtl OF decoder_3to8 IS SIGNAL indata:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN indata=c ,PROCESS(indata,g1,g2,g3
54、) BEGIN IF(g1=1AND g2=0AND g3=0)THEN CASE indata IS WHEN “000”=yyyyyyyyy=“XXXXXXXX”; END CASE; ELSE y=“11111111”; END IF; END PROCESS; END rtl;,5. LOOP语句,LOOP语句使程序进行有规则的循环,常用的循环语句有FOR循环语句(FORLOOP)和WHILE循环语句(WHILELOOP)。退出循环使用EXIT语句,一旦执行EXIT语句,立即退出循环。 (1)FORLOOP语句 FORLOOP语句的书写格式如下: LOOP标号: FOR 循环变量 IN
55、 取值范围 LOOP ; END LOOPLOOP标号; 其中循环变量的值在每次循环中都会发生变化,取值范围规定了在循环过程中,循环变量的重复次数。,【例3-20】用FOR_LOOP语句描述的8位奇偶校验电路程序。 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 rtl OF parity_check IS BEGIN PROCESS
56、(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;,5. LOOP语句,(2)WHILELOOP语句 WHILELOOP语句的书写格式如下: LOOP标号: WHILE 条件 LOOP ; END LOOPLOOP标号; 在该循环语句中,如循环条件为真,则执行循环;如果条件为假,则结束循环。,【例3-21】用WHILE_LOOP语句描述的8位奇偶校验电路的程序。 LIBRARY IEEE; USE IEEE
57、.STD_LOGIC_1164.ALL; ENTITY parity_check IS PORT(a:lN STD_LOGIC_VECTOR(7 DOWNTO O); y:OUT STD_LOGIC); END parity_check; ARCHITECTURE behav OF parity_check IS BEGIN PROCESS(a) VARIABLE tmp:STD_LOGIC; VARIABLE i:INTEGER RANGE 0 TO 255; BEGIN tmp:=0; i:=0; WHILE(i8)LOOP tmp:=tmp XOR a(i); i:=i+1; END LOOP; y=tmp; END PROCESS; END behav;,6. EXIT语句,EXIT语句也是LOOP语句中使用的循环控制语句,执行EXIT语句将结束循环状
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年人力资源师管理实务专项训练卷(附答案)
- 初三道德与法治中考一轮复习:易错易混核心知识辨析与素养提升教案
- 初中八年级历史上册(部编版)核心知识清单:戊戌变法
- 2026年食品工艺学专业知识真题含答案
- 板蓝根(Isatidis Radix)种植产业高质量发展与全球竞争力构建战略研究(年)行业报告
- 北师大版小学数学三年级寒假作业第一周教学设计
- 城市公共安全治理:烟花爆竹“打非”专项行动策略与实务(应急管理专业高职二年级核心技能课教案)
- 室内给水管道施工方案
- 项目部应急医疗救护措施
- 医疗质量与安全管理知识考核试题及答案
- 2026春小学信息技术四年级下册期末练习卷(清华版贵州)含参考答案
- 2026年人教版四年级语文下册期末考试题及答案
- 2024-2025学年广东省五校高一下学期期末联考化学试题含答案
- 中国生育报告2026
- 2026中国焦糖色素市场营销前景展望及投资价值创新性研究报告
- 2026五年级道德与法治下册 历史教育课程
- 2026年危险货物水路运输从业人员资格复习提分资料带答案详解(研优卷)
- 无锡中考历史试卷2024整张
- 血透室质量管理工作制度
- 2025年东南大学强基计划招生数学试卷试题真题(含答案详解)
- 北京人朝初一分班考英语试题及答案
评论
0/150
提交评论