《vhdl语言构造体的描述方式教学PPT.ppt》由会员分享,可在线阅读,更多相关《vhdl语言构造体的描述方式教学PPT.ppt(33页珍藏版)》请在三一文库上搜索。
1、第5章VHDL语言 构造体的描述方式,行为描述方式 数据流描述方式(寄存器传输描述RTL) 结构描述方式 混合描述方式,可进行逻辑综合,不能进行逻辑综合,5.1行为描述方式,所谓行为描述,就是对设计实体的数学模型的描述,其抽象程度远远高于数据流描述方式和结构描述方式. 行为描述类似于高级编程语言,当要描述一个设计实体的行为时,无须知道具体电路的结构,只需要用一组状态来描述即可.,行为描述的优点在于只需要描述清楚输入与输出的行为,而不需要花费更多的精力关注设计功能的门级实现. 描述数字系统的行为,主要用于仿真和系统工作原理的研究。,代入语句 格式: 信号量=敏感信号量表达式; 例如: z=a N
2、OR(b NAND c); 该例中有三个敏感量,无论哪一个发生变化都可以使z变化。 具有时间延迟的代入语句: a=b AFTER 10 ns 表示当b发生变化10 ns后a才变化。 a:=b after 5 ns,语法错误,例如: ENTITY and2 IS PORT(a,b : IN BIT; c : OUT BIT); END and2; ARCHITECTURE and2_behave OF and2 IS BEGIN c=a AND b; END and2_behave;,c=a AND b; 被替换为 c=a AND b AFTER 5 ns;,延时语句 VHDL中有两种延时语句:
3、惯性延时和传输延时。 惯性延时 VHDL中惯性延时是缺省的,因为逻辑硬件电路总是有时间延迟的。若延迟时间是20ns,那么输入信号时间若小于20ns,则输出信号将不跟随输入信号的变化。有时为使延迟时间更逼真实际电路,就专门设置惯性时间: b=a AFTER 10 ns; 传输延时 传输延时常代表总线、连接线的延迟时间,该时间必须专门说明。该传输延时只对信号起纯延时作用。 例: b=TRANSPORT a AFTER 20 ns;,GENERIC语句 GENERIC语句常用于不同层次之间的信息传递。该语句说设计的数据除整数类型以外,如涉及其他类型的数据则不能进行逻辑综合。该语句主要用于行为描述方式
4、。 使用GENERIC语句易于使器件模块化和通用化。 例如书中P54页例题4-4,4-5,数据流描述方式 数据流描述方式是一种可以进行逻辑综合的描述方式,由于要进行逻辑综合所以对使用的语句有一定的限制,VHDL中的每一个命令和语句都对逻辑综合能力进行了定义,要进行逻辑综合的设计实体就要使用有逻辑综合能力的命令和语句。,数据流描述是对从信号到信号的数据流的路径形式进行描述,因此很容易进行逻辑综合. 由于要对信号的流动路径进行描述,因此要求设计人员对设计实体的功能实现要有一定的了解,有时候还需要对内部电路有清楚的认识,具有一定的难度.,例:四选一电路 LIBRARY IEEE; USE IEEE.
5、STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mux42 IS PORT(input : IN STD_LOGIC_VECTOR(3 DOWNTO 0); Sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0); Y : OUT STD_LOGIC); END mux42; ARCHITECTURE app OF mux42 IS BEGIN y=input(0) WHEN sel=0 ELSE input(1) WHEN sel=1 ELSE input(2) WHEN sel=2 ELSE inp
6、ut(3); END app;,使用数据流描述方式应该注意的问题: 1X状态的传递问题 有时X状态会逐级传递,造成系统的输出为不确定或者错误,所以要在设计中考虑X状态对输出的影响。,Process (sel) Begin If (sel=1) Then y=0; Else y=1; End if; End process;,Process (sel) Begin If (sel=1) Then y=0; Else y=1; End if; End process;,如下更改 Process (sel) Begin If (sel=1) then y=0; Elseif (sel=0) then
7、 y=1; Else y=X; End if End process,2. 一些限制 *禁止在一个进程中使用两个寄存器 *在进程中,对变量要先读后写 *在IF语句描述寄存器时,禁止ELSE项 *在寄存器描述中,禁止将变量代入信号 *关连性强的信号应该放在一个进程中,例1: process(clk1,clk2) begin if clk1event and clk1=1 then y=m; end if; if clk2event and clk2=1 then -错误 x=m; end if; end process;,例2: process(clk,reset) variable a:std
8、_logic; begin if reset = 1 then a:= 0; outsignal=0; elsif rising_edge(clk) then outsignal=a; -先读 a := insignal; -后写 end if; end process; 因为变量值是立即获得的,所以如果先写后读就会产生长的组合逻辑和锁存器(或寄存器)。因此在编写代码过程中,对变量要先读后写。,对于RTL描述方式中的IF语句在其描述寄存器功能时,禁止采用ELSE项,因为这种赋值方式相当于检测如果没有时钟信号时,则赋新值,而实际上不可能有这样的硬件电路与之对应,如例3所示。而如例4所示的ELSE
9、项在RTL描述方式中是可以使用的。,例3: process(clk) begin if clkevent and clk=1 then y=m; else -禁止使用 y=n; end if; end process;,例4: process(clk) begin if clkevent and clk=1 then if ena=1 then y=m; else -可以使用 y=n; end if; end if; end process;,结构描述方式,结构描述方式就是在多层次的设计中,通过调用库中的元件或是已设计好的模块来完成设计实体功能的描述. 在结构体中,描述只表示元件(或模块)和元
10、件(或模块)之间的互连,就像网表一样. 当引用库中不存在的元件时,必须首先进行元件的创建,然后将其放在工作库中,通过调用工作库来引用元件.在引用元件时,要先在结构体说明部分进行元件的说明,然后在使用元件进行元件例化.,注重调用已有的元件、元件或门级电路之间的连线是结构描述的特点,结构描述可以提高设计效率. 元件声明语句: 元件声明语句用于调用已生成的元件,这些元件可能在库中,也可能是预先编写的元件实体描述. 元件语句的格式: COMPONENT 元件名 GENERIC说明; 参数说明 PORT 说明; 端口说明 END COMPONENT; 元件语句可以在ARCHITECTURE,PACKAG
11、E和BLOCK的说明部分.,元件调用: 格式: 标号名:元件名 PORT MAP(信号,); 两层信号之间的关系为映射关系,该映射有两种: 位置映射例: 有一元件的端口说明为: port (a,b: in bit; c: out bit); 调用该元件时: u2: 元件名 port map(n1,n2,m); 这里n1对应a,n2对应 b,m对应 c. 名称映射例: 该映射就是将库中已有模块的端口名称,赋予设计中的信号名. U2: 元件名 port map(a=n1,b=n2,c=m);,ASIC级结构描述 插板级结构描述 系统级的结构描述,构造体结构描述的基本框架,全加器,设有两个四位二进制
12、数相加 1 0 0 1 被加数A 0 1 0 1 加数 B 1 1 1 0 和 S 在相加过程中,两数相加有时要产生进位,这个进位要送到高位的和中去.所以一个全加器要求三个变量(被加数Ai和加数Bi以及低位向本位的进位Ci-1)的和Si和向高位的进位Ci.,全加器真值表,一位全加器的逻辑示意图,a,b,Cin,S,Co,采用行为描述方法设计一位全加器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY full_adder IS PORT(a,b,Cin:IN STD_LOGIC; Co,S:OUT STD_LOGIC); END full_ad
13、der; ARCHITECTURE behav OF full_adder IS BEGIN PROCESS(a,b,Cin) VARIABLE ai,bi,ci,si:INTEGER; BEGIN IF (a=0) THEN ai := 0; ELSE ai := 1; END IF; IF (b=0) THEN bi := 0; ELSE bi := 1; END IF;,IF (Cin=0) THEN ci := 0; ELSE ci := 1; END IF; si := ai + bi +ci; CASE si IS WHEN 0= S =0;Co=0; WHEN 1= S =1;C
14、o=0; WHEN 2= S =0;Co=1; WHEN 3= S =1;Co=1; WHEN OTHERS=S=X;Co=0; END CASE; END PROCESS; END behav;,错误; 应为=,错误; 应在32位之内,一位全加器实现的逻辑电路图,采用数据流描述方法设计一位全加器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY full_adder IS PORT(a,b,Cin:IN STD_LOGIC; Co,S:OUT STD_LOGIC); END full_adder; ARCHITECTURE dataflow
15、OF full_adder IS SIGNAL temp1,temp2:STD_LOGIC; BEGIN temp1 = a XOR b; temp2 = temp1 AND Cin; S = temp1 XOR Cin; Co = temp2 OR (a AND b); END dataflow;,采用半加器设计全加器,1位半加器,1位全加器,H_ADDER a co b so,H_ADDER a co b so,H_ADDER a co b so,F_ADDER ain cout bin sum cin,ain,bin,ain,a c b,u1,u2,u3,sum,cout,d,e,f,L
16、IBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2 IS PORT(A,B:IN STD_LOGIC; c: OUT STD_LOGIC); END or2; ARCHITECTURE ful OF or2 IS BEGIN c = a OR b; END fu1;,或门设计,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT(a,b:IN STD_LOGIC; co,so:OUT STD_LOGIC); END h_adder; ARCHITECTURE fh
17、1 OF h_adder IS BEGIN so= a AND (a NAND b); co=NOT( a NAND b ); END fh1;,半加器设计,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_adder IS PORT(ain,bin,cin:IN STD_LOGIC; cout,sum:OUT STD_LOGIC); END f_adder; ARCHITECTURE fd1 OF f_adder IS COMPONENT h_adder PORT(a,b:IN STD_LOGIC; co,so:OUT STD_LOGIC); END COMPONENT; COMPONENT or2 PORT(a,b:IN STD_LOGIC; c:OUT STD_LOGIC); END COMPONENT; SIGNAL d,e,f:STD_LOGIC; BEGIN u1:h_adder PORT MAP(ain,bin,d,e); u2:h_adder PORT MAP(e,b,f,sum); u3:or2 PORT MAP(d,f,cout); END fd1;,元件调用声明,元件连接,全加器设计,
链接地址:https://www.31doc.com/p-3818076.html