1、可编程逻辑器件讲义,第三讲 VHDL程序设计,本讲主要内容,常用实例及其语法 多路选择器、寄存器、全加器、计数器等 VHDL基本语法 基本语言要素(信号、变量等)、常用用语句(IF、CASE)、进程和并行语句的概念等 VHDL进阶 类属参数、子程序(函数、过程)、自定义库使用、顺序并行语句(LOOP、NEXT等)、属性描述与定义语句,1、常用实例及其语法,2选1多路选择器,mux21a实体,mux21a结构体,1、常用实例及其语法,2选1多路选择器,ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT;y : OUT BIT); END ENTIT
2、Y mux21a; ARCHITECTURE one OF mux21a IS BEGIN y = a WHEN s =0 ELSE b ; END ARCHITECTURE one ;,行为描述,1、常用实例及其语法,2选1多路选择器,ENTITY mux21a IS PORT ( a, b : IN BIT;s : IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; -定义中间节点信号 BEGIN d = a AND (NOT S); e = b AND s; y
3、 = d OR e; END ARCHITECTURE one ;,数据流(RTL)描述,1、常用实例及其语法,2选1多路选择器,ENTITY mux21a IS PORT ( a, b, s: IN BIT;y : OUT BIT ); END ENTITY mux21a;,ARCHITECTURE one OF mux21a IS BEGIN PROCESS (a,b,s) BEGIN IF s = 0 THEN y = a;ELSE y= b; END IF; END PROCESS; END ARCHITECTURE one ;,行为描述(含进程),1、常用实例及其语法,2选1多路选择
4、器 从上面的程序分析得到如下点启示:VHDL程序构成主要包含两块:实体和结构体一个实体可以采用不同的结构体设计,1、常用实例及其语法,2选1多路选择器相关语法现象 实体表达,ENTITY e_name IS PORT ( p_name : port_m data_type;.p_name : port_m data_type); END ENTITY e_name;,实体定义语句,e_name为实体名,一般英文字母开头,数字结尾,要见名识义,不要与关键字和以定义的元件名重名,端口定义语句由PORT引导,p_name为端口名,语法要求和实体名一致。port_m为端口模式,data_type为端口
5、数据类型,1、常用实例及其语法,2选1多路选择器相关语法现象 端口模式 IN 输入端口,定义的通道为单向只读模式 OUT 输出端口,定义的通道为单向输出模式 INOUT 定义的通道确定为输入输出双向端口 BUFFER 缓冲端口,其功能与INOUT类似 数据类型 INTEGER、BOOLEAN、BIT、STD_LOGIC; 0或1解释为BIT,无引号解释为INTEGER;,1、常用实例及其语法,2选1多路选择器相关语法现象 结构体表达,ARCHITECTURE arch_name OF e_name IS 说明语句 BEGIN(功能描述语句) END ARCHITECTURE arch_name
6、 ;,结构体描述由关键字ARCHITECTURE引导,arch_name为 结构名,语法要求和实体名一致。,说明语句用于定义数据对象、数据类型和元件调用声明等,并非必要,功能描述语句是必要的,以并行语句、顺序语句或两者的混合形式出现,1、常用实例及其语法,2选1多路选择器相关语法现象 赋值符号和数据比较符号 信号赋值号:“=” y=a 并非立即发生 “=”没有赋值的含义,只是一种数据比较符号,IF a THEN . -注意,a的数据类型必须是booleanIF (s1=0) AND (s2=1) OR (cb+1) THEN ,1、常用实例及其语法,2选1多路选择器相关语法现象 逻辑操作符 A
7、ND、OR、NOT、NAND、NOR、XOR、XNOR条件语句 IF _ THEN _ ELSE 支持嵌套 IF语句必须以语句 “END IF;”结束 此语句为顺序执行语句,常在进程中使用,顺序语句和并行语句(模块)的区别?,1、常用实例及其语法,2选1多路选择器相关语法现象 WHEN_ELSE条件信号赋值语句,赋值目标 = 表达式 WHEN 赋值条件 ELSE表达式 WHEN 赋值条件 ELSE.表达式 ;,Z = a WHEN p1 = 1 ELSEb WHEN p2 = 1 ELSEc;,该语句为并行语句, 在结构体中直接使用,1、常用实例及其语法,2选1多路选择器相关语法现象 进程语句
8、和顺序语句,在一个结构体中可以包含任意个进程语句结构,所有的进程语句都是并行语句,而由任一进程PROCESS引导的语句(包含在其中的语句)结构属于顺序语句。 PROCESS(敏感信号列表) (顺序语句) END PROCESS;,进程自身是并行的,但 进程内部是顺序的,敏感信号列表是指用于激活进程的信号列表,1、常用实例及其语法,D触发器的VHDL描述,LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ;D : IN STD_LOGIC;Q : OUT STD_LOGIC )
9、; END ;,库调用语句,1、常用实例及其语法,D触发器的VHDL描述,ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1: STD_LOGIC; BEGIN PROCESS (CLK,Q1) BEGIN IF CLKEVENT AND CLK =1 THEN Q1 = D; END IF; END PROCESS ; Q = Q1;-将内部的暂存数据向端口输出(双横线-是注释符号) END bhv;,类似于在芯片内部定义一个数据的暂存节点,检测时钟上升沿,1、常用实例及其语法,D触发器的相关语法现象 设计库和标准程序包 VHDL库可以看成是一种用来存储预先完成的程序
10、包、数据集合体和元件的仓库 VHDL语言库的种类: 资源库:常规元件和标准模块存放的库(IEEE,STD) 设计库:用户库WORK,1、常用实例及其语法,D触发器的相关语法现象 设计库和标准程序包 IEEE库:包含有IEEE标准的程序包和其他一些支持工业标准的程序包。 IEEE库中常用的四个程序包: STD_LOGIC_1164 STD_LOGIC_ARITH STD_LOGIC_SIGNED STD_LOGIC_UNSIGED,1、常用实例及其语法,D触发器的相关语法现象 设计库和标准程序包 STD库:定义了两个标准程序包STANDARD和TEXTIO。两个程序包在综合和编译译过程中是自动被
11、包含进去的(不用专门的库调用语句,自动打开) WORK库:是用户的VHDL设计现行工作库,用于存放用户设计和定义的一些设计单元和程序包。VHDL综合器将保存设计的目录文件夹默认为WORK库 VITAL库:用于门级时序仿真,但一般并不需要,1、常用实例及其语法,D触发器的相关语法现象 设计库和标准程序包 使用库和程序包的一般定义表式是: LIBRARY ; USE ALL;LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL;,1、常用实例及其语法,D触发器的相关语法现象 标准逻辑位数据类型STD_LOGIC,STD_LOGIC数据类型在IEEE库std_logi
12、c_1164程序包中定义: TYPE STD_LOGIC IS (U,X,0,1,Z,W,L,H,-);,BIT数据类型定义在STD库的STANDARD程序包中: TYPE BIT IS(0,1);,调用该数据类型要不要事先打开STD库?,有些状态仿真时才有用,注意事先打开IEEE库,1、常用实例及其语法,D触发器的相关语法现象 信号定义和数据对象 “SIGNAL Q1:STD_LOGIC;” 信号定义在结构体的说明部分,在整个结构体有效,往往是作为进程之间信息通信的一种手段,信号的赋值存在一个延时 (=)输入输出端口理解为可见信号 其他数据对象:常量、变量 变量往往定义在进程,子程序的说明部
13、分,是局部量,变量的赋值是立即的 (:=),1、常用实例及其语法,D触发器的相关语法现象 上升沿检测表式和信号属性函数EVENT“CLKEVENT AND CLK=1”EVENT下降沿的检测?,1、常用实例及其语法,D触发器的相关语法现象 不完整条件语句与时序电路,ENTITY COMP_BAD IS PORT( a1,b1 : IN BIT;q1 : OUT BIT); END; ARCHITECTURE one OF COMP_BAD IS BEGIN,CLK语句是电路引入时序环节的关键?,1、常用实例及其语法,D触发器的相关语法现象 不完整条件语句与时序电路,PROCESS (a1,b1
14、) BEGIN IF a1 b1 THEN q1 = 1; ELSIF a1 b1 THEN q1 = 0; -未提及当a1=b1时,q1作何操作 END IF; END PROCESS ; END ;,1、常用实例及其语法,D触发器的相关语法现象 不完整条件语句与时序电路,不完整条件语句是构成时序电路的关键,1、常用实例及其语法,D触发器的相关语法现象 不完整条件语句与时序电路, IF a1 b1 THEN q1 = 1; ELSE q1 = 0; END IF; ,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 边沿触发:, PROCESS (CLK
15、) BEGIN IF CLKEVENT AND (CLK=1) AND (CLKLAST VALUE=0) THEN Q = D; -确保CLK的变化是一次上升沿的跳变 END IF; END PROCESS ;,考虑到CLK的数据类型std_logic为9种取值,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 边沿触发:,. PROCESS (CLK) BEGIN IF CLK=1 AND CLKLAST_VALUE = 0 -同上例 THEN Q = D; END IF; END PROCESS ;,注意进程的敏感信号,1、常用实例及其语法,D触发器
16、的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 边沿触发:,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; PROCESS (CLK) BEGIN IF rising_edge(CLK) -必须打开STD_LOGIC_1164程序包 THEN Q1 = D; END IF; END PROCESS; ,下降沿:falling_edge() CLKEVENT AND CLK=0,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 边沿触发:, PROCESS BEGIN Wait until CLK = 1; -
17、利用wait语句 Q = D ; END PROCESS;,进程可以没有敏感信号列表,下降沿如何表述?,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 边沿触发:, PROCESS (CLK) BEGIN IF CLK = 1 THEN Q = D ; -利用进程的启动特性产生对CLK的边沿检测 END IF; END PROCESS ;,注意敏感信号列表,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 边沿触发:,边沿(上升沿)触发方式的工作时序,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、
18、电平)的VHDL表述 电平触发:, PROCESS (CLK,D) BEGIN IF CLK = 1 -电平触发型寄存器 THEN Q = D; END IF; END PROCESS ;,敏感信号列表不只CLK 信号,1、常用实例及其语法,D触发器的相关语法现象 时钟触发方式(边沿、电平)的VHDL表述 电平触发:,电平(高电平)触发方式的工作时序,1、常用实例及其语法,D触发器的相关语法现象 异步时序电路设计,何为异步? 不同时序部分时钟信号不 为同一个,异步时序电路可由多 个进程来实现,每个 进程的激活时钟不为 同一个,1、常用实例及其语法,D触发器的相关语法现象 异步时序电路设计, A
19、RCHITECTURE bhv OF MULTI_DFF IS SIGNAL Q1,Q2 : STD_LOGIC; BEGIN PRO1: PROCESS (CLK) BEGIN IF CLKEVENT AND CLK=1 THEN Q1 = NOT (Q2 OR A); END IF; END PROCESS;,PRO2: PROCESS (Q1) BEGIN IF Q1EVENT AND Q1=1 THEN Q2 = D; END IF; END PROCESS; QQ =Q2; ,注意到两进程的时 钟敏感信号不一样,1、常用实例及其语法,1位二进制全加器的VHDL描述通过该实例,主要掌握
20、VHDL语言的层次化设计方法。整个设计的顶层和底层都将采用VHDL语言描述。,1、常用实例及其语法,1位二进制全加器的VHDL描述,ain和bin为1位加数和被 加法,cin为进位输入, sum为1位求和结果,cout 为进位输出,1位全加器可以由两个半加器构成,1、常用实例及其语法,1位二进制全加器的VHDL描述,半加器可以由原理图实现,也可以由VHDL设计完成,1、常用实例及其语法,1位二进制全加器的VHDL描述 采用两种VHDL方法来描述半加器 方法一:数据流(布尔方程),1、常用实例及其语法,1位二进制全加器的VHDL描述 采用两种VHDL方法来描述半加器 方法一:数据流(布尔方程),
21、LIBRARY IEEE; USE IEEE.STD_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 BEGIN so = NOT(a XOR (NOT b); co = a AND b; END ARCHITECTURE fh1;,1、常用实例及其语法,1位二进制全加器的VHDL描述 采用两种VHDL方法来描述半加器 方法二:行为描述(真值表),1、常用实例及其语法,1位
22、二进制全加器的VHDL描述 采用两种VHDL方法来描述半加器 方法二:行为描述(真值表),LIBRARY IEEE; USE IEEE.STD_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) ;,1、常用实例及其语法,BEGIN abc so so so so NULL ; END CASE
23、; END PROCESS; END ARCHITECTURE fh1 ;,两种方法描述的的半加器 选择其中一种即可,1、常用实例及其语法,1位二进制全加器的VHDL描述 全加器使用到的或门描述,LIBRARY IEEE; -或门逻辑描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2a IS PORT (a, b : IN STD_LOGIC;c : OUT STD_LOGIC); END ENTITY or2a; ARCHITECTURE one OF or2a IS BEGIN c = a OR b; END ARCHITECTURE one ;,1、常用
24、实例及其语法,1位二进制全加器的VHDL描述,底层的半加器和或门用VHDL语言描述完成,做成封装。顶 层按上图完成原理图设计,即为前面所介绍的混合设计法。 但现在,我们将采用顶层VHDL语言描述法。,1、常用实例及其语法,1位二进制全加器的VHDL描述,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 ENTITY f_adder;,ARCHITECTURE fd1 OF f_adder IS C
25、OMPONENT h_adder 在结构体说明部分声明元件 PORT ( a,b : IN STD_LOGIC;co,so : OUT STD_LOGIC); END COMPONENT;,1、常用实例及其语法,1位二进制全加器的VHDL描述,COMPONENT or2a -声明被调用的或门元件 PORT (a,b : IN STD_LOGIC;c : OUT STD_LOGIC); END COMPONENT; SIGNAL d,e,f : STD_LOGIC; -定义3个信号作为内部的连接线。 BEGIN -例化元件 u1 : h_adder PORT MAP(a=ain,b=bin,co
26、=d,so=e); u2 : h_adder PORT MAP(a=e, b=cin, co=f,so=sum); u3 : or2a PORT MAP(a=d, b=f, c=cout); END ARCHITECTURE fd1;,例化元件的同时,通过中 间信号节点完成电气连接,注意顶层和底层的VHDL文件应在同一设计目录中,1、常用实例及其语法,全加器的VHDL描述的相关语法 CASE语句(多条件分支语句),CASE IS When = ; . ; ; When = ; . ; ; . WHEN OTHERS = ; END CASE ;,给出表达式可能的取值,“=”相当于“THEN”,
27、“WHEN OTHERS”不可少,和IF语句一样,CASE语句也是顺序语句。,1、常用实例及其语法,全加器的VHDL描述的相关语法 标准逻辑矢量数据类型STD_LOGIC_VECTOR 定义在STD_LOGIC_1164程序包中 使用时必须注明数据宽度 B : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0); SIGNAL A:STD_LOGIC_VECTOR(1 TO 4) 赋值采用双引号“”,另注意数据位位置的对应 B = “01100010”; -B(7)为0 B(4 DOWNTO 1) = “1101“; - B(4)为1 B(7 DOWNTO 4)= A; - B
28、(6)等于A(2),1、常用实例及其语法,全加器的VHDL描述的相关语法 并置操作符 (注意不是与运算符 AND) 并置操作是一种数据位的扩展 并置操作运用于其它运算中时,要注意并置后的数据位宽度,SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0); . a = 1 - 元素与元素并置,并置后的数组长度为4 . IF a &d = “101011“ THEN . - 在IF条件句中可以使用并置符,1、常用实例及其语法,全加器的VHDL描述的相关语法 元件声明和例化语句 元件声明语句
29、用在结构体的说明部分 COMPONENT 元件名 ISPORT (端口名表) ; END COMPONENT 文件名;,只需将被调用元件实体说 明的关键字ENTITY换成 COMPONENT即可,COMPONENT h_adder PORT ( a,b : IN STD_LOGIC;co,so : OUT STD_LOGIC); END COMPONENT;,1、常用实例及其语法,全加器的VHDL描述的相关语法 元件声明和例化语句 元件例化语句用在结构体的设计部分 例化名 : 元件名 PORT MAP( 端口名 = 连接端口名,.);,u1 : h_adder PORT MAP(a=ain,b
30、=bin,co=d,so=e);,如果缺省端口名,则按位置映射,1、常用实例及其语法,计数器的VHDL描述 用VHDL语言描述1四位二进制加法计数器,ENTITY CNT4 IS PORT ( CLK : IN BIT;Q : BUFFER INTEGER RANGE 15 DOWNTO 0 ); END;,BUFFER具有双向端口INOUT的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号再反馈回来,并不含有IN的功能。,整数类型会根据数据的范围综合得到信号的数据宽度,1、常用实例及其语法,计数器的VHDL描述 用VHDL语言描述1四位二进制加法计数器,ARCHITECTURE b
31、hv OF CNT4 IS BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN Q = Q + 1; END IF; END PROCESS; END bhv;,非完整条件语句?,Q = Q + 1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q + 1,需等待下一个时钟周期。,1、常用实例及其语法,计数器的VHDL描述 整数类型 INTEGER,Q : BUFFER INTEGER RANGE 15 DOWNTO 0;,1 十进制整数 0 十进制整数 35 十进制
32、整数 10E3 十进制整数,等于十进制整数1000 16#D9# 十六进制整数,等于十六进制整数D9H 8#720# 八进制整数,等于八进制整数720O 2#11010010# 二进制整数,等于二进制整数11010010B,其它数据类型:NATURAL、 POSITIVE;它们都包含在 STD库,编译综合时默认 被打开。,1、常用实例及其语法,计数器的VHDL描述 四位二进制计数器设计的其他VHDL表述方法,LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT4 IS PO
33、RT ( CLK : IN STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); END;,UNSIGNED程序包的引入是为了“+”功能重载;,1、常用实例及其语法,计数器的VHDL描述 四位二进制计数器设计的其他VHDL表述方法,ARCHITECTURE bhv OF CNT4 IS SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN Q1 = Q1 +1;-重载后支持不同数据类型的运算 END IF; END
34、 PROCESS ; Q = Q1 ; END bhv;,不对端口信号进行直接操作,而是引入中间信号;,1、常用实例及其语法,计数器的VHDL描述 四位二进制计数器设计的其他VHDL表述方法,4位加法计数器RTL电路,1、常用实例及其语法,计数器的VHDL描述 四位二进制计数器设计的其他VHDL表述方法,4位二进制加法计数器工作时序,1、常用实例及其语法,一般加法计数器设计 带异步复位和同步使能的模10加法计数器,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; -该程序包为了功能重载 ENT
35、ITY CNT10 IS PORT (CLK,RST,EN : IN STD_LOGIC;-包括使能和复位信号定义 CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT :OUT STD_LOGIC); -加法进位输出位的定义 END CNT10;,1、常用实例及其语法,一般加法计数器设计 带异步复位和同步使能的模10加法计数器,ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK, RST, EN) VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);-变量定义只在该进程中作用,
36、为中间暂存量; BEGIN IF RST = 1 THEN -RST的作用与CLK无关 CQI := (OTHERS =0); -计数器异步复位,注意变量的赋值号“:=”;等价:CQI:=“0000” ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿,1、常用实例及其语法,一般加法计数器设计 带异步复位和同步使能的模10加法计数器,IF EN = 1 THEN -检测是否允许计数(同步使能) IF CQI 0); -大于9,计数值清零 END IF; END IF;END IF; IF CQI = 9 THEN COUT = 1; -计数大于9,输出进位信号 ELS
37、E COUT = 0; END IF;CQ = CQI; -将计数值向端口输出,注意在进程内部 END PROCESS; END behav;,1、常用实例及其语法,一般加法计数器设计 相关语法说明 变量 VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0) 变量是局部量,一般在进程(子程序)中使用。变量赋值号为“:=”,赋值操作是立即的。,1、常用实例及其语法,一般加法计数器设计 相关语法说明 省略赋值操作符(OTHERS=X) 省略操作符可以方便相同数据的快速输入,SIGNAL d1 : STD_LOGIC_VECTOR(4 DOWNTO 0); VARI
38、ABLE a1 : STD_LOGIC_VECTOR(15 DOWNTO 0); . d1 0);-等价 d10); -等价 a1e(3),3=e(5), OTHERS=e(1); d1 = e(1) ,两种操作是等价的,但前者要优于后者,1、常用实例及其语法,一般加法计数器设计,工作时序,1、常用实例及其语法,含并行置位的移位寄存器设计 含并行置位的8位并入串出移位寄存器设计,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY SHFRT IS PORT ( CLK,LOAD : IN STD_LOGIC; DIN : IN STD_LOGIC
39、_VECTOR(7 DOWNTO 0); QB : OUT STD_LOGIC ); END SHFRT; ARCHITECTURE behav OF SHFRT IS BEGIN,1、常用实例及其语法,含并行置位的移位寄存器设计 含并行置位的8位并入串出移位寄存器设计,PROCESS (CLK, LOAD) VARIABLE REG8 : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF CLKEVENT AND CLK = 1 THEN IF LOAD = 1 THEN REG8 := DIN; -由(LOAD=1)同步装载新数据 ELSE REG8(6 DOW
40、NTO 0) := REG8(7 DOWNTO 1); END IF; END IF; QB = REG8(0); - 串行输出最低位 END PROCESS; END behav;,8个时钟周期后,寄存器内 容是什么?,1、常用实例及其语法,含并行置位的移位寄存器设计 含并行置位的8位并入串出移位寄存器设计,工作时序 :注意数据的移位变化,1、常用实例及其语法,思考题 减法、及双向计数器怎么设计? 串入并出移位寄存器如何设计? 练习题 P93 4-4、4-6,本讲主要内容,常用实例及其语法 多路选择器、寄存器、全加器、计数器等 VHDL基本语法 基本语言要素(信号、变量等)、常用用语句(IF
41、、CASE)、进程和并行语句的概念等,2、VHDL基本语法,数据对象(常量、变量、信号) 常数 常量的定义和设置主要是为了程序易读和修改 常数定义的一般表述:,CONSTANT 常数名:数据类型 := 表达式 ;,CONSTANT FBT : STD_LOGIC_VECTOR := “010110“ ; - 标准位矢类型 CONSTANT DATAIN : INTEGER := 15 ; - 整数类型,2、VHDL基本语法,数据对象(常量、变量、信号) 变量 是一个局部量,在进程和子程序中使用 变量不能把信息带出对它做出定义的当前结构 变量赋值是立即发生的,不存在延时行为 主要作用是在进程中作
42、为临时的数据存储单元 定义变量的一般表述如下: VARIABLE 变量名 : 数据类型 := 初始值;,2、VHDL基本语法,数据对象(常量、变量、信号) 变量,VARIABLE a : INTEGER RANGE 0 TO 15 ; -变量a定义为变量,取值范围是0到15 VARIABLE d : STD_LOGIC := 1 ; -变量a定义为标准逻辑位数据类型, 初始值是1,变量赋值的一般表述如下: 目标变量名 := 表达式;,2、VHDL基本语法,数据对象(常量、变量、信号) 信号 类似于硬件内部的连接线(节点信号) 常作为并行语句模块(进程)间信息交流通道 除了无方向说明外,信号与实
43、体的端口(Port)概念是一致的 信号是全局量,定义和使用范围是实体、结构体和程序包,不能在进程和子程序中定义信号,2、VHDL基本语法,数据对象(常量、变量、信号) 信号 定义格式: SIGNAL 信号名: 数据类型 := 初始值 ;赋值格式: 目标信号名 = 表达式 AFTER 时间量;,SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);,信号的赋值是存在延时的,即使零延时,也 存在一个“”延时。这与器件的传输延时是吻合的,2、VHDL基本语法,数据对象(常量、变量、信号) 信号 进程(顺序语句)中可以允许一个信号有多个驱动源,SIGNAL a,b,c,y,
44、z: INTEGER; . PROCESS (a,b,c) BEGIN y=a+b;z=ca;y=b; END PROCESS ;,y=?,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值 两者有时设计效果类似,有时则相差很大 用D触发器设计,演示信号与变量两种不同的描述,但设计效果一样的情况,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值, ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS (CLK) VARIABLE QQ :
45、STD_LOGIC; BEGIN IF CLKEVENT AND CLK = 1 THEN QQ := D1; END IF; Q1 = QQ; END PROCESS; END ;,采用变量描述,变 量定义在进程中,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值, ARCHITECTURE bhv OF DFF3 IS SIGNAL QQ : STD_LOGIC; BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN QQ = D1; END IF; END PROCESS; Q1 = QQ; END ;,采
46、用信号描述,信 号定义在结构体中,信号与变量定义位 置和作用范围都不 一样,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值 下面的举例,将反映出信号与变量赋值不同的设计效果,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值, ARCHITECTURE bhv OF DFF3 IS SIGNAL A,B : STD_LOGIC; BEGIN PROCESS (CLK) BEGIN IF CLKEVENT AND CLK = 1 THEN A = D1; B = A; Q1 = B; END IF; END PROCESS; END;,本例反映
47、了信号的赋值 与变量的不同之处,信 号的赋值要延时, “执 行赋值” 和“完成赋值” 是两个不同的过程。此 例也反映出信号类似于 硬件连线(节点)的作用,两“A”和两“B”都差一个时间,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值, ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS (CLK) VARIABLE A,B : STD_LOGIC; BEGIN IF CLKEVENT AND CLK = 1 THEN A := D1; B := A; Q1 = B; END IF; END PROCESS; END;,变量的赋值是立即
48、的 ,信号是在进程结束 赋值的,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值, SIGNAL in1,in2,. : STD_LOGIC ; SIGNAL e1 : STD_LOGIC_VECTOR(3 DOWNTO 0); . PROCESS(in1,in2, . . .) VARIABLE c1, : STD_LOGIC_VECTOR(3 DOWNTO 0);,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值,BEGIN IF in1 = 1 THEN . - 第 1 行 e1 = “1010” ; - 第 2 行 . IF in2
49、= 0 THEN . . . - 第 15+n 行 . c1 := “0011”; - 第 30+m 行 . END IF; END PROCESS;,c1的赋值先于e1,信号的赋值要在延时后完成,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值 通过1个四选一的多路选择器来分析信号与变量赋值的不同之处,此例说明有些情况下只能用采用变量作为中间量。,2、VHDL基本语法,数据对象(常量、变量、信号) 进程中的信号与变量赋值,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux4 IS PORT (i0, i1, i2, i3,a, b : IN STD_LOGIC;q : OUT STD_LOGIC); END mux4; ARCHITECTURE body_mux4 OF mux4 IS signal muxval : integer range 7 downto 0; BEGIN process(i0,i1,i2,i3,a,b),