2.19k likes | 2.42k Views
可编程逻辑器件讲义. 第三讲 VHDL 程序设计. 本讲主要内容. 常用实例及其语法 多路选择器、寄存器、全加器、计数器等 VHDL 基本语法 基本语言要素(信号、变量等)、常用用语句( IF 、 CASE )、进程和并行语句的概念等 VHDL 进阶 类属参数、子程序(函数、过程)、自定义库使用、顺序并行语句( LOOP 、 NEXT 等)、属性描述与定义语句. 1 、常用实例及其语法. 2 选 1 多路选择器. mux21a 实体. mux21a 结构体. 实体描述. 结 构 体 描 述. 1 、常用实例及其语法. 行为描述.
E N D
可编程逻辑器件讲义 第三讲 VHDL程序设计
本讲主要内容 • 常用实例及其语法 多路选择器、寄存器、全加器、计数器等 • VHDL基本语法 基本语言要素(信号、变量等)、常用用语句(IF、CASE)、进程和并行语句的概念等 • VHDL进阶 类属参数、子程序(函数、过程)、自定义库使用、顺序并行语句(LOOP、NEXT等)、属性描述与定义语句
1、常用实例及其语法 • 2选1多路选择器 mux21a实体 mux21a结构体
实体描述 结 构 体 描 述 1、常用实例及其语法 行为描述 • 2选1多路选择器 ENTITY mux21a IS PORT ( a, b:INBIT; s:INBIT; y:OUTBIT); ENDENTITYmux21a; ARCHITECTUREoneOFmux21aIS BEGIN y<= a WHEN s =‘0’ELSE b ; END ARCHITECTURE one ;
1、常用实例及其语法 数据流(RTL)描述 • 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 <= d OR e; END ARCHITECTURE one ;
进程 1、常用实例及其语法 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 ; • 2选1多路选择器 行为描述(含进程) ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT ); END ENTITY mux21a;
1、常用实例及其语法 • 2选1多路选择器 从上面的程序分析得到如下点启示: • VHDL程序构成主要包含两块:实体和结构体 • 一个实体可以采用不同的结构体设计
1、常用实例及其语法 实体定义语句,e_name为实体名,一般英文字母开头,数字结尾,要见名识义,不要与关键字和以定义的元件名重名 • 2选1多路选择器相关语法现象 • 实体表达 ENTITY e_name IS PORT ( p_name : port_m data_type; ... p_name : port_m data_type); END ENTITY e_name; 端口定义语句由PORT引导,p_name为端口名,语法要求和实体名一致。port_m为端口模式,data_type为端口数据类型
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 ; 功能描述语句是必要的,以并行语句、顺序语句或两者的混合形式出现 结构体描述由关键字ARCHITECTURE引导,arch_name为 结构名,语法要求和实体名一致。
1、常用实例及其语法 • 2选1多路选择器相关语法现象 • 赋值符号和数据比较符号 • 信号赋值号:“<=”y<=a 并非立即发生 • “=”没有赋值的含义,只是一种数据比较符号 IFaTHEN... --注意,a的数据类型必须是boolean IF(s1=‘0’)AND(s2=‘1’)OR(c<b+1)THEN ..
1、常用实例及其语法 • 2选1多路选择器相关语法现象 • 逻辑操作符 • AND、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' ELSE b WHEN p2 = '1' ELSE c; 该语句为并行语句, 在结构体中直接使用
1、常用实例及其语法 • 2选1多路选择器相关语法现象 • 进程语句和顺序语句 • 在一个结构体中可以包含任意个进程语句结构,所有的进程语句都是并行语句,而由任一进程PROCESS引导的语句(包含在其中的语句)结构属于顺序语句。 • PROCESS(敏感信号列表) • …(顺序语句) • END PROCESS; 敏感信号列表是指用于激活进程的信号列表 进程自身是并行的,但 进程内部是顺序的
1、常用实例及其语法 • D触发器的VHDL描述 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1IS PORT (CLK :IN STD_LOGIC ; D : IN STD_LOGIC; Q : OUT STD_LOGIC ); END ; 库调用语句,
1、常用实例及其语法 类似于在芯片内部定义一个数据的暂存节点 • D触发器的VHDL描述 ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1: STD_LOGIC; BEGIN PROCESS (CLK,Q1) BEGIN IF CLK'EVENT AND CLK ='1' THEN Q1 <= D; END IF; END PROCESS ; Q <= Q1;--将内部的暂存数据向 端口输出(双横线--是注释符号) END bhv; 检测时钟上升沿
1、常用实例及其语法 • D触发器的相关语法现象 • 设计库和标准程序包 VHDL库可以看成是一种用来存储预先完成的程序包、数据集合体和元件的仓库 • 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。两个程序包在综合和编译译过程中是自动被包含进去的(不用专门的库调用语句,自动打开) • WORK库:是用户的VHDL设计现行工作库,用于存放用户设计和定义的一些设计单元和程序包。VHDL综合器将保存设计的目录文件夹默认为WORK库 • VITAL库:用于门级时序仿真,但一般并不需要
1、常用实例及其语法 • D触发器的相关语法现象 • 设计库和标准程序包 • 使用库和程序包的一般定义表式是: LIBRARY <设计库名>; USE <设计库名>.<程序包名>.ALL; LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL;
1、常用实例及其语法 调用该数据类型要不要事先打开STD库? • D触发器的相关语法现象 • 标准逻辑位数据类型STD_LOGIC BIT数据类型定义在STD库的STANDARD程序包中: TYPE BIT IS('0','1'); 有些状态仿真时才有用 STD_LOGIC数据类型在IEEE库std_logic_1164程序包中定义: TYPE STD_LOGIC IS ('U','X','0','1','Z','W','L','H','-'); 注意事先打开IEEE库
1、常用实例及其语法 • D触发器的相关语法现象 • 信号定义和数据对象 “SIGNAL Q1:STD_LOGIC;” 信号定义在结构体的说明部分,在整个结构体有效,往往是作为进程之间信息通信的一种手段,信号的赋值存在一个延时δ (<=) 输入输出端口理解为可见信号 其他数据对象:常量、变量 变量往往定义在进程,子程序的说明部分,是局部量,变量的赋值是立即的 (:=)
1、常用实例及其语法 • D触发器的相关语法现象 • 上升沿检测表式和信号属性函数EVENT “CLK'EVENT AND CLK='1'” <信号名>'EVENT 下降沿的检测?
1、常用实例及其语法 CLK语句是电路引入时序环节的关键? • D触发器的相关语法现象 • 不完整条件语句与时序电路 ENTITYCOMP_BADIS PORT( a1,b1 : IN BIT; q1 : OUT BIT); END; ARCHITECTURE one OF COMP_BAD IS BEGIN
1、常用实例及其语法 • D触发器的相关语法现象 • 不完整条件语句与时序电路 PROCESS (a1,b1) 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触发器的相关语法现象 • 不完整条件语句与时序电路 … IFa1>b1THEN q1<='1'; ELSE q1<= '0'; END IF; …
1、常用实例及其语法 • D触发器的相关语法现象 • 时钟触发方式(边沿、电平)的VHDL表述 边沿触发: 考虑到CLK的数据类型std_logic为9种取值 … PROCESS (CLK) BEGIN IF CLK'EVENT AND (CLK='1') AND (CLK'LAST VALUE='0') THEN Q <= D; --确保CLK的变化是一次上升沿的跳变 END IF; END PROCESS ;
1、常用实例及其语法 • D触发器的相关语法现象 • 时钟触发方式(边沿、电平)的VHDL表述 边沿触发: 注意进程的敏感信号 ... PROCESS (CLK) BEGIN IF CLK=‘1‘ AND CLK’LAST_VALUE = ’0‘ --同上例 THEN Q <= D; END IF; END PROCESS ;
1、常用实例及其语法 • D触发器的相关语法现象 • 时钟触发方式(边沿、电平)的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() CLK’EVENT AND CLK=‘0’
1、常用实例及其语法 • D触发器的相关语法现象 • 时钟触发方式(边沿、电平)的VHDL表述 边沿触发: 进程可以没有敏感信号列表 … PROCESS BEGIN Wait until CLK = '1'; --利用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触发器的相关语法现象 • 时钟触发方式(边沿、电平)的VHDL表述 电平触发: … PROCESS (CLK,D) BEGIN IF CLK = '1‘ --电平触发型寄存器 THEN Q <= D; END IF; END PROCESS ; 敏感信号列表不只CLK 信号
1、常用实例及其语法 • D触发器的相关语法现象 • 时钟触发方式(边沿、电平)的VHDL表述 电平触发: 电平(高电平)触发方式的工作时序
1、常用实例及其语法 异步时序电路可由多 个进程来实现,每个 进程的激活时钟不为 同一个 • D触发器的相关语法现象 • 异步时序电路设计 何为异步? 不同时序部分时钟信号不 为同一个
1、常用实例及其语法 注意到两进程的时 钟敏感信号不一样 • D触发器的相关语法现象 • 异步时序电路设计 … ARCHITECTURE bhv OF MULTI_DFF IS SIGNAL Q1,Q2 : STD_LOGIC; BEGIN PRO1: PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK='1' THEN Q1 <= NOT (Q2 OR A); END IF; END PROCESS; PRO2: PROCESS (Q1) BEGIN IF Q1'EVENT AND Q1='1' THEN Q2 <= D; END IF; END PROCESS; QQ <=Q2; …
1、常用实例及其语法 • 1位二进制全加器的VHDL描述 通过该实例,主要掌握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方法来描述半加器 方法一:数据流(布尔方程) 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位二进制全加器的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 <= a & b; --a相并b,即a与b并置操作 PROCESS(abc) BEGIN CASE abc IS --类似于真值表的CASE语句 WHEN "00“ => so<='0'; co<='0'; WHEN "01“ => so<='1'; co<='0'; WHEN "10“ => so<='1'; co<='0'; WHEN "11“ => so<='0'; co<='1‘ ; WHEN OTHERS => NULL ; END CASE; END PROCESS; END ARCHITECTURE fh1 ; 两种方法描述的的半加器 选择其中一种即可
1、常用实例及其语法 • 1位二进制全加器的VHDL描述 • 全加器使用到的或门描述 LIBRARYIEEE;--或门逻辑描述 USEIEEE.STD_LOGIC_1164.ALL; ENTITYor2aIS PORT(a,b:INSTD_LOGIC; c: OUTSTD_LOGIC); ENDENTITYor2a; ARCHITECTURE oneOFor2aIS BEGIN c<= a OR b; END ARCHITECTURE one ;
1、常用实例及其语法 • 1位二进制全加器的VHDL描述 底层的半加器和或门用VHDL语言描述完成,做成封装。顶 层按上图完成原理图设计,即为前面所介绍的混合设计法。 但现在,我们将采用顶层VHDL语言描述法。
1、常用实例及其语法 • 1位二进制全加器的VHDL描述 LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITYf_adderIS PORT (ain,bin,cin: INSTD_LOGIC; cout,sum:OUTSTD_LOGIC); ENDENTITYf_adder; ARCHITECTUREfd1OFf_adderIS COMPONENTh_adder–在结构体说明部分声明元件 PORT(a,b:INSTD_LOGIC; co,so :OUT STD_LOGIC); ENDCOMPONENT;
1、常用实例及其语法 • 1位二进制全加器的VHDL描述 COMPONENTor2a--声明被调用的或门元件 PORT(a,b : IN STD_LOGIC; c:OUTSTD_LOGIC); ENDCOMPONENT; SIGNALd,e,f:STD_LOGIC; --定义3个信号作为内部的连接线。 BEGIN--例化元件 u1 : h_adder PORT MAP(a=>ain,b=>bin,co=>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” “WHEN OTHERS”不可少 和IF语句一样,CASE语句也是顺序语句。