EDA技术及应用第5章.ppt_第1页
EDA技术及应用第5章.ppt_第2页
EDA技术及应用第5章.ppt_第3页
EDA技术及应用第5章.ppt_第4页
EDA技术及应用第5章.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,VHDL程序的常用语句,5.3 VHDL并行语句(Concurrent Statements),并行语句是指语句的执行顺序与语句的书写顺序无关,其执行是并发执行的语句,并行语句之间可以有信息的交流,也可以互为独立、互不相关。每一个并发描述语句的内部语句可以有两种不同的运行方式,即并行方式和顺序方式。VHDL结构体中的并行语句主要有八种:,并行语句在结构体中的使用格式如下: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句; BEGIN 并行语句; END ARCHITECTURE 结构体名;,1、进程语句 2、块语句 3、并行信号赋值语句 4、并行过程调用语句 5、并行断言语句 6、类属语句 7、元件例化语句 8、生成语句,2,并行语句运行示意图,顺序语句1 顺序语句2 . 顺序语句n,进程语句,生成语句,信号,元件例化语句,并行过程调用语句,并行信号赋值语句,信号,信号,信号,信号,ARCHITECTURE,END ARCHITECTURE,3,5.3.1 进程语句(Process Statement),1. 进程语句格式 PROCESS语句结构的一般表达格式如下:,一个结构体中可以有多个进程语句,同时并行执行。,进程标号: PROCESS ( 敏感信号参数表 ) IS 进程说明部分; BEGIN 顺序描述语句; END PROCESS 进程标号;,4,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_out = temp; ELSE data_out = c; END IF; END PROCESS p_b; END ex;,例:,5,2.进程语句要点,进程的设计需要注意的问题: PROCESS为一无限循环语句,只有两种状态:执行和等待 进程必须由敏感信号的变化(变量不能作为敏感信号)来启动或具有一个显式的wait语句来激励 使用了敏感表的进程不能再含有等待语句 进程语句本身是并行语句,但其内部则为顺序语句 信号是多个进程间的通信线,是进程间进行联系的重要途径 在任一进程的说明部分不能定义信号 一个进程中只允许描述对应于一个时钟信号的同步时序逻辑,进程可以描述组合电路,最重要的是用它设计时序电路,6,进程工作原理示意图,7,5.3.3并行信号赋值语句 (Concurrent Signal Assignment Statement),例如: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY and_gate IS PORT ( a,b : IN STD_LOGIC ; c : OUT STD_LOGIC); END and_gate; ARCHITECTURE behave OF and_gate IS BEGIN c = a AND b ; END ARCHITECTURE behave;,(1)简单信号赋值语句的格式: 赋值目标 = 表达式; 结构体中的多条并发赋值语句是并行执行的。,8,(2) 条件信号赋值语句(Conditional Signal Assignment),条件信号赋值语句的表达方式如下: 赋值目标 = 表达式 WHEN 条件1 ELSE 表达式 WHEN 条件2 ELSE . 表达式 ;,条件信号赋值语句的几点说明: 1)只有当条件满足时,才能将该条件前面表达式的值赋给目标信号; 2)对条件的判断是有顺序的,条件1具有最高的优先级; 3)条件表达式的值应该是布尔型数值; 4)条件的最后一个表达式不含有when 的子句。 5)条件信号赋值语句允许条件重叠。,9,例: ENTITY mux IS PORT ( a,b,c : IN BIT ; p1,p2 : IN BIT ; z : OUT BIT ); END mux; ARCHITECTURE behv OF mux IS BEGIN z = a WHEN p1 = 1 ELSE -注意,第一句具有最高优先级 b WHEN p2 = 1 ELSE c ; END;,10,library ieee; use ieee.std_logic_1164.all; entity p_encoder is port(i:in std_logic_vector(7 downto 0); a:out std_logic_vector(2 downto 0); end; architecture behv of p_encoder is begin a=“111“ when i(7)=1 else “110“ when i(6)=1 else “101“ when i(5)=1 else “100“ when i(4)=1 else “011“ when i(3)=1 else “010“ when i(2)=1 else “001“ when i(1)=1 else “000“ when i(0)=1 else “111“ ; end;,例:8输入优先编码器,11,(3) 选择信号赋值语句(Selected Signal Assignment),选择信号赋值语句的格式如下: WITH 选择表达式 SELECT 赋值目标信号 = 表达式1 WHEN 选择值1, 表达式2 WHEN 选择值2, . 表达式n WHEN 选择值n; 选择信号赋值语句中也有敏感量,即关键字WITH旁边的选择信号表达式,每当选择表达式的值发生变化时,就启动此语句对各子句的选择值同时进行测试对比,没有优先级之分,若有满足条件的子句时,就将此子句表达式中的值赋给赋值目标信号。,12,例: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY decoder IS PORT ( a, b, c : IN STD_LOGIC; data1,data2 : IN STD_LOGIC; dataout : OUT STD_LOGIC ); END decoder; ARCHITECTURE cont OF decoder IS SIGNAL instruction : STD_LOGIC_VECTOR(2 DOWNTO 0) ; BEGIN instruction = c ,13,WITH selt SELECT muxout = a WHEN 0|1 , - 0或1 b WHEN 2 TO 5 , - 2、3、4、5 c WHEN 6 , d WHEN 7 , Z WHEN OTHERS ;,下面是一个列出选择条件为不同取值范围的4选1多路选择器,当不满足条件时,输出呈高阻态。,使用WITH_SELECT语句的注意事项: ”选择值”要覆盖所有可能的情况,否则要用OTHERS ”选择值”必须互斥,不能有重叠 选择信号赋值语句不能在进程中应用,14,5.3.7元件例化语句(Component Instantiation Statement),元件例化语句用来指明结构体需要调用的元件、单元和模块等,并把调用来的元件、单元和模块正确的嵌入到高一层的结构体描述中,然后使用特定语句把被调用的元件、单元和模块的端口信号与相应的端口信号正确的连接起来。其基本语法格式为:,COMPONENT 元件名 IS - 元件定义语句 GENERIC (类属表); PORT (端口名表); END COMPONENT 元件名; - 元件例化语句 例化名1 :元件名1 PORT MAP(端口名= 连接端口名,.) ; 例化名n :元件名n PORT MAP(端口名= 连接端口名,.) ;,15,例:按下图电路,使用元件例化语句设计一个全加器,16,程序1:调用库中的元件例化,并使用名称关联方式 library ieee; use ieee.std_logic_1164.all; entity fadd is port(a,b,cin:in std_logic; sum,cout:out std_logic); end;,17,ARCHITECTURE fadd_struc OF fadd IS COMPONENT and2 PORT (in1,in2: in std_logic; out: out std_logic); END COMPONENT; COMPONENT or2 PORT (in1,in2: in std_logic; out: out std_logic); END COMPONENT; COMPONENT xor PORT (in1,in2: in std_logic; out: out std_logic); END COMPONENT; SIGNAL i0, i1, i2: std_logic; BEGIN,18,u1: xor PORT MAP (in1=a, in2 =b, out =i0); u2: and2 PORT MAP (in1=a, in2 =b, out =i1); u3: xor PORT MAP (in1=i0, in2=cin, out=sum); u4: and2 PORT MAP (in1=i0, in2=cin, out=i2); u5: or2 PORT MAP (in1=i1, in2=i2, out=cout); END fadd_struc;,19,ARCHITECTURE fadd_struc OF fadd IS COMPONENT and2 PORT (in1,in2: in std_logic; out: out std_logic); END COMPONENT; COMPONENT or2 PORT (in1,in2: in std_logic; out: out std_logic); END COMPONENT; COMPONENT xor PORT (in1,in2: in std_logic; out: out std_logic); END COMPONENT; SIGNAL i0, i1, i2: std_logic; BEGIN u1: xor PORT MAP (a, b, i0); u2: and2 PORT MAP (a, b, i1); u3: xor PORT MAP (i0, cin, sum); u4: and2 PORT MAP (i0, cin, i2); u5: or2 PORT MAP (i1, i2, cout); END fadd_struc;,程序2:调用库中的元件例化,并使用位置关联方式,20,ARCHITECTURE fadd_struc OF fadd IS COMPONENT and2a PORT (x,y: in std_logic; z: out std_logic); END COMPONENT; COMPONENT or2a PORT (x,y: in std_logic; z: out std_logic); END COMPONENT; COMPONENT xor2 PORT (x,y: in std_logic; z: out std_logic); END COMPONENT; SIGNAL i0, i1, i2: std_logic; BEGIN u1: xor2 PORT MAP (a, b, i0); u2: and2a PORT MAP (a, b, i1); u3: xor2 PORT MAP (i0, cin, sum); u4: and2a PORT MAP (i0, cin, i2); u5: or2a PORT MAP (i1, i2, cout); END fadd_struc;,程序3:调用自己设计的元件例化,并使用位置关联方式,21,library ieee; use ieee.std_logic_1164.all; entity and2a is port (x,y:in std_logic; z:out std_logic); end; architecture beh of and2a is begin z=x and y; end; library ieee; use ieee.std_logic_1164.all; entity or2a is port (x,y:in std_logic; z:out std_logic); end; architecture beh of or2a is begin z=x or y; end;,library ieee; use ieee.std_logic_1164.all; entity xor2 is port (x,y:in std_logic; z:out std_logic); end; architecture beh of xor2 is begin z=x xor y; end;,22,5.3.6类属(Generic)语句,ENTITY 实体名 IS GENERIC (类属表); PORT (端口表); END ENTITY 文件名;,类属语句用于不同层次之间的信息传递,类属参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。类属和常数不同,常数只能从设计实体的内部得到赋值,且不能再改变,而类属的值可以从设计实体的外部提供。因此设计者可以从外面通过类属参量重新设定,从而容易的改变一个设计实体或一个元件的内部电路结构和规模。,23,类属语句包括类属说明语句和类属映射语句,书写格式分别为:,类属说明语句的一般格式: GENERIC (常数名:数据类型:=设定值; 常数名:数据类型:=设定值);,类属映射语句的一般格式: GENERIC MAP (类属表),24,library ieee; use ieee.std_logic_1164.all; entity fredevider is generic(n:integer:=4); port(clkin:in std_logic; clkout:out std_logic); end;,Generic应用举例1:,25,architecture beh of fredevider is signal counter:integer range 0 to n; signal clk:std_logic; begin process(clkin) begin if rising_edge(clkin) then if counter=n then clk=not clk; counter=0; else counter=counter+1; end if; end if; end process; clkout=clk; end;,26,library ieee; use ieee.std_logic_1164.all; entity hierarchy_eg is port(clk,sel:in std_logic; clkout:out std_logic); end; architecture str of hierarchy_eg is component fredevider is generic(n:integer); port(clkin:in std_logic; clkout:out std_logic); end component; component a_21mux is port(s,a,b:in std_logic; y:out std_logic); end component;,Generic应用举例2:,27,signal clk1,clk2:std_logic; begin u1:fredevider generic map(n=1) port map(clk,clk1); u2:fredevider generic map(n=4) port map(clk,clk2); u3:a_21mux port map(sel,clk1,clk2,clkout); end;,28,5.3.8生成语句 (Generate Statement),生成语句的主要功能是能够进行复制,简化有规则设计结构的逻辑描述。,生成语句的语句格式有如下两种形式:for语句形式 和 IF语句形式,标号: For 循环变量 IN 取值范围 Generate 说明语句 并行语句 End Generate 标号 ;,对于for语句的结构,主要用来描述设计中的一些有规律的单元结构。 生成参数(循环变量)是自动产生的,它是一个局部变量,根据取值范围自动递增或递减。取值范围的语句格式,有两种形式: 表达式 TO 表达式 ; - 递增方式,如 1 TO 5 表达式 DOWNTO 表达式 ; - 递减方式,如 5 DOWNTO 1 其中的表达式必须是整数。,29,对于if 语句的结构,主要用来描述设计中不规则的单元结构,如某些边界条件的特殊性。该语句中,若条件为真,则执行生成语句中的并行语句,若为假则不执行该语句。,标号:IF 条件 Generate 说明 并行语句 End Generate 标号 ;,30,两种格式都由四部分组成:,(1)生成方式:有for和if语句结构,规定并行语句的 复制方式 (2)说明部分:对数据类型和数据对象等进行一些说明 (3)并行语句:是复制的基本单元 (4)标号:标号是必须的,下面是使用生成语句产生的8个相同的电路模块的示例,31, COMPONENT comp PORT ( INPUT : IN STD_LOGIC ; OUTPUT : OUT STD_LOGIC ); END COMPONENT ; SIGNAL a : STD_LOGIC_VECTOR(0 TO 7); SIGNAL b : STD_LOGIC_VECTOR(0 TO 7); gen : FOR i IN aRANGE GENERATE - aRANGE为数据区间类属性 u1: comp PORT MAP (INPUT=a(i),OUTPUT=b(i); 名称映射 END GENERATE gen; .,32,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Latch_1 IS PORT( D : IN STD_LOGIC; ENA : IN STD_LOGIC; Q : OUT STD_LOGIC ); END ENTITY Latch_1 ; ARCHITECTURE one OF Latch_1 IS SIGNAL sig_save : STD_LOGIC; BEGIN PROCESS (D, ENA) BEGIN IF ENA = 1 THEN sig_save = D ; END IF ; Q = sig_save ; END PROCESS ; END ARCHITECTURE one;,下面为使用元件例化语句和FOR_GENERATE语句完成一个8位三态锁存器的设计的例子 1. 设计底层的1位锁存器:,33,2. 设计顶层的8位锁存器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY SN74373 IS PORT ( D : IN STD_LOGIC_VECTOR( 8 DOWNTO 1 ); OEN ,G : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(8 DOWNTO 1); END ENTITY SN74373;,ARCHITECTURE one OF SN74373 IS COMPONENT Latch_1 PORT ( D, ENA : IN STD_LOGIC; Q : OUT STD_LOGIC ); END COMPONENT; SIGNAL sig_mid : STD_LOGIC_VECTOR( 8 DOWNTO 1 ); BEGIN GeLatch : FOR i IN 1 TO 8 GENERATE Latchx : Latch_1 PORT MAP (D(i),G,sig_mid(i); -位置映射 END GENERATE; Q = sig_mid WHEN OEN = 0 ELSE “ZZZZZZZZ“; -当OEN=1时,Q(8)-Q(1)输出状态呈高阻态 END ARCHITECTURE one;,34,5.4 顺序语句(Sequential Statements),顺序语句和并行语句是VHDL中的两大基本描述语句系列。,35,5.4.2 if语句(If Statements),if语句是一种条件语句,其基本结构有四种:,1.if 条件句 then 顺序语句; end if;,2.if 条件句 then 顺序语句; else 顺序语句; end if;,4.if 条件句 then if 条件句 then end if; end if;,3.if 条件句 then 顺序语句; elsif 条件句 then 顺序语句; else 顺序语句; end if;,36,1.if 条件句 then 顺序语句; end if;,注意:没有ELSE的IF语句,属于不完备的IF语句,在综合时一般会生成一个时序电路。,library ieee; use ieee.std_logic_1164.all; entity dff1 is port ( d,clk:in std_logic; q:out std_logic); end dff1; architecture rtl of dff1 is begin,process(clk) begin if clk event and clk=1 then q=d; end if; end process; end rtl;,例:D触发器,37,2.if 条件句 then 顺序语句; else 顺序语句; end if;,注意:有ELSE的IF语句,在综合时一般会生成一个二选一的组合电路。,library ieee; use ieee.std_logic_1164.all; entity mux2 is port ( a,b,sel :in std_logic; c:out std_logic); end mux2; architecture rtl of mux2 is begin,process(a,b,sel) begin if sel=1 then c=a; else c=b; end if; end process; end rtl;,例:2选1数据选择器,38,3.if 条件句 then 顺序语句; elsif 条件句 then 顺序语句; else 顺序语句; end if;,这种多选择控制的IF语句,它设置了多个条件,当满足所设的多个条件之一时,就执行该条件后的顺序语句,并不再判断其它条件,直接结束if语句的执行。当所设置的条件都不满足时,程序执行else和end if之间的顺序语句。 此语句用于有优先级的条件判断,因此各条件式中的条件可以重叠。如果所需判断的条件没有优先级的差别,且条件之间没有重叠的情况,建议使用case语句。,39,例:四选一的数据选择器。,library ieee; use ieee.std_logic_1164.all; entity mux4 is port (input:in std_logic_vector(3 downto 0); sel:in std_logic_vector(1 downto 0); y: out std_logic); end mux4; architecture rtl of mux4 is begin process(sel,input),40,begin if sel=“00” then y=input(0); elsif sel=“01” then y=input(1); elsif sel=“10” then y=input(2); else y=input(3); end if; end process; end rtl;,41,例:用IF语句设计一个38译码器。,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY decode3_8 IS PORT ( a,b,c: IN STD_LOGIC; y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END decode3_8; ARCHITECTURE one OF decode3_8 IS SIGNAL comb: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN comb=c ,42,process(comb) begin if comb=“000” then y=“11111110”; elsif comb=“001” then y=“11111101”; elsif comb=“010” then y=“11111011”; elsif comb=“011” then y=“11110111”; elsif comb=“100” then y=“11101111”; elsif comb=“101” then y=“11011111”; elsif comb=“110” then y=“10111111”; elsif comb=“111” then y=“01111111” ; else y=“11111111”; end if; end process; end one;,43,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY coder IS PORT ( din : IN STD_LOGIC_VECTOR(0 TO 7); output : OUT STD_LOGIC_VECTOR(2 TO 0) ); END coder; ARCHITECTURE behav OF coder IS BEGIN PROCESS (din) BEGIN IF (din(7)=0) THEN output = “000“ ; ELSIF (din(6)=0) THEN output = “001“ ; ELSIF (din(5)=0) THEN output = “010“ ; ELSIF (din(4)=0) THEN output = “011“ ; ELSIF (din(3)=0) THEN output = “100“ ; ELSIF (din(2)=0) THEN output = “101“ ; ELSIF (din(1)=0) THEN output = “110“ ; ELSE output = “111“ ; END IF ; END PROCESS ; END behav;,例:优先编码器描述,44,4.if 条件句 then if 条件句 then end if; end if;,If语句可以嵌套,但层数不宜过多。,45,library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity counter10 is port(en,reset,clk:in std_logic; q:buffer std_logic_vector(3 downto 0); co:out std_logic); end counter10; architecture behav of counter10 is begin process(clk,reset,en) begin if reset=1 then q=“0000“; elsif clkevent and clk=1 then if en=1 then if q“1001“ then q=q+1; else q=“0000“; end if; end if; end if; end process; co=1 when q=“1001“ else 0; end behav;,46,5.4.3 case语句(Case Statements),CASE语句结构: CASE 表达式 IS When 选择值 = 顺序语句; When 选择值 = 顺序语句; . When Others= 顺序语句; END CASE ;,选择值可以有四种不同的表达方式: 单个普通数值,如6。 数值选择范围,如(2 TO 4),表示取值为2、3或4。 并列数值,如35,表示取值为3或者5。 WHEN OTHERS,,CASE语句也只能在进程中使用,当执行到CASE语句时,首先计算CASE和IS之间的表达式的值,然后根据条件语句中与之相对应的选择值来执行相应的顺序语句,最后结束CASE语句。,47,使用CASE 语句需要注意: (1)条件句的取值必须在表达式的取值范围之内; (2)除非所有条件句中的选择值能完整覆盖CASE语句中的所有表达式的取值,否则最后一个条件句中的选择值必须为OTHERS; (3)CASE语句的每一条件句的取值只能出现一次,不能有相同选择值的条件句的出现; (4)CASE语句执行中必须选中且只能选择一个条件句,这表明CASE语句至少要包含一个条件句。,48,例:3-8译码器 library ieee; use ieee.std_logic_1164.all; entity decoder is port(a,b,c,G1,G2A,G2B : in std_logic; y: out std_logic_vector (7 downto 0); end decoder; architecture rtl of decoder is signal indata : std_logic_vector(2 downto 0); begin indata = c process(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论