可编程逻辑器件讲义
This presentation is the property of its rightful owner.
Sponsored Links
1 / 218

可编程逻辑器件讲义 PowerPoint PPT Presentation


  • 128 Views
  • Uploaded on
  • Presentation posted in: General

可编程逻辑器件讲义. 第三讲  VHDL 程序设计. 本讲主要内容. 常用实例及其语法 多路选择器、寄存器、全加器、计数器等 VHDL 基本语法 基本语言要素(信号、变量等)、常用用语句( IF 、 CASE )、进程和并行语句的概念等 VHDL 进阶 类属参数、子程序(函数、过程)、自定义库使用、顺序并行语句( LOOP 、 NEXT 等)、属性描述与定义语句. 1 、常用实例及其语法. 2 选 1 多路选择器. mux21a 实体. mux21a 结构体. 实体描述. 结 构 体 描 述. 1 、常用实例及其语法. 行为描述.

Download Presentation

可编程逻辑器件讲义

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


5736069

可编程逻辑器件讲义

第三讲 VHDL程序设计


5736069

本讲主要内容

  • 常用实例及其语法

    多路选择器、寄存器、全加器、计数器等

  • VHDL基本语法

    基本语言要素(信号、变量等)、常用用语句(IF、CASE)、进程和并行语句的概念等

  • VHDL进阶

    类属参数、子程序(函数、过程)、自定义库使用、顺序并行语句(LOOP、NEXT等)、属性描述与定义语句


5736069

1、常用实例及其语法

  • 2选1多路选择器

mux21a实体

mux21a结构体


5736069

实体描述

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 ARCHITECTUREone ;


5736069

1、常用实例及其语法

数据流(RTL)描述

  • 2选1多路选择器

ENTITY mux21a IS

PORT ( a, b : INBIT;

s : INBIT;

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 ORe;

END ARCHITECTURE one ;


5736069

进程

1、常用实例及其语法

ARCHITECTUREone OF

mux21a IS

BEGIN

PROCESS (a,b,s)

BEGIN

IF s= '0'THEN

y <=a;

ELSE

y<=b;

END IF;

ENDPROCESS;

END ARCHITECTURE one ;

  • 2选1多路选择器

行为描述(含进程)

ENTITY mux21a IS

PORT ( a,b, s:IN BIT;

y : OUT BIT);

END ENTITY mux21a;


5736069

1、常用实例及其语法

  • 2选1多路选择器

    从上面的程序分析得到如下点启示:

    • VHDL程序构成主要包含两块:实体和结构体

    • 一个实体可以采用不同的结构体设计


5736069

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为端口数据类型


5736069

1、常用实例及其语法

  • 2选1多路选择器相关语法现象

    • 端口模式

      • IN输入端口,定义的通道为单向只读模式

      • OUT输出端口,定义的通道为单向输出模式

      • INOUT定义的通道确定为输入输出双向端口

      • BUFFER缓冲端口,其功能与INOUT类似

    • 数据类型

      • INTEGER、BOOLEAN、BIT、STD_LOGIC;

      • ‘0’或‘1’解释为BIT,无引号解释为INTEGER;


5736069

1、常用实例及其语法

说明语句用于定义数据对象、数据类型和元件调用声明等,并非必要

  • 2选1多路选择器相关语法现象

    • 结构体表达

ARCHITECTURE arch_name OF e_name IS

[说明语句]

BEGIN

(功能描述语句)

END ARCHITECTURE arch_name ;

功能描述语句是必要的,以并行语句、顺序语句或两者的混合形式出现

结构体描述由关键字ARCHITECTURE引导,arch_name为

结构名,语法要求和实体名一致。


5736069

1、常用实例及其语法

  • 2选1多路选择器相关语法现象

    • 赋值符号和数据比较符号

      • 信号赋值号:“<=”y<=a 并非立即发生

      • “=”没有赋值的含义,只是一种数据比较符号

IFaTHEN...--注意,a的数据类型必须是boolean

IF(s1=‘0’)AND(s2=‘1’)OR(c<b+1)THEN..


5736069

1、常用实例及其语法

  • 2选1多路选择器相关语法现象

    • 逻辑操作符

      • AND、OR、NOT、NAND、NOR、XOR、XNOR

    • 条件语句

      • IF _ THEN _ ELSE… 支持嵌套

      • IF语句必须以语句 “END IF;”结束

      • 此语句为顺序执行语句,常在进程中使用

顺序语句和并行语句(模块)的区别?


5736069

1、常用实例及其语法

  • 2选1多路选择器相关语法现象

    • WHEN_ELSE条件信号赋值语句

赋值目标 <= 表达式 WHEN 赋值条件 ELSE

        表达式WHEN 赋值条件 ELSE

...

        表达式 ;

Z <= a WHEN p1 = '1'ELSE

b WHEN p2 = '1'ELSE

c;

该语句为并行语句,

在结构体中直接使用


5736069

1、常用实例及其语法

  • 2选1多路选择器相关语法现象

    • 进程语句和顺序语句

  • 在一个结构体中可以包含任意个进程语句结构,所有的进程语句都是并行语句,而由任一进程PROCESS引导的语句(包含在其中的语句)结构属于顺序语句。

    • PROCESS(敏感信号列表)

    • …(顺序语句)

    • END PROCESS;

敏感信号列表是指用于激活进程的信号列表

进程自身是并行的,但

进程内部是顺序的


5736069

1、常用实例及其语法

  • D触发器的VHDL描述

LIBRARY IEEE ;

USE IEEE.STD_LOGIC_1164.ALL ;

ENTITYDFF1IS

PORT(CLK:INSTD_LOGIC;

D : IN STD_LOGIC;

Q : OUT STD_LOGIC );

END ;

库调用语句,


5736069

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;

检测时钟上升沿


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 设计库和标准程序包

      VHDL库可以看成是一种用来存储预先完成的程序包、数据集合体和元件的仓库

      • VHDL语言库的种类:

        资源库:常规元件和标准模块存放的库(IEEE,STD)

        设计库:用户库WORK


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 设计库和标准程序包

      • IEEE库:包含有IEEE标准的程序包和其他一些支持工业标准的程序包。

        IEEE库中常用的四个程序包:

        STD_LOGIC_1164

        STD_LOGIC_ARITH

        STD_LOGIC_SIGNED

        STD_LOGIC_UNSIGED


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 设计库和标准程序包

      • STD库:定义了两个标准程序包STANDARD和TEXTIO。两个程序包在综合和编译译过程中是自动被包含进去的(不用专门的库调用语句,自动打开)

      • WORK库:是用户的VHDL设计现行工作库,用于存放用户设计和定义的一些设计单元和程序包。VHDL综合器将保存设计的目录文件夹默认为WORK库

      • VITAL库:用于门级时序仿真,但一般并不需要


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 设计库和标准程序包

      • 使用库和程序包的一般定义表式是:

        LIBRARY<设计库名>;

        USE<设计库名>.<程序包名>.ALL;

        LIBRARYIEEE;

        USEIEEE.STD_LOGIC_1164.ALL;


5736069

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库


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 信号定义和数据对象

      “SIGNAL Q1:STD_LOGIC;”

      信号定义在结构体的说明部分,在整个结构体有效,往往是作为进程之间信息通信的一种手段,信号的赋值存在一个延时δ (<=)

      输入输出端口理解为可见信号

      其他数据对象:常量、变量

      变量往往定义在进程,子程序的说明部分,是局部量,变量的赋值是立即的 (:=)


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 上升沿检测表式和信号属性函数EVENT

      “CLK'EVENT ANDCLK='1'”

      <信号名>'EVENT

      下降沿的检测?


5736069

1、常用实例及其语法

CLK语句是电路引入时序环节的关键?

  • D触发器的相关语法现象

    • 不完整条件语句与时序电路

ENTITYCOMP_BADIS

PORT( a1,b1 : IN BIT;

q1 : OUT BIT);

END;

ARCHITECTURE one OF COMP_BAD IS

BEGIN


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 不完整条件语句与时序电路

PROCESS (a1,b1)

BEGIN

IF a1> b1THEN

q1 <= '1';

ELSIF a1< b1 THEN

q1 <= '0'; --未提及当a1=b1时,q1作何操作

ENDIF;

ENDPROCESS;

END;


5736069

1、常用实例及其语法

不完整条件语句是构成时序电路的关键

  • D触发器的相关语法现象

    • 不完整条件语句与时序电路


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 不完整条件语句与时序电路

IFa1>b1THENq1<='1';

ELSEq1<='0';

ENDIF;


5736069

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 ;


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 时钟触发方式(边沿、电平)的VHDL表述

      边沿触发:

注意进程的敏感信号

...

PROCESS (CLK)

BEGIN

IF CLK=‘1‘ AND CLK’LAST_VALUE = ’0‘--同上例

THEN Q<= D;

END IF;

END PROCESS ;


5736069

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’


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 时钟触发方式(边沿、电平)的VHDL表述

      边沿触发:

进程可以没有敏感信号列表

PROCESS

BEGIN

Wait until CLK = '1';--利用wait语句

Q <= D;

END PROCESS;

下降沿如何表述?


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 时钟触发方式(边沿、电平)的VHDL表述

      边沿触发:

注意敏感信号列表

PROCESS (CLK)

BEGIN

IF CLK = '1‘ THEN

Q <= D; --利用进程的启动特性产生对CLK的边沿检测

END IF;

END PROCESS ;


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 时钟触发方式(边沿、电平)的VHDL表述

      边沿触发:

边沿(上升沿)触发方式的工作时序


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 时钟触发方式(边沿、电平)的VHDL表述

      电平触发:

PROCESS (CLK,D)

BEGIN

IF CLK= '1‘ --电平触发型寄存器

THEN Q<= D;

END IF;

END PROCESS ;

敏感信号列表不只CLK

信号


5736069

1、常用实例及其语法

  • D触发器的相关语法现象

    • 时钟触发方式(边沿、电平)的VHDL表述

      电平触发:

电平(高电平)触发方式的工作时序


5736069

1、常用实例及其语法

异步时序电路可由多

个进程来实现,每个

进程的激活时钟不为

同一个

  • D触发器的相关语法现象

    • 异步时序电路设计

何为异步? 不同时序部分时钟信号不

为同一个


5736069

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;


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

     通过该实例,主要掌握VHDL语言的层次化设计方法。整个设计的顶层和底层都将采用VHDL语言描述。


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

ain和bin为1位加数和被

加法,cin为进位输入,

sum为1位求和结果,cout

为进位输出

1位全加器可以由两个半加器构成


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

半加器可以由原理图实现,也可以由VHDL设计完成


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

    • 采用两种VHDL方法来描述半加器

      方法一:数据流(布尔方程)


5736069

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;


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

    • 采用两种VHDL方法来描述半加器

      方法二:行为描述(真值表)


5736069

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) ;


5736069

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 ;

两种方法描述的的半加器

选择其中一种即可


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

    • 全加器使用到的或门描述

LIBRARYIEEE;--或门逻辑描述

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYor2aIS

PORT(a,b:INSTD_LOGIC;

c:OUTSTD_LOGIC);

ENDENTITYor2a;

ARCHITECTUREoneOFor2aIS

BEGIN

c<= a OR b;

END ARCHITECTURE one ;


5736069

1、常用实例及其语法

  • 1位二进制全加器的VHDL描述

底层的半加器和或门用VHDL语言描述完成,做成封装。顶

层按上图完成原理图设计,即为前面所介绍的混合设计法。

但现在,我们将采用顶层VHDL语言描述法。


5736069

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;


5736069

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文件应在同一设计目录中


5736069

1、常用实例及其语法

  • 全加器的VHDL描述的相关语法

    • CASE语句(多条件分支语句)

给出表达式可能的取值

CASE<表达式>IS

When <选择值或标识符> => <顺序语句>; ... ; <顺序语句>;

When <选择值或标识符> => <顺序语句>; ... ; <顺序语句>;

...

WHEN OTHERS =><顺序语句>;

END CASE ;

“=>”相当于“THEN”

“WHEN OTHERS”不可少

和IF语句一样,CASE语句也是顺序语句。


5736069

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(6)等于A(2)


5736069

1、常用实例及其语法

  • 全加器的VHDL描述的相关语法

    • 并置操作符 & (注意不是与运算符 AND)

      • 并置操作是一种数据位的扩展

      • 并置操作运用于其它运算中时,要注意并置后的数据位宽度

SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0);

SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0);

...

a <= '1‘ & '0‘& d(1)& '1'; -- 元素与元素并置,并置后的数组长度为4

...

IF a &d = "101011" THEN ... -- 在IF条件句中可以使用并置符


5736069

1、常用实例及其语法

  • 全加器的VHDL描述的相关语法

    • 元件声明和例化语句

      • 元件声明语句用在结构体的说明部分

        COMPONENT 元件名 IS

        PORT (端口名表);

        END COMPONENT 文件名;

只需将被调用元件实体说

明的关键字ENTITY换成

COMPONENT即可

COMPONENTh_adder

PORT(a,b:INSTD_LOGIC;

co,so :OUT STD_LOGIC);

ENDCOMPONENT;


5736069

1、常用实例及其语法

  • 全加器的VHDL描述的相关语法

    • 元件声明和例化语句

      • 元件例化语句用在结构体的设计部分

        例化名 : 元件名 PORT MAP( [端口名 =>] 连接端口名,...);

u1 : h_adder PORT MAP(a=>ain,b=>bin,co=>d,so=>e);

如果缺省端口名,则按位置映射


5736069

1、常用实例及其语法

  • 计数器的VHDL描述

    • 用VHDL语言描述1四位二进制加法计数器

整数类型会根据数据的范围综合得到信号的数据宽度

ENTITY CNT4 IS

PORT ( CLK : IN BIT;

Q : BUFFER INTEGER RANGE 15 DOWNTO 0 );

END;

BUFFER具有双向端口INOUT的功能,但实际上其输入功能是不完整的,它只能将自己输出的信号再反馈回来,并不含有IN的功能。


5736069

1、常用实例及其语法

  • 计数器的VHDL描述

    • 用VHDL语言描述1四位二进制加法计数器

ARCHITECTURE bhv OF CNT4 IS

BEGIN

PROCESS (CLK)

BEGIN

IF CLK'EVENT AND CLK= '1‘ THEN

Q <= Q + 1;

END IF;

END PROCESS;

END bhv;

非完整条件语句?

Q <= Q + 1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q + 1,需等待下一个时钟周期。


5736069

1、常用实例及其语法

其它数据类型:NATURAL、

POSITIVE;它们都包含在

STD库,编译综合时默认

被打开。

  • 计数器的VHDL描述

    • 整数类型 INTEGER

Q : BUFFER INTEGER RANGE 15 DOWNTO 0;

1十进制整数

0十进制整数

35十进制整数

10E3十进制整数,等于十进制整数1000

16#D9#十六进制整数,等于十六进制整数D9H

8#720#八进制整数,等于八进制整数720O

2#11010010#二进制整数,等于二进制整数11010010B


5736069

1、常用实例及其语法

UNSIGNED程序包的引入是为了“+”功能重载;

  • 计数器的VHDL描述

    • 四位二进制计数器设计的其他VHDL表述方法

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT4 IS

PORT ( CLK : IN STD_LOGIC;

Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END;


5736069

1、常用实例及其语法

不对端口信号进行直接操作,而是引入中间信号;

  • 计数器的VHDL描述

    • 四位二进制计数器设计的其他VHDL表述方法

ARCHITECTURE bhv OF CNT4 IS

SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

PROCESS(CLK)

BEGIN

IF CLK‘EVENT AND CLK = '1‘ THEN

Q1 <= Q1 +1;--重载后支持不同数据类型的运算

ENDIF;

ENDPROCESS;

Q <= Q1;

END bhv;


5736069

1、常用实例及其语法

  • 计数器的VHDL描述

    • 四位二进制计数器设计的其他VHDL表述方法

4位加法计数器RTL电路


5736069

1、常用实例及其语法

  • 计数器的VHDL描述

    • 四位二进制计数器设计的其他VHDL表述方法

4位二进制加法计数器工作时序


5736069

1、常用实例及其语法

  • 一般加法计数器设计

    • 带异步复位和同步使能的模10加法计数器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

--该程序包为了功能重载

ENTITYCNT10IS

PORT (CLK,RST,EN : IN STD_LOGIC;

--包括使能和复位信号定义

CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

COUT :OUT STD_LOGIC);--加法进位输出位的定义

END CNT10;


5736069

1、常用实例及其语法

  • 一般加法计数器设计

    • 带异步复位和同步使能的模10加法计数器

ARCHITECTURE behav OF CNT10 IS

BEGIN

PROCESS(CLK,RST, EN)

VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);

--变量定义只在该进程中作用,为中间暂存量;

BEGIN

IF RST = ‘1’ THEN --RST的作用与CLK无关

CQI := (OTHERS =>‘0’);

--计数器异步复位,注意变量的赋值号“:=”;等价:CQI:=“0000”

ELSIF CLK‘EVENT AND CLK=’1‘THEN --检测时钟上升沿


5736069

1、常用实例及其语法

  • 一般加法计数器设计

    • 带异步复位和同步使能的模10加法计数器

IF EN = '1‘ THEN --检测是否允许计数(同步使能)

IF CQI < 9 THEN CQI := CQI + 1;

--允许计数,检测是否小于9

ELSE CQI := (OTHERS =>‘0’); --大于9,计数值清零

END IF; END IF;END IF;

IF CQI = 9 THEN COUT <= '1';

--计数大于9,输出进位信号

ELSE COUT <='0';

END IF;

CQ <= CQI; --将计数值向端口输出,注意在进程内部

END PROCESS;

END behav;


5736069

1、常用实例及其语法

  • 一般加法计数器设计

    • 相关语法说明

      • 变量

        VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0)

        变量是局部量,一般在进程(子程序)中使用。变量赋值号为“:=”,赋值操作是立即的。


5736069

1、常用实例及其语法

  • 一般加法计数器设计

    • 相关语法说明

      • 省略赋值操作符(OTHERS=>X)

        省略操作符可以方便相同数据的快速输入

两种操作是等价的,但前者要优于后者

  • SIGNAL d1 : STD_LOGIC_VECTOR(4 DOWNTO 0);

  • VARIABLE a1 : STD_LOGIC_VECTOR(15 DOWNTO 0);

  • ...

  • d1 <= (OTHERS=>‘0’);--等价 d1<=“00000”

  • a1 := (OTHERS=>'0'); --等价 a1<=“0000000000000000”

  • d1 <= (1=>e(3),3=>e(5), OTHERS=>e(1));

  • d1 <= e(1) & e(5) & e(1) & e(3) & e(1);


5736069

1、常用实例及其语法

  • 一般加法计数器设计

工作时序


5736069

1、常用实例及其语法

  • 含并行置位的移位寄存器设计

    • 含并行置位的8位并入串出移位寄存器设计

  • LIBRARY IEEE;

  • USE IEEE.STD_LOGIC_1164.ALL;

  • ENTITY SHFRT IS

    • PORT ( CLK,LOAD : IN STD_LOGIC;

    • DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

    • QB : OUT STD_LOGIC);

  • END SHFRT;

  • ARCHITECTURE behav OF SHFRT IS

  • BEGIN


5736069

1、常用实例及其语法

  • 含并行置位的移位寄存器设计

    • 含并行置位的8位并入串出移位寄存器设计

PROCESS (CLK, LOAD)

VARIABLE REG8 : STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

IF CLK'EVENT AND CLK= '1‘ THEN

IF LOAD = ‘1‘ THEN REG8 := DIN;

--由(LOAD=’1’)同步装载新数据

ELSE REG8(6 DOWNTO 0) := REG8(7 DOWNTO 1);

END IF;

END IF;

QB <=REG8(0); -- 串行输出最低位

END PROCESS;

END behav;

8个时钟周期后,寄存器内

容是什么?


5736069

1、常用实例及其语法

  • 含并行置位的移位寄存器设计

    • 含并行置位的8位并入串出移位寄存器设计

工作时序 :注意数据的移位变化


5736069

1、常用实例及其语法

  • 思考题

    • 减法、及双向计数器怎么设计?

    • 串入并出移位寄存器如何设计?

  • 练习题

    P93 4-4、4-6


5736069

本讲主要内容

  • 常用实例及其语法

    多路选择器、寄存器、全加器、计数器等

  • VHDL基本语法

    基本语言要素(信号、变量等)、常用用语句(IF、CASE)、进程和并行语句的概念等


2 vhdl

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 常数

      • 常量的定义和设置主要是为了程序易读和修改

      • 常数定义的一般表述:

CONSTANT常数名:数据类型:=表达式;

CONSTANTFBT : STD_LOGIC_VECTOR := "010110" ;

-- 标准位矢类型

CONSTANTDATAIN : INTEGER := 15 ;-- 整数类型


2 vhdl1

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 变量

      • 是一个局部量,在进程和子程序中使用

      • 变量不能把信息带出对它做出定义的当前结构

      • 变量赋值是立即发生的,不存在延时行为

      • 主要作用是在进程中作为临时的数据存储单元

      • 定义变量的一般表述如下:

        VARIABLE变量名 : 数据类型[ := 初始值];


2 vhdl2

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 变量

VARIABLE a : INTEGER RANGE 0 TO 15 ;

--变量a定义为变量,取值范围是0到15

VARIABLE d : STD_LOGIC := ‘1’ ;

--变量a定义为标准逻辑位数据类型, 初始值是1

  • 变量赋值的一般表述如下:

  • 目标变量名:= 表达式;


2 vhdl3

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 信号

      • 类似于硬件内部的连接线(节点信号)

      • 常作为并行语句模块(进程)间信息交流通道

      • 除了无方向说明外,信号与实体的端口(Port)概念是一致的

      • 信号是全局量,定义和使用范围是实体、结构体和程序包,不能在进程和子程序中定义信号


2 vhdl4

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 信号

      • 定义格式:

        SIGNAL 信号名: 数据类型 [:=初始值] ;

      • 赋值格式:

        目标信号名 <= 表达式 [AFTER时间量];

SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);

信号的赋值是存在延时的,即使零延时,也

存在一个“δ”延时。这与器件的传输延时是吻合的


2 vhdl5

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 信号

      • 进程(顺序语句)中可以允许一个信号有多个驱动源

  • SIGNALa,b,c,y,z:INTEGER;

  • ...

  • PROCESS(a,b,c)

  • BEGIN

  • y<=a+b;z<=c–a;y<=b;

  • END PROCESS ;

y<=?


2 vhdl6

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值


2 vhdl7

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

      两者有时设计效果类似,有时则相差很大

      用D触发器设计,演示信号与变量两种不同的描述,但设计效果一样的情况


2 vhdl8

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

  • ARCHITECTURE bhv OFDFF3IS

  • BEGIN

    • PROCESS (CLK)

    • VARIABLE QQ : STD_LOGIC;

    • BEGIN

    • IF CLK'EVENT AND CLK = ‘1’ THEN

    • QQ :=D1;

    • END IF;

    • Q1 <= QQ;

    • END PROCESS;

  • END ;

采用变量描述,变

量定义在进程中


2 vhdl9

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

  • ARCHITECTURE bhv OF DFF3 IS

  • SIGNAL QQ: STD_LOGIC;

  • BEGIN

    • PROCESS (CLK)

    • BEGIN

    • IFCLK'EVENT AND CLK = ‘1’ THEN

    • QQ <= D1;

    • END IF;

    • END PROCESS;

  • Q1 <=QQ;

  • END ;

信号与变量定义位

置和作用范围都不

一样

采用信号描述,信

号定义在结构体中


2 vhdl10

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

      下面的举例,将反映出信号与变量赋值不同的设计效果


2 vhdl11

2、VHDL基本语法

本例反映了信号的赋值

与变量的不同之处,信

号的赋值要δ延时, “执

行赋值” 和“完成赋值”

是两个不同的过程。此

例也反映出信号类似于

硬件连线(节点)的作用

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

ARCHITECTURE bhv OF DFF3 IS

SIGNAL A,B : STD_LOGIC;

BEGIN

PROCESS (CLK)

BEGIN

IF CLK'EVENT AND CLK = '1‘ THEN

A <= D1;

B <= A;

Q1 <= B;

END IF;

END PROCESS;

END;

两“A”和两“B”都差一个δ时间


2 vhdl12

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

变量的赋值是立即的

,信号是在进程结束

赋值的

ARCHITECTURE bhv OF DFF3 IS

BEGIN

PROCESS (CLK)

VARIABLE A,B : STD_LOGIC;

BEGIN

IF CLK'EVENT AND CLK = '1‘ THEN

A := D1;

B := A;

Q1 <= B;

END IF;

END PROCESS;

END;


2 vhdl13

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 vhdl14

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

c1的赋值先于e1,信号的赋值要在δ延时后完成

BEGIN

IF in1= ‘1‘ THEN ...-- 第 1 行

e1 <=“1010”; --第 2 行

...

IF in2= ‘0‘ THEN . . .-- 第 15+n 行

...

c1 := “0011”;-- 第 30+m行

...

END IF;

END PROCESS;


2 vhdl15

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

      通过1个四选一的多路选择器来分析信号与变量赋值的不同之处,此例说明有些情况下只能用采用变量作为中间量。


2 vhdl16

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)


2 vhdl17

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

begin

muxval <= 0;

If (a = '1') then muxval <= muxval + 1; end if;

If (b = '1') then muxval <= muxval + 2; end if;

case muxval is

When 0 => q <= i0;

When 1 => q <= i1;

When 2 => q <= i2;

When 3 => q <= i3;

When others => null;

end case;

end process;

END body_mux4;

信号赋值的方式设计,使得muxval被多个数据源驱动,结果无法获得无初值,达不到设计的结果。采用变量设计,可以解决这个问题


2 vhdl18

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

BEGIN

process(i0,i1,i2,i3,a,b)

variable muxval : integer range 7 downto 0;


2 vhdl19

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

begin

muxval := 0;

If (a ='1') then muxval := muxval + 1; end if;

If (b ='1') then muxval := muxval + 2; end if;

case muxval is

When 0 => q <= i0;

When 1 => q <= i1;

When 2 => q <= i2;

When 3 => q <= i3;

When others=> null;

end case;

end process;

END body_mux4;

变量赋值的方式设计,使得muxval赋值立即完成,能达到正确的设计结果


2 vhdl20

2、VHDL基本语法

上图为信号赋值的错误工作时序,下图为变量赋值的正确时序


2 vhdl21

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

      再分析一个8位移位寄存器,此例说明有些情况下只能用采用信号作为中间量。


2 vhdl22

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

Library IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY SHIFT IS

PORT (CLK,C0 : IN STD_LOGIC; --时钟和进位输入

MD : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --移位模式控制字

D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --待加载移位的数据

QB : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --移位数据输出

CN : OUT STD_LOGIC);--进位输出

END ENTITY;


2 vhdl23

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

ARCHITECTURE BEHAV OF SHIFT IS

SIGNAL REG : STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL CY : STD_LOGIC ;

BEGIN

PROCESS (CLK,MD,C0)

BEGIN

IF CLK'EVENT AND CLK= '1‘ THEN

CASE MD IS

WHEN "001“ => REG(0) <= C0;

REG(7 DOWNTO 1) <= REG(6 DOWNTO 0); CY <= REG(7);

--带进位循环左移

会不会出现数据的重叠覆盖?


2 vhdl24

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

WHEN “010” => REG(0) <= REG(7);

REG(7 DOWNTO 1) <= REG(6 DOWNTO 0); --自循环左移

WHEN “011” => REG(7) <= REG(0);

REG(6 DOWNTO 0) <= REG(7 DOWNTO 1); --自循环右移

WHEN "100“ => REG(7) <= C0;

REG(6 DOWNTO 0) <= REG(7 DOWNTO 1); CY <= REG(0);

--带进位循环右移

WHEN "101" => REG(7 DOWNTO 0) <= D(7 DOWNTO 0);

--加载待移数

WHEN OTHERS => REG <= REG ; CY <= CY ; --保持

END CASE;

END IF;END PROCESS;


2 vhdl25

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

QB(7 DOWNTO 0) <= REG(7 DOWNTO 0); CN <= CY;

--移位后输出

END BEHAV;

此例采用变量赋值,

则达不到设计效果


2 vhdl26

2、VHDL基本语法

  • 数据对象(常量、变量、信号)

    • 进程中的信号与变量赋值

移位寄存器工作时序“MD=001”


2 vhdl27

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    双向和三态应用很多,如数据、地址总线

    • 将以例题的方式说明双向和三态结构的VHDL设计

    • 原理图中的双向和三态结构(primitives/buffer)


2 vhdl28

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 三态门设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY tri_s IS

Port ( enable : IN STD_LOGIC;

datain : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

dataout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END tri_s ;

STD_LOGIC类型包含9种取值,其中就有

“Z”高阻态


2 vhdl29

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 三态门设计

ARCHITECTURE bhv OF tri_s IS

BEGIN

PROCESS(enable,datain)

BEGIN

IF enable = '1' THEN dataout <= datain;

ELSE dataout <="ZZZZZZZZ" ;

END IF ;

END PROCESS;

END bhv;

利用STD_LOGIC数据类型的“Z”态,来获得三态门控制电路。

注意:“Z”要大写;综合的结果与综合器和具体的PGA/CPLD器件有关。


2 vhdl30

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 双向端口设计

  • Library ieee;

  • Use ieee.std_logic_1164.all;

  • Entity tri_state is

    • Port (control : in std_logic;

    • in1: in std_logic_vector(7 downto 0);

    • q : inout std_logic_vector(7 downto 0);

    • x : out std_logic_vector(7 downto 0));

  • end tri_state;

  • Architecture body_tri of tri_state is

  • begin


2 vhdl31

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 双向端口设计

原因是对q的条件语句

描述是不完整的

process(control,q,in1)

begin

If (control = '0') then

x <= q;

Else q <= in1;

x<="ZZZZZZZZ";

end if;

end process;

end body_tri;


2 vhdl32

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 双向端口设计

process(control,q,in1)

begin

If (control = '0') then

x <= q;q <="ZZZZZZZZ";

Else q <= in1;

x<="ZZZZZZZZ";

end if;

end process;

end body_tri;

q在IF语句中有了完整的条件描述;q在输入时,设定输出高阻


2 vhdl33

2、VHDL基本语法

上图为错误的工作时序(出现了“线与”),下图为正确的工作时序


2 vhdl34

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 三态总线设计

      三态总线设计,特别要注意信号多驱动源的问题

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY tristate2 IS

Port ( input3, input2: IN STD_LOGIC_VECTOR (7 DOWNTO 0);

input1, input0 : IN STD_LOGIC_VECTOR (7 DOWNTO 0);

enable : IN STD_LOGIC_VECTOR(1 DOWNTO 0);

output : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));

END tristate2;


2 vhdl35

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 三态总线设计

  • ARCHITECTURE multiple_drivers OF tristate2 IS

  • BEGIN

  • PROCESS(enable,input3, input2, input1, input0)

  • BEGIN

    • IF enable = "00“ THEN output <= input3;

    • ELSE output <=(OTHERS => 'Z');END IF;

    • IF enable = "01“ THEN output <= input2;

    • ELSE output <=(OTHERS => 'Z');END IF;


2 vhdl36

2、VHDL基本语法

  • 双向和三态电路信号赋值例解

    • 三态总线设计

  • IF enable = "10“ THEN output <= input1;

  • ELSE output <=(OTHERS => 'Z');END IF;

  • IF enable = "11“ THEN output <= input0;

  • ELSE output <=(OTHERS => 'Z');END IF ;

  • END PROCESS;

  • END multiple_drivers;

  • 完整的条件语句导致,任何条件下output都有4个激励源,因此只有一个信号赋值有效。


    2 vhdl37

    2、VHDL基本语法

    • 双向和三态电路信号赋值例解

      • 三态总线设计

    问题出在一个进程中,同一信号被多个数据源驱动


    2 vhdl38

    2、VHDL基本语法

    • 双向和三态电路信号赋值例解

      • 三态总线设计

    • ARCHITECTURE body_tri OF tristate2 IS

    • BEGIN

      • output <= input3 when enable="00“ else (others =>'Z');

      • output <= input2 when enable="01“ else (others =>'Z');

      • output <= input1 when enable="10“ else (others =>'Z');

      • output <= input0 when enable="11“ else (others =>'Z');

    • END body_tri;

    四条并行语句,相当于四个进程,解决了上例中出现的问题


    2 vhdl39

    2、VHDL基本语法

    • IF语句概述

      • 条件语句的四种格式

        • 不完成条件语句

    不完整的条件语句往往

    导致时序结构的产生

    IF 条件句 Then

    顺序语句;

    ENDIF;

    条件句要求一个布尔结果


    2 vhdl40

    2、VHDL基本语法

    • IF语句概述

      • 条件语句的四种格式

        • 完成条件语句(双分支结构)

    IF 条件句 Then

    顺序语句;

    ELSE

    顺序语句;

    END IF;

    该结构双分支,确保功能

    描述的完整性


    2 vhdl41

    2、VHDL基本语法

    • IF语句概述

      • 条件语句的四种格式

        • 多重IF语句嵌套式条件句

    可以产生较复杂的多条

    件描述,可以是时序的也

    可以是组合的。注意,

    END IF结束句应该与嵌

    入IF条件句数量一致。

    IF 条件句 Then

    IF 条件句 Then

    END IF;

    END IF;


    2 vhdl42

    2、VHDL基本语法

    • IF语句概述

      • 条件语句的四种格式

        • 单IF语句嵌套式条件句

    也可产生较复杂的多条

    件描述。注意,分支由

    ELSIF产生,整条语句

    为一条IF语句,只有一

    个END IF结束句。

    IF 条件句 Then

      顺序语句

    ELSIF 条件句 Then

    顺序语句

    ELSE

      顺序语句

    ENDIF;


    2 vhdl43

    2、VHDL基本语法

    • IF语句概述

      • 利用IF多条件分支完成8-3线优先编码器


    2 vhdl44

    2、VHDL基本语法

    • IF语句概述

      • 利用IF多条件分支完成8-3线优先编码器

    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(0 TO 2) );

    END coder;

    ARCHITECTURE behav OF coder IS

    BEGIN

    PROCESS (din)


    2 vhdl45

    2、VHDL基本语法

    • IF语句概述

      • 利用IF多条件分支完成8-3线优先编码器

    BEGIN

    IF (din(7)='0') THEN output <= "000";

    ELSIF (din(6)='0') THEN output <= "100“ ;

    ELSIF (din(5)='0') THEN output <= "010“ ;

    ELSIF (din(4)='0') THEN output <= "110“ ;

    ELSIF (din(3)='0') THEN output <= "001“ ;

    ELSIF (din(2)='0') THEN output <= "101“ ;

    ELSIF (din(1)='0') THEN output <= "011“ ;

    ELSE output <= “111“ ;

    END IF;

    END PROCESS;END behav;


    2 vhdl46

    2、VHDL基本语法

    如果没有敏感信号列表,一般进程中就会有WAIT语句

    • 进程语句归纳

      • 进程语句格式

    • [进程标号:] PROCESS [ (敏感信号参数表)] [IS]

    • [进程说明部分]

    • BEGIN

    • 顺序描述语句

    • END PROCESS [进程标号];

    数据类型、常数、变量、属性、子程序

    赋值语句、进程启动语句、子程序调用语句、顺序描述语句、进程跳出语句


    2 vhdl47

    2、VHDL基本语法

    • 进程语句归纳

      • 进程语句的基本特征

        • 一个结构体可以有多个进程,相互是并行的,但进程内部的语句是顺序执行的;(进程类似于原理图中的一个个模块)

        • PROCESS进程为一无限循环语句

        • 进程中的顺序语句具有明显的顺序/并行运行双重性


    2 vhdl48

    2、VHDL基本语法

    • 进程语句归纳

      • 进程语句的基本特征

    PROCESS(abc) BEGIN

    CASE abc IS

    WHEN "0000“ => so<="010”;

    WHEN "0001“ => so<="111” ;

    WHEN "0010“ => so<="101” ;

    WHEN "1110“ => so<="100";

    WHEN "1111“ => so<="000";

    WHEN OTHERS => NULL ;

    END CASE;

    END PROCESS;

    虽然是顺序语句,但却具有并行执行的效果。VHDL语言的代码运行,最好理解为“实现”


    2 vhdl49

    2、VHDL基本语法

    • 进程语句归纳

      • 进程语句的基本特征

        • 进程必须由敏感信号的变化来启动 或者WAIT语句

        • 不同进程之间如果要进行“通信”,可利用信号(线)来实现

        • 一个进程中只允许描述对应于一个时钟信号的同步时序逻辑 ,异步时序需要多个进程来实现

        • 任何一条并行赋值语句,都是一个简化的进程


    2 vhdl50

    2、VHDL基本语法

    该例中将会用到两个进程,进程之间用信号“temp”进行通信

    • 进程语句归纳

      • 进程举例

    ENTITY mul IS

    PORT (a, b, c, selx, sely : IN BIT;

    data_out : OUT BIT );

    END mul;

    ARCHITECTURE ex OF mul IS

    SIGNAL temp : BIT;

    BEGIN


    2 vhdl51

    2、VHDL基本语法

    信号temp作为两进程之间通信的手段

    • 进程语句归纳

      • 进程举例

    p_b: PROCESS(temp, c, sely)

    BEGIN

    IF (sely = '0') THEN

    data_out <= temp;

    ELSE

    data_out <= c;

    END IF;

    END PROCESS p_b;

    END ex;

    p_a : PROCESS (a, b, selx)

    BEGIN

    IF (selx = '0') THEN temp <= a;

    ELSE temp <= b;

    END IF;

    END PROCESS p_a;


    2 vhdl52

    2、VHDL基本语法

    • 并行语句例解

      • 并行语句特征

        • 处于结构体中的语句为并行语句(结构内部是并行的)

        • 大部分并行语句执行和实行是同时发生的(类似于原理图中模块与模块之间的执行是不分先后的)

        • “信号<=表达式” 信号赋值语句在结构体中可以直接使用,在进程中也可以使用;在结构体中理解为一条并行语句(最简单的进程),在进程中理解为一条顺序语句


    2 vhdl53

    2、VHDL基本语法

    • 并行语句例解

      • 并行语句特征

        • 进程语句是最常用的一条并行语句,其内部是顺序的,与一般并行语句不同的是进程需要敏感信号的启动

        • 结构中的并行赋值语句也存在δ延时

    • Data1<= a AND b;

    • Data2<= c;

    除非a、b、c同时发生变化;其实结构中的并行赋值就是一条简化的进程语句


    2 vhdl54

    2、VHDL基本语法

    x <= a WHEN select=0 ELSE

    b WHEN select=1 ELSE

    c WHEN select=2 ELSE

    d;

    • 并行语句例解

      • 并行语句举例

    两条并行语句的敏感信号不一样;而且存在牵制关系

    ARCHITECTURE dataflow OF mux IS

    SIGNAL seiect : INTEGER RANGE 15 DOWNTO 0;

    BEGIN

    Select<= 0 WHEN s0=’0’ AND s1=’0’ ELSE

    1 WHEN s0=’1’ AND s1=’0’ ELSE

    2 WHEN s0=’0’ AND s1=’1’ ELSE

    3;


    2 vhdl55

    2、VHDL基本语法

    • 仿真延时

      • 固有延时

        • 也称惯性延时,是任何电子器件都存在的一种延时特性(信号的建立时间)

        • VHDL仿真器中δ能够反映实际器件的这一行为

    • z <= x XOR y AFTER 5ns;

    • z <= x XOR y;

    • B <= A AFTER 20ns;--固有延时模型


    2 vhdl56

    2、VHDL基本语法

    • 仿真延时

      • 传输延时

        • 表达的是输入与输出之间的一种绝对延时关系

    B <= TRANSPORT A AFTER 20ns;-- 传输延时模型


    2 vhdl57

    2、VHDL基本语法

    • 仿真延时

      • 仿真δ延时

    VHDL仿真器和综合器将自动为系统中的信号赋值 配置一足够小而又能满足逻辑排序的延时量,即仿真软件的最小分辩时间,这个延时量就称为仿真δ (Simulation Delta),或称δ延时,从而使并行语句和顺序语句中的并列赋值逻辑得以正确执行。由此可见,在行为仿真、功能仿真乃至综合中,引入δ延时是必需的。仿真中,δ延时的引入由EDA工具自动完成,无需设计者介入。


    5736069

    练习题

    P153 6-8


    3 vhdl

    3、VHDL进阶

    • 参数传递说明语句

      • 又称之为类属参数,用在实体定义中,提供了实体与外部通信的途径

      • 参数传递说明语句的一般书写格式如下:

        GENERIC([常数名 : 数据类型[ : 设定值 ]

        { ;常数名 : 数据类型 [ : 设定值 ] }) ;


    3 vhdl1

    3、VHDL进阶

    • 参数传递说明语句

      LIBRARY IEEE;

      USE IEEE.STD_LOGIC_1164.ALL;

      ENTITY andn IS

      GENERIC(n : INTEGER );--定义类属参量及其数据类型

      PORT(a:IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);

      --用类属参量限制矢量长度

      c : OUT STD_LOGIC);

      END;

      ARCHITECTURE behav OF andn IS

      BEGIN


    3 vhdl2

    3、VHDL进阶

    • 参数传递说明语句

      PROCESS (a)

      VARIABLE int : STD_LOGIC;

      BEGIN

      int := '1';

      FOR i IN a'LENGTH - 1 DOWNTO 0 LOOP--循环语句

      IF a(i)=‘0’ THENint := '0'; END IF;

      END LOOP;

      c<=int;

      END PROCESS;

      END;


    3 vhdl3

    3、VHDL进阶

    • 参数传递说明语句

      • 在高层次实体中例化调用含类属参数的元件

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL;

        ENTITY exn IS

        PORT(d1,d2,d3,d4,d5,d6,d7 : IN STD_LOGIC;

        q1,q2: OUT STD_LOGIC);

        END;


    3 vhdl4

    3、VHDL进阶

    • 参数传递说明语句

      • 在高层次实体中例化调用含类属参数的元件

        ARCHITECTURE exn_behav OF exn IS

        COMPONENT andn--调用上例的元件调用声明

        GENERIC (n : INTEGER);

        PORT(a : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);

        C : OUT STD_LOGIC);

        END COMPONENT ;


    3 vhdl5

    3、VHDL进阶

    • 参数传递说明语句

      • 在高层次实体中例化调用含类属参数的元件

        BEGIN

        u1: andn GENERIC MAP (n =>2)

        -- 参数传递映射语句,定义类属变量,n赋值为2

        PORT MAP (a(0)=>d1,a(1)=>d2,c=>q1);

        u2: andn GENERIC MAP (n =>5)

        -- 定义类属变量,n赋值为5

        PORT MAP (a(0)=>d3,a(1)=>d4,a(2)=>d5, a(3)=>d6,a(4)=>d7, c=>q2);

        END;


    3 vhdl6

    3、VHDL进阶

    • 子程序

      • 是VHDL的一个程序模块

      • 只能用顺序语句来定义和完成算法

      • 不能从本结构体的并行语句和进程中直接读取信号或者赋值信号

      • 可以在三个同位置定义:程序包、结构体和进程

      • 子程序具有可重载的特点

      • 子程序有两种类型:过程和函数


    3 vhdl7

    3、VHDL进阶

    • 子程序

      • 函数

        • 函数定义包括函数首定义和函数体定义

        • 函数首定义格式如下:

          FUNCTION 函数名(参数表) RETURN 数据类型

        • 如果函数在(用户自定义)程序包中定义,则需要函数首,且放在程序包首中(函数体放在程序包体中);在结构体和进程的说明部分中定义则不需要函数首。


    3 vhdl8

    3、VHDL进阶

    函数体定义在程序包体中,或结构体、进程的说明部分

    • 子程序

      • 函数

        • 函数体定义

          FUNCTION 函数名(参数表) RETURN 数据类型 IS

          --函数体

          [ 说明部分 ]

          BEGIN

          顺序语句 ;

          END FUNCTION 函数名;

    函数参数的端口模式为输入(IN),可以指明也可以省去,类型为CONSTANT或SINGAL,不指明则默认为常量


    3 vhdl9

    3、VHDL进阶

    • 子程序

      • 函数在结构体中定义使用举例

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL ;

        ENTITY func IS

        PORT( a : IN STD_LOGIC_VECTOR (0 to 2 ) ;

        m : OUT STD_LOGIC_VECTOR(0 to 2 ));

        END ENTITY func;


    3 vhdl10

    3、VHDL进阶

    • 子程序

      • 函数在结构体中定义使用举例

        ARCHITECTURE demo OF funcIS

        FUNCTION sam(x,y ,z :STD_LOGIC) RETURN STD_LOGIC IS

        BEGIN

        RETURN ( xAND y ) OR z;

        END FUNCTION sam;


    3 vhdl11

    3、VHDL进阶

    • 子程序

      • 函数在结构体中定义使用举例

        BEGIN

        PROCESS ( a)

        BEGIN

        m(0)<=sam(a(0),a(1),a(2));

        m(1)<=sam(a(2),a(0),a(1));

        m(2)<=sam(a(1),a(2),a(0));

        END PROCESS ;

        END ARCHITECTURE demo ;

    在进程中定义函数和使用

    与此类似,注意作用范围


    3 vhdl12

    3、VHDL进阶

    • 子程序

      • 函数在程序包中定义使用举例

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL;

        PACKAGE packexp IS --定义程序包

        FUNCTION max( a,b : IN STD_LOGIC_VECTOR)

        RETURN STD_LOGIC_VECTOR;

        --定义函数首

        END;


    3 vhdl13

    3、VHDL进阶

    注意程序包存放到当前工

    程目录,由work库指向

    • 子程序

      • 函数在程序包中定义使用举例

        PACKAGE BODY packexp IS

        FUNCTION max( a,b : IN STD_LOGIC_VECTOR)

        RETURN STD_LOGIC_VECTORIS

        --定义函数体

        BEGIN

        IF a > b THEN RETURNa;

        ELSE RETURN b;

        END IF;

        END FUNCTION max;--结束FUNCTION语句

        END;--结束PACKAGE BODY语句


    3 vhdl14

    3、VHDL进阶

    • 子程序

      • 函数在程序包中定义使用举例(调用函数)

        LIBRARY IEEE; --函数应用实例

        USE IEEE.STD_LOGIC_1164.ALL;

        USE WORK.packexp.ALL ;

        ENTITY axamp IS

        PORT(dat1,dat2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

        dat3,dat4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

        out1,out2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );

        END;


    3 vhdl15

    3、VHDL进阶

    函数(子程序)即可并行

    调用,也可顺序调用

    • 子程序

      • 函数在程序包中定义使用举例(调用函数)

        ARCHITECTURE bhv OF axamp IS

        BEGIN

        out1 <= max(dat1,dat2);

        --用在赋值语句中的并行函数调用语句

        PROCESS(dat3,dat4)

        BEGIN

        out2 <= max(dat3,dat4);--顺序函数调用语句

        END PROCESS;

        END;


    3 vhdl16

    3、VHDL进阶

    • 子程序

      • 重载函数

        • 同名称的函数可以用不同的数据类型作为此函数的参数定义多次

        • 使得同一名称的函数可以支持不同类型数据的操作


    3 vhdl17

    3、VHDL进阶

    • 子程序

      • 重载函数

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL ;

        PACKAGE packexp IS--定义程序包

        FUNCTION max( a,b :IN STD_LOGIC_VECTOR)

        RETURN STD_LOGIC_VECTOR; --定义函数首

        FUNCTION max( a,b :IN BIT_VECTOR) --定义函数首

        RETURN BIT_VECTOR;

        FUNCTION max( a,b :IN INTEGER ) --定义函数首

        RETURN INTEGER;

        END;


    3 vhdl18

    3、VHDL进阶

    • 子程序

      • 重载函数

        PACKAGE BODY packexp IS

        FUNCTION max( a,b :IN STD_LOGIC_VECTOR)

        --定义函数体

        RETURN STD_LOGIC_VECTORIS

        BEGIN

        IF a >b THEN RETURN a;

        ELSE RETURN b; END IF;

        END FUNCTION max;


    3 vhdl19

    3、VHDL进阶

    • 子程序

      • 重载函数

        FUNCTION max( a,b :IN INTEGER)

        --定义函数体

        RETURN INTEGERIS

        BEGIN

        IFa > b THEN RETURN a;

        ELSE RETURN b; END IF;

        ENDFUNCTIONmax;


    3 vhdl20

    3、VHDL进阶

    • 子程序

      • 重载函数

        FUNCTION max( a,b :IN BIT_VECTOR)

        --定义函数体

        RETURN BIT_VECTOR IS

        BEGIN

        IFa> b THEN RETURN a;

        ELSE RETURN b; END IF;

        ENDFUNCTION max; --结束FUNCTION语句

        END;--结束PACKAGEBODY语句


    3 vhdl21

    3、VHDL进阶

    • 子程序

      • 重载函数(调用)

        LIBRARY IEEE ;

        USE IEEE.STD_LOGIC_1164.ALL ;

        USE WORK.packexp.ALL;

        ENTITY axamp IS

        PORT(a1,b1 : IN STD_LOGIC_VECTOR(3DOWNTO 0);


    3 vhdl22

    3、VHDL进阶

    • 子程序

      • 重载函数(调用)

        a2,b2 : IN BIT_VECTOR(4DOWNTO 0);

        a3,b3 : IN INTEGER RANGE 0 TO 15;

        c1: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

        c2: OUT BIT_VECTOR(4 DOWNTO 0);

        c3: OUT INTEGERRANGE 0 TO 15);

        END;


    3 vhdl23

    3、VHDL进阶

    虽函数名一样,但调用函

    数体不一样(重载)

    • 子程序

      • 重载函数(调用)

        ARCHITECTURE bhv OF axamp IS

        BEGIN

        c1<=max(a1,b1);

        --对函数max(a,b:INSTD_LOGIC_VECTOR)的调用

        c2<=max(a2,b2);--对函数max(a,b:INBIT_VECTOR)的调用

        c3<=max(a3,b3);--对函数max(a,b:ININTEGER)的调用

        END


    3 vhdl24

    3、VHDL进阶

    • 子程序

      • 转换函数

        • to_stdlogicvector(A)由bit_vector类型的A转换为std_logic_vector

        • to_bitvector(A)由std_logic _vector转换为bit_vector

        • to_stdlogic (A)由bit转换成std_logic

        • to_bit(A)由std_logic转换成bit

        • conv_std_logic_vector(A, 位长)将整数integer转换成std_logic_vector类型,A是整数

        • conv_integer(A)将std_logic_vector转换成整数integer

        • conv_integer(A)由std_logic_vector转换成integer


    3 vhdl25

    3、VHDL进阶

    • 子程序

      • 过程

        • 过程同样包括过程首定义和过程体定义

        • 首定义格式如下:

          PROCEDURE过程名(参数表) --过程首定义

        • 如果过程在(用户自定义)程序包中定义,则需要过程首,且放在程序包首中(过程体放在程序包体中);在结构体和进程的说明部分中定义过程则不需要过程首。


    3 vhdl26

    3、VHDL进阶

    过程体定义在程序包体中,或结构体、进程的说明部分

    • 子程序

      • 过程

        • 过程体定义

          PROCEDURE 过程名(参数表)IS

          [说明部分]

          BIGIN-- 过程体 顺序语句;

          END PROCEDURE 过程名;

    参数可对信号、变量和常数三类对象目标进行说明,工作模式有IN、OUT和INOUT;定义了IN模式而未定义目标参量类型,则默认为常量;若定义了OUT或INOUT,则默认目标参数类型为变量

    但可由参数返回值


    3 vhdl27

    3、VHDL进阶

    参数为变量,且为INOUT属性,意为着此过程参数即可输入、也可以产生结果输出

    • 子程序

      • 过程定义实例

        PROCEDURE prg1(VARIABLE value:INOUT BIT_VECTOR(0 TO 7)) IS

        BEGIN

        CASE value IS

        WHEN "0000" => value: ="0101" ;

        WHEN "0101" => value: ="0000" ;

        WHEN OTHERS => value: ="1111" ;

        END CASE ;

        END PROCEDUREprg1 ;


    3 vhdl28

    3、VHDL进阶

    不特别指明,则过程参数输入(IN)为常量、输出(OUT)为变量

    • 子程序

      • 过程定义实例

        PROCEDURE comp (a, r:IN REAL;m:IN INTEGER;v1, v2:OUT REAL) IS

        VARIABLE cnt : INTEGER;

        BEGIN

        v1:=1.6*a;--赋初始值

        v2:=1.0;--赋初始值


    3 vhdl29

    3、VHDL进阶

    此处用到一个FOR_LOOP循环语句

    • 子程序

      • 过程定义实例

        Q1 : FOR cnt IN 1 TO m LOOP

        v2 := v2 * v1;

        EXIT Q1 WHENv2 > v1; -- 当v2 > v1,跳出循环LOOP

        END LOOP Q1;

        ASSERT (v2 < v1 )

        REPORT "OUT OF RANGE“ -- 输出错误报告

        SEVERITY ERROR ;

        END PROCEDURE comp ;

    断言语句,ASSERT断言为假时,产生REPORT报告


    3 vhdl30

    3、VHDL进阶

    • 子程序

      • 过程在程序包中定义及调用实例

        LIBRARY IEEE;

        USE IEEE.STD_LOGIC_1164.ALL;

        PACKAGE axamp IS--过程首定义

        PROCEDURE nand4a (SIGNAL a,b,c,d : IN STD_LOGIC ; SIGNAL y : OUTSTD_LOGIC );

        END axamp;

    在程序包首中定义过程首


    3 vhdl31

    3、VHDL进阶

    • 子程序

      • 过程在程序包中定义及调用实例

        PACKAGE BODY axamp IS--过程体定义

        PROCEDURE nand4a (SIGNAL a,b,c,d : IN STD_LOGIC ; SIGNAL y : OUTSTD_LOGIC ) IS

        BEGIN

        y<= NOT(a AND b AND c AND d);

        END nand4a;

        END axamp;

    注意用户自定义程序包应存放在当前工程目录中


    3 vhdl32

    3、VHDL进阶

    子程序的调用可以在进程中,也可以直接在结构体中

    • 子程序

      • 过程在程序包中定义及调用实例

        LIBRARY IEEE;--主程序

        USE IEEE.STD_LOGIC_1164.ALL;

        USE WORK.axamp.ALL;

        ENTITY EX IS

        PORT( e,f,g,h : IN STD_LOGIC ;

        x : OUT STD_LOGIC );

        END;

        ARCHITECTURE bhv OF EX IS

        BEGIN

        nand4a(e,f,g,h,x) ;--并行调用过程

        END;

    重载过程?


    3 vhdl33

    3、VHDL进阶

    • 用户自定义库(WORK库)的生成与使用

      • 定义程序包的一般语句结构如下:

        PACKAGE程序包名 IS

        --程序包首 程序包首说明部分

        END程序包名;

        PACKAGEBODY程序包名IS

        --程序包体 程序包体说明部分以及包体内

        END程序包名;


    3 vhdl34

    3、VHDL进阶

    程序包首可以用来存放定义的数据类型、数据对象

    • 用户自定义库(WORK库)的生成与使用

      • 举例

        PACKAGE pacl IS-- 程序包首开始

        TYPE byte IS RANGE 0 TO 255 ;

        -- 定义数据类型byte

        SUBTYPE nibble IS byte RANGE 0 TO 15 ;

        -- 定义子类型nibble

        CONSTANT byte_ff : byte := 255 ; -- 定义常数byte_ff

        SIGNAL addend : nibble ; -- 定义信号addend


    3 vhdl35

    3、VHDL进阶

    程序包首还可以用来存放元件声明和子程序首等

    • 用户自定义库(WORK库)的生成与使用

      • 举例

        COMPONENT byte_adder -- 定义元件

        PORT( a, b : IN byte ;

        c : OUT byte ;

        overflow : OUT BOOLEAN ) ;

        END COMPONENT ;

        FUNCTION my_function (a : IN byte) Return byte ;

        -- 定义函数

        END pacl ;-- 程序包首结束

    此举例并没有给出程序体

    程序体中应有函数的定义


    3 vhdl36

    3、VHDL进阶

    • 用户自定义库(WORK库)的生成与使用

      • 举例

        PACKAGE seven IS

        SUBTYPE segments is BIT_VECTOR(0TO 6);

        TYPE bcd IS RANGE 0 TO 9;

        ENDseven;

    该程序包首定义了两个用户数据类型


    3 vhdl37

    3、VHDL进阶

    • 用户自定义库(WORK库)的生成与使用

      • 举例

        USE WORK.seven.ALL ;

        -- WORK库默认是打开的,

        ENTITY decoder IS

        PORT (input: in bcd;

        drive : out segments);

        END decoder ;


    3 vhdl38

    3、VHDL进阶

    该例说明程序包首是必要的,但程序包体可选

    • 用户自定义库(WORK库)的生成与使用

      • 举例

        ARCHITECTURE simple OF decoder IS

        BEGIN

        WITHinputSELECT

        Drive <= B"1111110“ WHEN 0,

        B"0110000“ WHEN 1,

        B"1111011“ WHEN 9,

        B"0000000“ WHEN OTHERS;

        END simple ;

    选择信号赋值语句,功能同CASE语句,是并行语句


    3 vhdl39

    3、VHDL进阶

    • 操作符

      • 逻辑操作符

        • AND与BIT,BOOLEAN,STD_LOGIC

        • OR或BIT,BOOLEAN,STD_LOGIC

        • NAND与非BIT,BOOLEAN,STD_LOGIC

        • NOR或非BIT,BOOLEAN,STD_LOGIC

        • XOR异或BIT,BOOLEAN,STD_LOGIC

        • XNOR异或非 BIT,BOOLEAN,STD_LOGIC

        • NOT非BIT,BOOLEAN,STD_LOGIC


    3 vhdl40

    3、VHDL进阶

    • 操作符

      • 关系操作符

        • = 等于 任何数据类型

        • /= 不等于 任何数据类型

        • < 小于 枚举与整数类型,及对应的一维数组

        • > 大于 枚举与整数类型,及对应的一维数组

        • <= 小于等于 枚举与整数类型,及对应的一维数组

        • >= 大于等于 枚举与整数类型,及对应的一维数组


    3 vhdl41

    3、VHDL进阶

    • 操作符

      • 算术运算符

        • 求和操作符:+(加),-(减), &(并置)

          +(加),-(减)要求操作数为整数,位宽大于四位的加、减运算,综合器将调用库元件进行综合。

          &(并置)要求操作数为一维数组


    3 vhdl42

    3、VHDL进阶

    • 操作符

      • 算术运算符

        • 求积操作符: * , / , MOD, REM

          • * , /在QuartusII操作数应为整数,且运算符右边的操作数必须为2的乘方

          • MOD, REM在QuartusII中不支持


    3 vhdl43

    3、VHDL进阶

    • 操作符

      • 算术运算符

        • 符号操作符:+(正), - (负)

          • 单目操作符,操作数要求为整数


    3 vhdl44

    3、VHDL进阶

    • 操作符

      • 算术运算符

        • 混合操作符: ** , ABS

          • 要求操作数一般为整数

          • 乘方运算左边操作数可取浮点数,位右边必须为整数


    3 vhdl45

    3、VHDL进阶

    • 操作符

      • 算术运算符

        • 移位操作符: SLL,SRL,SLA,SRA,ROL,ROR

          • 使用格式:标识符 移位操作符 移位位数

            大多数综合器要求“标识符”为常数位矢量,如”11001”

            移位位数要求为整数

          • SLL和SRL为逻辑左、右移,空位用零补

          • SLA和SRA为算术左、右移,空位用最初首位来补

          • ROL和ROR为循环左、右移,空位用移出位填补


    3 vhdl46

    3、VHDL进阶

    • 操作符

      • 操作符的优先顺序

    括号可以改变运算优先顺序


    3 vhdl47

    3、VHDL进阶

    • 顺序语句

      • 赋值语句

        • 信号赋值语句 <=

        • 变量赋值语句 :=

      • IF语句

      • CASE语句

        • 分支语句when条件表达可能取值的说明

          单个普通数值,如6;数值选择范围,如(2 TO 4);并列数值,如3|5;混合方式,以上三种方式的混合。


    3 vhdl48

    3、VHDL进阶

    • 顺序语句

      • CASE语句

        • 分支语句when条件表达可能取值的说明

          CASE sel IS

          WHEN 0 => z1<='1' ;-- 当sel=0时选中

          WHEN 1|3 => z2<='1' ;-- 当sel为1或3时选中

          WHEN 4 To 7|2 => z3<='1';

          -- 当sel为2、4、5、6或7时选中

          WHEN OTHERS => z4<='1' ;

          -- 当sel为8~15中任一值时选中

          END CASE ;


    3 vhdl49

    3、VHDL进阶

    • 顺序语句

      • LOOP语句

        • 单个LOOP语句,其语法格式如下:

          [LOOP标号:] LOOP

          顺序语句(其中要有循环控制语句)

          END LOOP [ LOOP标号 ];

          ...

          L2 : LOOP

          a:=a+1;

          EXIT L2 WHEN a >10 ; -- 当a大于10时跳出循环

          END LOOP L2;


    3 vhdl50

    3、VHDL进阶

    • 顺序语句

      • LOOP语句

        • FOR_LOOP语句

          格式如下:

          [LOOP标号:] FOR循环变量 IN循环次数范围 LOOP

          顺序语句

          END LOOP [LOOP标号];


    3 vhdl51

    3、VHDL进阶

    • 顺序语句

      • LOOP语句

        • FOR_LOOP语句

          LIBRARY IEEE;--奇偶校验的例子

          USE IEEE.STD_LOGIC_1164.ALL;

          ENTITY p_check IS

          PORT ( a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);

          y : OUT STD_LOGIC);

          END p_check;


    3 vhdl52

    3、VHDL进阶

    • 顺序语句

      • LOOP语句

        • FOR_LOOP语句

          ARCHITECTURE opt OF p_check IS

          SIGNAL tmp :STD_LOGIC ;

          BEGIN PROCESS(a)

          BEGIN

          tmp <='0';

          FOR n IN 0 TO 7 LOOP

          tmp <= tmp XOR a(n);

          END LOOP ;

          y<= tmp; END PROCESS;

          END opt;

    循环变量不需要事先定义


    3 vhdl53

    3、VHDL进阶

    • 顺序语句

      • LOOP语句

        • 合理使用可简化同类顺序语句描述

          SIGNAL a, b, c : STD_LOGIC_VECTOR (1 TO 3);

          ...

          FOR n IN 1 To 3 LOOP

          a(n) <= b(n) AND c(n);

          END LOOP;

          此段程序等效于顺序执行以下三个信号赋值操作:

          a(1)<=b(1)ANDc(1);

          a(2)<=b(2)ANDc(2);

          a(3)<=b(3) AND c(3);


    3 vhdl54

    3、VHDL进阶

    • 顺序语句

      • NEXT语句

        • 常用三种格式:

          NEXT; -- 第一种语句格式

          NEXT LOOP标号; -- 第二种语句格式

          NEXT LOOP标号 WHEN 条件表达式;-- 第三种语句格式


    3 vhdl55

    3、VHDL进阶

    • 顺序语句

      • NEXT语句

        L1 : FOR cnt_value IN 1 TO 8 LOOP

        s1 : a(cnt_value) := '0';

        NEXT WHEN (b=c);

        s2: a(cnt_value + 8 ):= '0';

        END LOOP L1;


    3 vhdl56

    3、VHDL进阶

    • 顺序语句

      • NEXT语句

        L_x : FOR cnt_value IN 1 TO 8 LOOP

        s1: a(cnt_value):='0';

        k := 0;

        L_y : LOOP

        s2: b(k) := '0';

        NEXT L_x WHEN (e>f);

        s3: b(k+8) :='0';

        K := k+1;

        NEXT LOOP L_y ;

        NEXT LOOP L_x ;…


    3 vhdl57

    3、VHDL进阶

    • 顺序语句

      • EXIT语句

        • EXIT; -- 第一种语句格式

        • EXITLOOP标号; -- 第二种语句格式

        • EXITLOOP标号WHEN 条件表达式 --第三种语句格式


    3 vhdl58

    3、VHDL进阶

    • 顺序语句

      • EXIT语句

    • SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0);

    • SIGNAL a_less_then_b : Boolean;

    • ...

    • a_less_then_b <= FALSE ;

    • FOR I IN 1 DOWNTO 0 LOOP

    • IF (a(i)='1' AND b(i)='0') THEN

    • a_less_then_b <= FALSE ;

    • EXIT ;

    • ELSIF (a(i)='0‘ AND b(i)='1') THEN

    • a_less_then_b <= TRUE ;

    • EXIT;

    • ELSE NULL; END IF;

    • END LOOP;


    3 vhdl59

    3、VHDL进阶

    • 顺序语句

      • WAIT语句

        • WAIT; --第一种语句格式

        • WAIT ON信号表; --第二种语句格式

        • WAIT UNTIL 条件表达式;--第三种语句格式

        • WAIT FOR 时间表达式;

          --第四种语句格式,超时等待语句

    已列出敏感信号列表的进程中不能使用任何形式的WAIT语句


    3 vhdl60

    3、VHDL进阶

    • 顺序语句

      • WAIT语句

        SIGNAL s1,s2 : STD_LOGIC;

        ...

        PROCESS --无敏感信号列表

        BEGIN

        ...

        WAIT ON s1,s2;--等待信号的变化

        END PROCESS ;


    3 vhdl61

    3、VHDL进阶

    • 顺序语句

      • WAIT语句

        WAIT_UNTIL结构

        ...

        Wait until enable ='1';

        ...

        WAIT_ON结构

        LOOP

        Wait on enable;

        EXIT WHEN enable ='1';

        END LOOP;

    两种格式作用相同


    3 vhdl62

    3、VHDL进阶

    • 顺序语句

      • 子程序调用语句

        • 过程调用

          过程名[([形参名=>]实参表达式

          { ,[形参名=> ]实参表达式}) ];

        • 过程调用的三个步骤

          • IN,INOUT实参->形参

          • 执行过程

          • OUT,INOUT形参->实参


    3 vhdl63

    3、VHDL进阶

    子程序的调用可以在顺序

    结构中(如进程),也可

    以在并行结构中(如结构体)

    • 顺序语句

      • 子程序调用语句

        • 函数调用

          函数程名[([形参名=>]实参表达式

          { ,[形参名=> ]实参表达式}) ];

        • 函数调用的三个步骤

          • IN实参->形参

          • 执行函数

          • 函数结果由RETURN返回


    3 vhdl64

    3、VHDL进阶

    • 顺序语句

      • 子程序调用语句

    • PACKAGE data_types IS-- 定义程序包

      • SUBTYPE data_element IS INTEGER RANGE 0 TO 3 ;

      • TYPE data_array IS ARRAY (1 TO 3) OF data_element;

    • END data_types;

    • USE WORK.data_types.ALL

    • ENTITY sort IS

      • PORT ( in_array : IN data_array ;

      • out_array : OUT data_array);

    • END sort;

    • ARCHITECTURE exmp OF sort IS

    • BEGIN


    3 vhdl65

    3、VHDL进阶

    • 顺序语句

      • 子程序调用语句

    • PROCESS (in_array)

      • PROCEDURE swap(data : INOUT data_array;

      • low, high : IN INTEGER ) IS

      • VARIABLE temp : data_element ;

      • BEGIN-- 开始描述本过程的逻辑功能

        • IF (data(low) > data(high)) THEN-- 检测数据

          • temp := data(low) ;

          • data(low):=data(high);

          • data(high):=temp ;

        • END IF ;

      • END swap ;


    3 vhdl66

    3、VHDL进阶

    • 顺序语句

      • 子程序调用语句

    • VARIABLE my_array : data_array ;

    • BEGIN-- 进程开始

      • my_array := in_array ;-- 将输入值读入变量

      • swap(my_array,1,2);

      • -- my_array、1、2是对应于data、low、high的实参

      • swap(my_array,2,3);

      • swap(my_array, 1, 2);

      • out_array <= my_array ;

    • END Process ;

    • END exmp ;


    3 vhdl67

    3、VHDL进阶

    • 顺序语句

      • RETURN语句

        • RETURN;

          -- 第一种语句格式(用于过程,无返回值)

        • RETURN表达式;

          --第二种语句格式(用于函数,返回一个值)


    3 vhdl68

    3、VHDL进阶

    • 顺序语句

      • RETURN语句

    • PROCEDURE rs (SIGNAL s , r : INSTD_LOGIC; SIGNAL q ,nq : INOUT STD_LOGIC) IS

    • BEGIN

      • IF( s='1‘ AND r='1')THEN

        • REPORT "Forbidden state : s and r are quualto '1'";

        • RETURN ;

      • ELSE

        • q<=s AND nq AFTER 5ns;

        • nq<=s AND q AFTER 5ns;

      • END IF ;

    • END PROCEDURE rs ;


    3 vhdl69

    3、VHDL进阶

    • 顺序语句

      • RETURN语句

    • FUNCTION opt (a, b, opr :STD_LOGIC)RETURN STD_LOGIC IS

    • BEGIN

      • IF (opr ='1') THEN RETURN(a AND b);

      • ELSERETURN (a OR b) ;

      • END IF ;

    • END FUNCTION opt ;


    3 vhdl70

    3、VHDL进阶

    • 顺序语句

      • 空操作语句

        • NULL语句不完成任何的操作,使逻辑流程进入下一步语句的执行


    3 vhdl71

    3、VHDL进阶

    • 并行语句

      • 并行信号赋值语句

        • 简单信号赋值语句

          赋值目标 <= 表达式

        • 条件信号赋值语句

          赋值目标 <= 表达式 WHEN 赋值条件 ELSE

          表达式 WHEN 赋值条件 ELSE

          ...

          表达式;


    3 vhdl72

    3、VHDL进阶

    • 并行语句

      • 并行信号赋值语句

        • 选择信号赋值语句

          WITH 选择表达式 SELECT

          赋值目标信号 <= 表达式 WHEN 选择值

          表达式 WHEN 选择值

          ...

          表达式 WHEN 选择值;


    3 vhdl73

    3、VHDL进阶

    • 并行语句

      • 并行信号赋值语句

        • 选择信号赋值语句

    • Instruction <= c & b & a ;

    • WITH instruction SELECT

    • dataout <= data1 AND data2 WHEN "000“ ,

    • data1 OR data2 WHEN “001”,

    • data1 NAND data2 WHEN “010”,

    • data1 NOR data2 WHEN “011”,

    • data1 XOR data2 WHEN “100”,

    • data1 XNOR data2 WHEN"101",

    • 'Z‘ WHEN OTHERS ;


    3 vhdl74

    3、VHDL进阶

    • 并行语句

      • 并行过程调用语句

        • 与顺序调用的格式相同,不同之处在于调用的位置出现在结构体中

        • 过程定义的位置不能在进程中,只能在结构体或程序包中


    3 vhdl75

    3、VHDL进阶

    • 并行语句

      • 生成语句

        • 有复制作用,简化有规则性的设计结构

        • 两种格式


    3 vhdl76

    3、VHDL进阶

    • 并行语句

      • 生成语句

        • 有复制作用,简化有规则性的设计结构

        • 两种格式


    3 vhdl77

    3、VHDL进阶

    • 并行语句

      • 生成语句

      • COMPONENT comp

      • Port(x:IN STD_LOGIC;

      • y: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 a’RANGE GENERATE

      • U1:comp PORT MAP(x=>a(i),y=>B(i));

      • END GENERATE gen;


    3 vhdl78

    3、VHDL进阶

    • 并行语句

      • REPORT语句

        • 产生报告,但不综合成电路

        • 往往和条件语句或在断言语句中出现

        • 格式:REPORT<字符串>;


    3 vhdl79

    3、VHDL进阶

    • 并行语句

      • 断言语句

        • 调试时人机交互,不综合成电路

        • 可以作为顺序语句或并行语句调用

        • 格式:

          ASSERT<条件表达式>

          REPORT<出错信息>

          SEVERITY<错误级别>;


    3 vhdl80

    3、VHDL进阶

    • 并行语句

      • 断言语句

        • 断言语句使用规则

          • 条件表达式由设计人员给出,条件为真时一切正常,假时则执行语句

          • REPORT报告字符可缺省,默认为“Assertion Violation”

          • SEVERITY错误级别也可缺少,默认为“Error”

          • 四个错误级别:Note,Warning,Error,Failure


    3 vhdl81

    3、VHDL进阶

    • 并行语句

      • 断言语句

    P1:ROCESS(R,S) --断言语句的顺序调用,在进程中

    VARIABLE D:STD_LOGIC;

    BEGIN

    ASSERT NOT (R=‘1’ AND S=‘1’)

    REPORT “BOTH R AND S EQUAL TO ‘1’”

    SEVERITY ERROR;

    IF R=‘1’ AND S=‘0’ THEN D:=‘0’;

    ELSIF R=‘0’ AND S=‘1’ THEN D:=‘1’;

    END IF;

    Q<=D;QF<=NOT D;

    END PROCESS;


    3 vhdl82

    3、VHDL进阶

    • 并行语句

      • 属性描述与定义语句

        • 用于对信号或其他项目的多种属性检测或统计

          • 具有属性的项目:类型、子类型、过程、函数、信号、变量、常量、实体、结构体、配置、程序包、元件和语句标号;

          • 综合器支持的属性有:LEFT,RIGHT,HIGH,LOW,RANGE,REVERS RANGE,LENGTH,EVENT,STABLE等。

          • 语句格式:属性项目测试名‘属性标识符


    3 vhdl83

    3、VHDL进阶

    • 并行语句

      • 属性描述与定义语句

        • 信号类属性(EVENT,STABLE)

          • 表示信号在δ时间内有(无)事件发生

          • 以下两条语句功能一样

            NOT(CLOCK’STABLE AND CLOCK=‘1’)

            --不能被综合

            CLOCK’EVENT AND CLOCK=‘1’

          • 实际中EVENT 比STABLE 更常用


    3 vhdl84

    3、VHDL进阶

    • 并行语句

      • 属性描述与定义语句

        • 数据区间类属性(RANGE、REVERSE RANGE)

          • 对属性项目取值区间进行测试,返回一个区间,而不是一个具体的值

            SIGNAL range1:IN STD_LOGIC_VECTOR(0 TO 7)

            FOR i IN range1’RANGE LOOP

            --等效FOR i IN 0 TO 7 LOOP

          • 如果使用REVERSE RANGE则返回是

              ‘7 DOWNTO 0’


    3 vhdl85

    3、VHDL进阶

    • 并行语句

      • 属性描述与定义语句

        • 数值类属性(LEFT,RIGHT,HIGH,LOW)

          • 常用在数组索引值的测试

        • 数组属性 LENGTH

          • 对数组的宽度和元素的个数进行测试

        • 用户定义属性

          • 需要综合器支持的程序包

          • 格式:

            ATTRIBUTE 属性名:数据类型;

            ATTRIBUTE 属性名 OF 对象名:对象类型 IS 值;


    5736069

    本讲主要内容

    • 常用实例及其语法

      多路选择器、寄存器、全加器、计数器等

    • VHDL基本语法

      基本语言要素(信号、变量等)、常用用语句(IF、CASE)、进程和并行语句的概念等

    • VHDL进阶

      类属参数、子程序(函数、过程)、自定义库使用、顺序并行语句(LOOP、NEXT等)、属性描述与定义语句


  • Login