?问答题20分
?填空题10分
?选择题10分
?程序分析题30分
?编程题30分
简答题
1. VHDL 的全称是什么?利用它设计硬件电路有哪些优点?
答:VHDL 的全称Very High Speed Integrated Circuit Hardware Description Language(超高速集成电路硬件描述语言,利用VHDL 设计硬件电路具有以下特点:
(1)设计文件齐全、方法灵活、支持广泛
(2)系统硬件描述能力强
(3)VHDL 语言可以与工艺无关编程
(4)VHDL 语言标准、规范、易于共享和复用
2.一个完整的VHDL语言程序由哪几个部分构成,每个部分作用是什么。
答:一个完整的VHDL语言程序由库,包集合,实体,构造体和配置五个部分组成。库包含若干个包集合,确定程序所需要调用的函数,数据类型等;包集合内存有具体函数,数据类型的定义;实体说明系统的端口与类属参数;构造体完成系统内部逻辑关系与具体电路的实现;配置则说明实体与构造体的连接关系,通过配置,同一实体可搭配不同构造体。
3.简述VHDL语言构造体的描述方式及各自特点。
答:行为描述,RTL描述方式,结构描述方式。行为描述主要是对系统数学模型的描述,一般进行仿真难以进行逻辑综合;RTL描述主要是对系统内部构造与逻辑关系的描述,可以进行逻辑综合;结构描述大量使用模块化描述方式,采用component语句,block语句,便于实现积木化结构,能够进行逻辑综合。
4.VHDL 语言中客体的概念及使用范围
VHDL 语言中可以赋予一个值的对象称为客体;客体主要包括三种:信号、常数、变量;信号和常数为全局量,变量为局部量
5.请从申明格式、赋值符号、赋值生效时间、作用范围等方面对信号和变量进行比较分析。答:①申明时关键字不一样,变量为:V ARIABLE;信号为:SIGNAL。但申明时赋初值均用“:=”符号。
②赋值符号不同:信号赋值用“﹤=”;变量赋值用“:=”。
③赋值生效时间:信号赋值△延时后生效;变量赋值立即生效。
④声明引用范围:信号在构造体内(进程外)申明,整个构造体内有效;变量主要在进程内申明,只在进程内有效。
6.Bit数据类型和std_logic数据类型有什么区别。
?答:Bit表示一位的信号值,取值只能为1或0;std-logic取值为9值逻辑系统有1,0,X, 高阻态等;std-logic前需要加入下列语句:Library ieee;Use ieee.std_logic_1164.all; Bit前不需要加。
7.写出五种以上的VHDL语言的标准数据类型。
布尔(BOOLEAN)数据类型、位(BIT)数据类型、位矢量(BIT_VECTOR)数据类型
字符(CHARACTER)数据类型、整数(INTEGER)数据类型、实数(REAL)数据类型
字符串(STRING)数据类型、时间(TIME)数据类型
8. 说明下列各定义的意义:
SIGNAL A , B , C : BIT : =’0’;
CONSTANT m1 , m2 : TIME : 10ns ;
V ARIABLE temp1,temp2 : STD_LOGIC :=’x’;
答:○1定义3个位数据类型的信号A、B、C,它们取值为0;
○2定义2个时间数据类型的常量m1、m2,它们值为10ns;
○3定义3个标准逻辑位STD_LOGIC数据类型的变量temp1、temp2,它们的值是X。
9、顺序语句和并行语句有什么区别?VHDL编程中需要注意些什么?
答:并行语句主要有一般信号赋值语句、条件信号赋值语句、选择信号赋值语句;顺序语句主要有顺序控制语句(如:if语句、case语句、循环语句等)和wait语句。
并行语句存在于进程外,并发执行,与语句所处的位值无关;顺序语句存在于进程内,语句按顺序执行,与语句所处的位值有关。VHDL编程中,顺序控制语句(如:if语句、case语句、循环语句等)必须存在于进程内。
10.简述VHDL语言中端口模式IN,OUT,BUFFER和INOUT 各自的特点及OUT与BUFFER的主要区别?
答:端口模式中各自的含义与特点为:IN:输入;OUT:输出;BUFFER:带反馈的输出,可读可写;INOUT:双向。
OUT,BUFFER的区别:OUT模式下的信号,在程序中只能作为对象被赋值,不能作为源赋给其他信号;BUFFER模式下的信号,在程序中既可作为对象被赋值,又可作为源赋给其他信号,对象和源是同时发生,是同一个信号。
11. 进程语句是设计人员描述结构体时使用最为频繁的语句,简述其特点。
答:a.它可以与其它进程并发执行,并可存取结构体或实体中所定义的信号;b.进程结构中的所有语句都是按顺序执行的 c.为了启动进程,在进程结构中必须包含一个显式的敏感信号量表或者包含一个wait语句;d.进程之间的通信是通过信号量的传递来实现的
12. 简述元件例化语句的作用、组成及格式?
答:把已经设计好的设计实体称为一个元件或一个模块,它可以被高层次的设计调用。调用时就会用到元件声明和元件例化语句。二者缺一不可。
元件声明格式如下
COMPONENT 元件实体名
PORT(元件端口信息);
END COMPONENT;
元件例化格式如下
标号名:元件名PORT MAP (端口列表);
判断题
1. 数100在VHDL语言中既可以表示整数又可以表示实数。(×)
2. 在进程中任意交换语句的顺序,其执行结果不变。(×)
3. WAIT FOR 语句后面要求接敏感信号量。(×)
4. 在IF语句的条件表达式中只能使用关系运算操作及逻辑运算操作的组合表达(√)
5. 在使用进程时,敏感信号量必须跟在PROCESS()的括号中。(√)
6. WORK库是现行作业库。设计者所描述的VHDL语句不需要任何说明,将都存放在WORK 库中。(√)
7. 在端口方向的描述中,BUFFER定义的信号不能供构造体再使用,而OUT定义的信号则可以再供构造体使用。(×)
8. 一条信号代入语句,不能用一个进程来描述。(×)
9. 代入符号两边信号量只要求数据类型一致。(×)
10.VHDL语言中,逻辑运算左右有优先级别,且是从左至右运算(×)
1. 硬件描述语言HDL给PLD和数字系统的设计带来了更新的设计方法和理念,产生了目前最常用的并称之为的设计法。(选填自顶向下 /自底向上)
2.一个构造体可以使用几个子结构,即相对比较独立的几个模块来构成。VHDL语言可以有以下3种形式的子结构描述: BLOCK 语句; PROCESS 语句; UBPROGRAMS 语句结构。
3. 目前可编程逻辑器件的两种主要类型是 EPGA (现场可编程门阵列) 和 CPLD (复杂可编程逻辑器件)
4. 实体说明和构造体是设计实体的基本组成部分,它们可以构成最基本的VHDL程序。
5. COMPONENT语句中映射方式包括位置和名称。
6. VHDL有逻辑、算术、关系、并置四类运算操作符。
7.一个时钟信号CLK的上升沿条件表示为 clk’event and clk=’1’。一个时钟信
号CLK的下降沿条件表示为 clk’event and clk=’0’。
8. 设D0为‘0’, D1为‘0’, D2为‘1’, D2 & D1 & D0 的运算结果是 100 。
9.VHDL的基本描述语句包括一系列顺序和并行两大基本描述语句。
10. NOT是逻辑运算符,表示取反,在所有操作符中优先级—最高。
11. 数字3在VHDL中的整数表示和实数表示分别是 3 和 3.0 。
12.bit类型和std_logic类型的数值状态分别是 2位和 9位。
13. VHDL中操作符“&”的具体名称是:并置运算符,它的基本功能是:用于位的连接。
14.在VHDL中最常用的库是 IEEE 标准库,最常用的数据包是 STD LOGIC_1164 。
15.VHDL的标识符名必须以字母开头,后跟若干字母、数字或单个下划线构成,但最后不能为下划线
16. 程序中为变量赋值的符号是 := 为信号赋值的符号是 <= _____
17. 在一个实体的端口方向说明时,输入使用in表示,那么构造体内部不能再使用的输出是用 OUT 表示;双向端口是用 INOUT 表示;构造体内部可再次使用的输出是用表示 BUFFER
18.运算操作符是有优先级的,逻辑操作符 NOT 在所有的操作符中优先级最高。
19. 当前最流行的并成为IEEE标准的硬件描述语言包括___VHDL___ 和___Verilog-HDL___ 。
20. 表示‘0’‘1’;两值逻辑的数据类型是 BIT ,表示‘0’‘1’‘X’‘Z’等九值逻辑的数据类型是_STD-LOGIC____ 。表示空操作的数据类型是 __null___ 。
21. VHDL程序的基本结构由实体说明、构造体、包集合、库、和__配置 _五部分组成。
22. 构造体的描述方式包括三种,分别是行为、寄存器传输、和结构。
23. 在VHDL的端口声明语句中,端口方向包括 in 、 out 、 inout 、和___buffer_。
24. VHDL的客体包括是信号、常数、和变量,它们是用来存放各种类型数据的容器。
1. 以下哪一种数据类型不属于VHDL的标准数据类型: C
(A)ASCII字符(B)错误等级
(C)STD_LOGIC (D)字符串
2. wait until clk ’event and clk=’0’的程序解释是:__A_。
A.等待clk信号产生下降沿
B.等待clk信号产生上升沿
C.等待clk信号变成高电平
D.等待clk信号变成低电平
3. 以下关于客体的论述,正确的是: A
(A)常数一经赋值就无法改变(B)变量的物理载体是系统的中间连线
(C)信号是局部量 (D) 变量用“<=”代入,信号用“:=”代入
4. 以下关于进程语句的描述,错误的是: D
(A)进程语句的执行与挂起决定于敏感信号量的变化
(B)进程与进程之间是并发的,进程内部的语句是顺序执行的
(C)进程语句可以不设敏感信号量,而使用WAIT语句代替
(D)并发信号代入语句不能用进程语句来代替
5. VHDL最常用的库是 A 。
A、IEEE;
B、STD;
C、WORK;
D、PACKAGE。
6. 以下对于WAIT语句的使用,哪一项是正确的: ( D )
(A)process(a,b) (B)process
begin begin
Y<= a and b; Y<=a and b;
wait on a,b; wait for a,b;
end process; end process;
(C)process (a,b) (D)process
begin begin
Y<= a and b; Y<=a and b;
wait for a, b; wait on a,b;
end process; end process;
7、在下列标识符中,()是VHDL合法的标识符。 C
A、4h_adde
B、h_adde_;
C、h_adder;
D、_h_adde
8、基于硬件描述语言的数字系统设计目前最常用的设计方法称为( B )设计法。
A、自底向上;
B、自顶向下;
C、积木式;
D、顶层。
9、在VHDL中,( D)的数据传输是立即发生的,不存在任何延时的行为。
A、信号;
B、常量;
C、数据;
D、变量
10、在VHDL中,( A)的数据传输是不是立即发生的,目标信号的赋值需要一定的延时时间。
A、信号;
B、常量;
C、数据;
D、变量
11、在VHDL中,为目标变量赋值的符号是(C )。
A、=:;
B、= ;
C、:= ;
D、<=
12、VHDL的实体声明部分用来指定设计单元的(D )
A、输入端口;
B、输出端口;
C、引脚;
D、以上均可
13. 下面数据中属于实数的是( A )。
A. 4.2
B. 3
C. ‘1’
D.“11011”
14、一个设计实体可以拥有一个或多个( B )
A、设计实体;
B、构造体;
C、输入;
D、输出
15、在元件例化语句中,用( C )符号实现名称映射,将例化元件端口声明语句中的信号名与PORT MAP中的信号名关联起来。
A、=;
B、:=;
C、=>;
D、<=
16、在VHDL中,为了使已声明的数据类型、子程序、元件能被其它设计实体调用和共享,可以把它们汇集在(D)中。
A、设计实体;
B、程序库;
C、构造体;
D、包集合
17、 VHDL中,FOR LOOP语句中的循环变量是一个临时变量,属于LOOP语句的局部变量,( B )事先声明。
A、必须;
B、不必;
C、其类型要;
D、其属性要
18.在VHDL中,语句“FOR i IN 0TO7LOOP”定义循环次数为( A)
A、8;
B、7;
C、0;
D、1
19. WITH_SELECT语句属于( C )语句。
A、顺序
B、顺序或并行
C、并行
D、二者都不是
20.下面数据中属于位矢量的是( D)。
A. 1.1
B. 5
C. ‘0’
D. “1011”
21. IF语句是 A_
A. 顺序语句
B.顺序或并行
C. 并行语句
D. 其它
22.在VHDL中,含WAIT语句的进程PROCESS的括号中后( B )再加敏感信号,否则是非法的。
A、可以;
B、不能;
C、任意;
D、只能
23. VHDL语言共支持四种常用库,其中哪种库是用户的VHDL设计现行工作库:__D___ A.IEEE库 B.VITAL库 C. STD库 D. WORK工作库
24、如果a=0,b=0,则逻辑表达式(a AND b) OR( NOT b AND a)的值是 A 。
A. 0
B. 1
C. 2
D. 不确定
25. 如果a=1,b=0,则逻辑表达式(a XOR b) OR( NOT b AND a)的值是 B 。
A. 0
B. 1
C. 2
D. 不确定
分析题举例
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity JS64 is
port(clk,clr,updn: in std_logic;
qa,qb,qc,qd,qe,qf: out std_logic);
end entity JS64;
architecture rtl of JS64 is
signal count_6:std_logic_vector(5 downto 0);
begin
qa<=count_6(0);
qb<=count_6(1);
qc<=count_6(2);
qd<=count_6(3);
qe<=count_6(4);
qf<=count_6(5);
process(clr,clk) is
begin
if (clr=’1’) then
count_6<=(other=>’0’);
elsif (clk’event and clk=’1’) if (updn=’1’) then
count_6<=count_6+’1’;
else
count_6<=count_6–’1’;
end if;
end if;
end process;
end architecture rtl;
该程序采用if多嵌套语句描述的是一个64进制的可逆计数器。
clk是时钟信号;clr是高电平信号有效的复位信号;UPDN为控制端,当其为“1”时,进行加法计数,为“0”时进行减法计数。qa,qb,qc,qd,qe,qf为6位输出位。程序第三行调用了标准逻辑无符号程序包。构造体内部使用了进程语句。进程语句内使用if语句,复位信号优先级别最高,时钟信号次之。该计数器是异步复位。
编程题有三道,能根据真值表写出VHDL程序;能根据电路原理图写出VHDL程序;一般常用的编程语句能熟练运用
1.课本中第八章中逻辑电路设计,是考试重点,一些程序和类似程序会在考试中以程序分析题和编程题形式出现。(以课本及上课PPT为参考)
2.除了第八章外,例1-1 例1-2 例5-2 例5-5例6-8 例6-9 例6-10 例6-12 例6-13,这些程序也很经典,
VHDL 基础语法篇——VHDL VHDL硬件描述语言 1.1 VHDL概述 1.1.1 VHDL的特点 VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于 VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原 语句,如if语句、子程序和函数等,便于阅读和应用。具体特点如下: 1. 支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下 (top-down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。 2. VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设 计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数 据传送。利用单元(componet)、块(block)、过程(procure)和函数(function)等语句, 用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文 档资料的保存和广泛使用。 3. VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL 的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。既支持预定义的数 据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类 型语言。 4. 数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行 和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构 和行为状态。 1.1.2 VHDL语言的基本结构 VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级 语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字 逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。但是VHDL毕竟是一种描述 数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的 语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者 感到枯燥无味,不得要领。较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整 体的程序结构,再逐步介绍程序中的语法概念。 一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路, 或者是一个计数器,也可以是一个CPU。一般情况下,一个完整的VHDL语言程序至少要包含程序包、实体和结构体三个部分。实体给出电路单元的外部输入输出接口信号和引脚信 息,结构体给出了电路单元的内部结构和信号的行为特点, 程序包定义在设计结构体和实体 中将用到的常数、数据类型、子程序和设计好的电路单元等。 一位全加器的逻辑表达式是: S=A⊕B⊕Ci Co=AB+ACi+BCi 全加器的VHDL程序的文件名称是fulladder.VHD,其中VHD是VHDL程序的文件扩展名, 程序如下: LIBRARY IEEE; --IEEE标准库 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fulladder IS -- fulladder是实体名称 PORT( A, B, Ci : IN STD_LOGIC; --定义输入/输出信号 Co, S : OUT STD_LOGIC ); END fulladder; ARCHITECTURE addstr OF fulladder IS --addstr是结构体名 BEGIN S <= A XOR B XOR Ci; Co <= (A AND B) OR (A AND Ci) OR (B AND Ci); END addstr; 从这个例子中可以看出,一段完整的VHDL代码主要由以下几部分组成: 第一部分是程序包,程序包是用VHDL语言编写的共享文件,定义在设计结构体和实体
VHDL语言的基本知识点罗列 1 VHDL语言的标识符 VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则: a)标识符由字母(A…Z;a…z)、数字和下划线字符组成。 任何标识符必须以英文字母开头。λ 末字符不能为下划线。λ b)不允许出现两个连续下划线。 标识符中不区分大小写字母。λ VHDL定义的保留子或称关键字,不能用作标识符。λ c) VHDL中的注释由两个连续的短线(--)开始,直到行尾。 以下是非法标识符: -Decoder —起始不能为非英文字母 3DOP —起始不能为数字 Large#number —“#”不能成为标识符的构成符号 Data__bus —不能有双下划线 Copper_ —最后字符不能为下划线 On —关键字不能用作标识符。 注:在AHDL语言中标识符要区分大小写,但在VHDL语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。 标识符表示的几种数据对象的详细说明如下: 1) 常数(Constant ) 常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读和修改。常数一被赋值就不能在改变。一般格式: CONSTANT 常数名:数据类型:=表达式; 例:CONSTANT Vcc: REAL: =5.0; —设计实体的电源电压指定 常数所赋得值应与定义的数据类型一致。 常量的使用范围取决于它被定义的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。 2) 变量(Variable) 变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。 一般格式: VARIABLE 变量名数据类型约束条件:=表达式; 例:VARIABLE x,y:INTEGER; —定义x,y为整数变量 VARIABLE count: INTEGER RANGE0 TO255:=10; —定义计数变量范围 变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。 变量赋值语句的语法格式如下:
上篇基础元素 目录:数据类型数据对象运算符语句基本程序结构电路描述方式 数据类型 预定义类型 bit bit_victor integer std_logic std_logic_victor 自定义类型 枚举类型 type 新数据类型 is (元素1, 元素2, ...) 例定义 type state_type is (s1, s2, s3. s4); -- 定义一个新类型state_type 引用 signal state : state_type; -- 定义一个信号state,类型为state_type 数组类型 type 数组 is array (范围) of 数据类型; 例定义 type byte is array (7 downto 0) of bit; -- 定义一个8bit的数组 type word is array (31 downto 0) of bit; -- 定义一个32bit的数组 数据对象 端口声明端口 : in | out 数据类型; -- 端口在特性上等同于信号,但赋值在entity的port中赋值端口 <= 表达式; 信号声明signal 信号 : 数据类型; 赋值信号 <= 表达式; 变量声明varable 变量 : 数据类型; 赋值变量 := 表达式; 常数声明常数 : 数据类型 := 数值; 运算符 算术运算 +, -, * 并置运算 & 关系运算 =, /=, <, <=, >, >= 逻辑运算 and, or, not, nand, nor, xor, xnor 语句 并行语句 ⑴信号赋值语句 简单信号赋值语句信号 <= 表达式; 选择信号赋值语句 with 选择表达式 select
第四章VHDL的语言要素 4.1 VHDL的数据对象 与其他高级语言一样,VHDL中把用来承载数据的容器叫做VHDL的数据对象,VHDL的数据对象主要有信号、常量和变量三类。 1 常量 在VHDL中,常量是一种不变的量,它只能在对它定义时进行赋值,并在整个程序中保持该值不变。常量的功能一方面可以在电路中代表电源、地线等,另一方面可提高程序的可读性,也便于修改程序。常量定义的格式为: CONSTANT 常量名:数据类型:=表达式; [例3.4] 常量定义举例 CONSTANT V: INTEGER:=8; 2 变量 变量是临时数据的容器,它没有物理意义,并且只能在进程和子程序中定义,也只能在进程和子程序中使用。变量一旦赋值立即生效。变量定义的描述格式为:VARIABLE 变量名:数据类型[:=表达式]; [例3.5]变量定义举例 VARIABLE y: INTEGER; 3 信号 信号是VHDL的一种重要数据对象,它定义了电路中的连线和元件的端口。其中端口和内部信号定义的差别是在端口定义中多了一个端口模式的定义。信号是一个全局量,可以用来进行各模块之间的通信。信号定义的格式为: SIGNAL 信号名:数据类型; [例3.6]信号定义举例 SIGNAL A: STD_LOGIC; 4.2 VHDL的数据类型 VHDL是一种强类型的语言,每一个数据对象都必须具有确定的数据类型定义,并且只有在相同数据类型的数据对象之间,才能进行数据交换。VHDL预定义了大量的数据类型,下面介绍几种最常用的数据类型。 1 整数数据类型(INTEGER) 整数类型的数有正整数负整数和零,在VHDL中其取值范围是:
VHDL语言的基本要素 一、数据对象 VHDL语言的主要数据对象有信号,变量,常量。 信号—信号是电路中的物理量,对应于电路的连线、节点;信号说明全局量,用于描述中的构造体(Architecture), 实体(Intity),程序包(package)。 变量—变量是程序运算中的中间量,并不对应电路中的物理量。变量说明局部量,用于进程语句(process), 函数(Function), 过程(procedure)。 常量—常数也不对应电路中的物理量,当常量说明全局量,在构造体(Architecture), 实体(Intity),程序包(package),进程语句(process), 函数(Function), 过程(procedure)中均可使用。数据对象的定义格式: signal 信号名:数据类型,约束条件,表达式 Variable 变量名:数据类型,约束条件:=表达式 Constant 常量名:数据类型,约束条件:=表达式 例如:Variable count:INTEGER RANGE 0 TO 255:=10 Constant Daly:Time:=100ns 信号代入和变量赋值的区别:两者形式不同,操作过程也不相同。变量赋值符“:=”,信号的代入符“<=”。 在变量的赋值语句中,该语句一当执行,其值立即将赋予变量;而信号的代入,其语句执行后不会立即使信号发生代入,在下条语句
执行时,仍使用原来的信号值,如进程语句中的敏感表的信号代入就是如此。 二、数据类型 VHDL语言中的数据类型,一般而言可分为:标量类型和组合类型。在实际使用中,也可分成予定义类型和用户定义类型。VHDL语言是强类型的语言,主要可按如下分类和变换处理。 ①标准数据类型 ⑴整数⑵实数(浮点数)-1.0E+38~+1.0E38 ⑶位bit (0,1) ⑷位矢量⑸布尔量,“假”,“真”⑹字符(ASCⅡ)字符 ⑺时间 ⑻错误等级⑼自然数(大于等于0的整数)⑽字符串 (字符矢量) ②用户定义的数据类型 TYPE 数据类型名{数据类型名} 数据类型定义 ⑴枚举类型⑵整数类型⑶实数类型⑷数组类型 ⑸存取类型⑹文件类型⑺记录类型⑻时间类型③用户定义子类型 SUBTUPE 子类型名IS 数据类型名[范围] 例:SUBTYPE digit is INTEGER RANGE 0 TO 9 ④数据类型转换 数据类型的变换函数通常由“STD_LOGIC_1164”,
VHDL硬件描述语言 1.1 VHDL概述 1.1.1 VHDL的特点 VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于 VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原 语句,如if语句、子程序和函数等,便于阅读和应用。具体特点如下: 1. 支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下 (top-down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。 2. VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设 计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数 据传送。利用单元(componet)、块(block)、过程(procure)和函数(function)等语句, 用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文 档资料的保存和广泛使用。 3. VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL 的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。既支持预定义的数 据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类 型语言。 4. 数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行 和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构 和行为状态。 1.1.2 VHDL语言的基本结构 VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级 语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字 逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。但是VHDL毕竟是一种描述 数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的 语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者 感到枯燥无味,不得要领。较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整 体的程序结构,再逐步介绍程序中的语法概念。 一个VHDL语言的设计程序描述的是一个电路单元,这个电路单元可以是一个门电路, 或者是一个计数器,也可以是一个CPU。一般情况下,一个完整的VHDL语言程序至少要包含程序包、实体和结构体三个部分。实体给出电路单元的外部输入输出接口信号和引脚信 息,结构体给出了电路单元的内部结构和信号的行为特点, 程序包定义在设计结构体和实体 中将用到的常数、数据类型、子程序和设计好的电路单元等。 一位全加器的逻辑表达式是: S=A⊕B⊕Ci Co=AB+ACi+BCi 全加器的VHDL程序的文件名称是fulladder.VHD,其中VHD是VHDL程序的文件扩展名, 程序如下: LIBRARY IEEE; --IEEE标准库 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fulladder IS -- fulladder是实体名称 PORT( A, B, Ci : IN STD_LOGIC; --定义输入/输出信号 Co, S : OUT STD_LOGIC ); END fulladder; ARCHITECTURE addstr OF fulladder IS --addstr是结构体名 BEGIN
填空题 1、一个标准的VHDL语言程序由库、实体和结构体组成。 2、个完整的VHDL语言描述是以对一个功能元件的完整描述为基础的 3、实体相当于电路图中一个器件符号。 4、端口说明( PORT )是对设计实体与外部接口的描述,也可以说是设计实体的外 部引脚的名称,它为实体与外部环境的动态通信提供通道 5、缓冲( BUFFER )端口描述模式和 INOUT 双向模式的区别在于只能接受一个驱动源,不允许多重驱动。 6、 VHDL语言的结构体的这些子结构互相之间是并行的。 7、将 VHDL语言的行为描述语句转换为门级描述由VHDL开发工具自动完成,是 VHDL 语言综合器的任务。 8、数据流描述也称为RTL (寄存器传输级)描述方式,它类似于布尔方程,它既 表示某种行为,又隐含结构信息,主要指非结构化的并行语句描述。 9、在结构描述中,元件间的连接是通过定义的端口界面来实现的。 10、结构描述的缺点是程序表示的是电路的结构连接关系,不能直观的得到设计电 路的逻辑功能。 综述题 1、写出实体的结构。 答案: ENTITY 实体名IS [GENERIC( 类属表 );] [PORT( 端口表 );] END ENTITY实体名; 2 、在 IEEE 库中定义了哪四种VHDL 语言的端口模式? 答案: IN :输入。 OUT :输出。 INOUT :双向,输入输出。 BUFFER :缓冲,其实质也是双向的,但是只能接受一个驱动源。 3、写出结构体的结构。
?2 ? 答案: ARCHITECTURE 结构体名OF 实体名IS [ 说明语句 ] BEGIN [ 功能描述语句] END ARCHITECTURE结构体名; 4 、写出结构体的功能性描述语句的 5 种子结构。 答案: 块语句、进程语句、子程序调用语句、信号赋值语句和元件例化语句。 5 、 VHDL 有哪四种描述风格? 答案: 行为描述、数据流描述、结构描述以及由前三种组合的混合描述。 实验题 实验【一】编写一个实体 实验目的:熟悉实体的编写方法。 实验任务:在 Quartus II 中建立一个 VHDL 语言文件,编写一个实体,该实体要求如下: 实体名: TEST 。 输入端口: INPUTA , INPUTB ,数据类型为BIT 。 输出端口: OUTPUT ,数据类型为BIT 。 没有类属说明。 答案: ENTITY TEST IS -- 实体 PORT( INPUTA,INPUTB: in bit; OUTPUT: out bit); --2 个输入引脚,类型BIT --1 个输出引脚,类型BIT END TEST; 实验【二】编写一个结构体 实验目的:熟悉结构体的编写方法。
VHDL常用语法列表 1 VHDL语言的标识符 VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则: a)标识符由字母(A…Z;a…z)、数字和下划线字符组成。 任何标识符必须以英文字母开头。 末字符不能为下划线。 b)不允许出现两个连续下划线。 标识符中不区分大小写字母。 VHDL定义的保留子或称关键字,不能用作标识符。 c) VHDL中的注释由两个连续的短线(--)开始,直到行尾。 以下是非法标识符: -Decoder —起始不能为非英文字母 3DOP —起始不能为数字 Large#number —“#”不能成为标识符的构成符号 Data__bus —不能有双下划线 Copper_ —最后字符不能为下划线 On —关键字不能用作标识符。 注:在AHDL语言中标识符要区分大小写,但在VHDL语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。 2 VHDL的数据对象 标识符表示的几种数据对象的详细说明如下: 1) 常数(Constant ) 常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读和修改。常数一被赋值就不能在改变。一般格式: CONSTANT 常数名:数据类型:=表达式; 例:CONSTANT Vcc: REAL: =5.0;--设计实体的电源电压指定 常数所赋得值应与定义的数据类型一致。 常量的使用范围取决于它被定义的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。 2) 变量(Variable) 变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。 一般格式: VARIABLE 变量名数据类型约束条件:=表达式; 例:VARIABLE x,y:INTEGER; —定义x,y为整数变量 VARIABLE count: INTEGER RANGE0 TO255:=10; —定义计数变量范围 变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。
VHDL的基本描述语句有并行语句(Concurrent Statements)和顺序语句(Sequential Statements)两大类(如表8-3所示)。在系统设计中,这些基本描述语句从不同侧面完整地描述了数字系统的硬件结构和基本逻辑功能。 表8-3VHDL的并行语句和顺序语句 并行语句用于表示算法模块间的连接关系,相互之间无次序关系,它们是并行执行的,与书写顺序无关。VHDL的结构体由若干相互联系的并行描述语句组成,如图8-3所示。 并行描述语句在结构体中的语法格式如下: ARCHITECTURE 结构体名OF 实体名IS {说明语句} BEGIN {并行语句} END ARCHITECTURE 结构体名; 并行描述语句主要有:并行信号赋值语句(Concurrent Signal Assignments)、进程语句(Process Statements)、块语句(Block Statements) 、元件例化语句(Component Instantiations)、生成语
句(Generate Statements) 及并行过程调用语句(Concurrent Procedure Calls)等六种。其中,进程语句和块语句是两种最主要、最常用的并行描述语句。 本节介绍这六种并行描述语句及其功能。 一、进程语句(TOP) 进程PROCESS语句本身是并行描述语句,但却包含一系列顺序描述语句。所以,设计中各个进程是并行执行,而各进程内的顺序描述语句却是按顺序执行。 进程与其他部分的通信,是通过从进程外的信号或端口中读取或者写入值来完成。进程语句的语法格式如下: [进程名称:]PROCESS [(敏感表)] {进程声明} BEGIN {顺序语句} END PROCESS [进程名称]; 其中,进程声明是对子程序、类型、常量和变量等的说明;敏感表(Sensitivity_list)是所有敏感信号(包括端口)的列表;敏感表的语法格式为: 信号名称{,信号名称} 所谓进程对信号敏感,是指当信号发生变化时,能够触发进程中语句的执行。这种敏感方式有两种:显式敏感表形式和WAIT语句形式。如果进程包含wait或者ifevent语句,必定包含时序组件。此时,IEEE VHDL不允许有敏感表存在。所以,进程语句也为时序算法提供一种自然的手段。 二、块语句(TOP) 块BLOCK语句把几个并行语句打包成结构体的子模块,成为结构体中的一个单独块区域。块语句由一系列并行描述语句构成。块语句的语法格式如下: [块名称:]BLOCK [(表达式)] {块声明} BEGIN {并行语句} END BLOCK [块名称]; 其中,表达式是块的保护(Guard)条件;块声明是对子程序、类型、常量、信号和组件等的说明。 三、并行信号赋值语句(TOP)
第2章VHDL的语言要素 2.1 VHDL的命名规则: 2.1.1 数字型文字:d5<=16#E#E1 2.1.2 字符串型文字:文字字符串,数位字符串 数位字符串:位矢量,由数据类型为BIT的元素组成的一维数组。 书写格式:基数符“数值” 基数符:B—二进制数;O—八进制数;X—十六进制数例如:data1 <= B “1_1101_1110”; data2 <= O “15” ; data3 <= X “AD0”; data4 <= B “101_010_101_010”; data5 <= “101_010_101_010” ; --表达错误,缺B; dadata6 <= “0AD0”; --表达错误,缺X 2.1.3 标示符 标识符用来定义常数、变量、信号、端口、子程序或参数的名字等。 标示符包含:英文字母(大小写)、数字0~9 、下划线“_” 。 书写规则: ·有效的字符:英文字母包括26个大小写字母:a~z,A~Z;数字包括0~9以及下划线“_”。 ·任何标识符必须以英文字母开头。 ·必须是单一下划线“_”,且其前后都必须有英文字母或数字。 ·标识符中的英语字母不分大小写。 以下是几种标识符的示例: 合法的标识符: Decoder_1 , FFT , Sig_N , Not_Ack , State0 , Idle 非法的标识符: _Decoder_1 -- 起始为非英文字母 2FFT -- 起始为数字 Sig_#N -- 符号“#”不能成为标识符的构成
Not-Ack -- 符号“-”不能成为标识符的构成 RyY_RST_ -- 标识符的最后不能是下划线“_” data_ _BUS -- 标识符中不能有双下划线 return --关键字 扩展标识符:VHDL ’93标准还支持扩展标识符,但是目前仍有许多VHDL工具不支持扩展标识符。P20(1)、(2)、(3) 2.1.4\2.1.5 下标名和段名 ?(1)下标名指的是数组型变量或信号的某一个元素。 ?格式:标示符(表达式) ?SIGNALa,b:BIT_VECTOR(0 TO 3); ?SIGNAL m :INTEGER RANGE 0 TO 3; ?SIGNAL y,z :BIT; ?y <= a (m) ;-- 不可计算型下标表示 ?z <= b (3 ) ;-- 可计算型下标表示 ?(2)段名是多个下标名的组合,对应数组中某一段的元素 ?格式:标示符(表达式方向表达式) 方向:TO 或DOWNTO SIGNAL a ,z :BIT_VECTOR(0 TO 7); z(0 TO 3)<= a(4 TO 7);--z(0)<= a(4)、z(1)<= a(5)、… 2.1.6 注释:若要将一条语句加注释,在注释内容前加两个短划线。 2.2 VHDL语言的数据类型及运算操作符 Vhdl语言同其它语言一样有多种数据类型和运算符,且它们的定义也大多相同。VHDL语言的特点是用户可以自己定义数据类型。 如:type count is integer RANGE 0 to 10; 2.2.1 VHDL语言的客体(对象)及其分类 什么是客体? 可以赋予一个值的对象或者是数据类型所定义的对象。 客体主要包括3类
从Verilog到VHDL(上)基本语法 16六 从学校里开始,我所接触的就一直是VerilogHDL而非更老牌的VHDL,而且后续接触的项目中也多半是Verilog的用户,坦白的讲,Verilog的活力也确实更足一些,从 IEEE1800-2005开始的SystemVerilog的标准化,将Verification和Design的一体化的尝试,我个人认为,是走在正确的道路上。 所以,我确实想不到,我竟然也要回头学起VHDL来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL,看来终究是绕不过去的了——正如一个Design Verification工程师在目前想完全的不和SpecmanE 打交道是很难的一样。 下面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来没有接触过VHDL,当然会存在很多非常初级的东西。 而在本文之后,打算再写一篇简单阐述下结合Cadence的IUS工具,使用SystemVerilog对VHDL进行验证的基本方
法。 起手式 从Verilog撞进VHDL的世界,有些东西要先搞清楚,否则会一头雾水: 1. 大小写敏感:Verilog是大小写敏感的,VHDL则非; 2. 注释:Verilog的行注释为//,块注释为/**/;VHDL只支持行注释–;[1. 这个算是不方便的一个地方了,不过不论是在Vim还是Emacs当中,批量做行注释也很容易实现;] 基本结构 VHDL被认为是要求更严格,更多讲究的语言,相比和C类似的Verilog,架构上更严谨一些: 1. 基本结构:从上往下为 USE定义区(调用库和包);Package定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规格); [2. Entity感觉像是C的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module里头一起完成 了。]Architecture定义区(描述内部功能);[3. 同上,相当于Verilog的Module内部实现。]Configuration定义区(决定那个Architecture被使用)[4. 这也许就是之所以要分开Arch和Entity的原因,类似的效果在Verilog里实现,则需
填空题 1、VHDL语言的文字(Literal)主要包括数值型文字和标识符。 2、在VHDL语言的以数字基数表示的文字中,十进制计数的1582的表示方法是10#158#2。 3、在数位字符串中,B为二进制基数符号;O为八进制基数符号;X为十六进制基数符号。 4、下标用于指示数组型变量或信号的某一个元素。 5、VHDL语言的注释以--来表示。 6、VHDL语言中主要有4类基本的数据对象:常量(CONSTANT)、变量(VARIABLE)、信号(SIGNAL)和文件(FILES)。 7、在对信号进行赋初值时,使用:=表示没有延时,使用<=表示有延时。 8、VHDL是一种强类型语言,要求每一个数据对象必须具有确定的唯一的数据类型,而且只有数据类型相同的量才能互相传递和作用。 9、VHDL语言的数据类型按照数据来源来分,可以分为VHDL语言预定义的标准数据类型和用户自定义的数据类型。 10、位类型实际上是一个二值枚举型数据类型,只有两个可能的取值:0和1,用于表示逻辑0和逻辑1。 11、标准逻辑位类型是在IEEE的STD_LOGIC_1164程序包中定义的。 12、布尔类型和位类型类似,实际上是一个二值枚举型数据类型,有两个可能的取值:TRUE(真)和FALSE(假)。 13、VHDL语言中主要有4类操作符:逻辑操作符(LOGIC OPERATOR)、关系操作符(RELATION OPERATOR)、算术操作符(ARITHMETIC OPERATOR)和重载操作符(OVERLOADING OPERATOR)。 综述题 1、VHDL语言的数字型文字主要有哪几种表达方式,并且举例。 答案: ●整数型文字,如:1,123,518E2,12_345_678。 ●实数型文字,如:12.3,6.5E-2,12_23.45_32。 ●以数字基数表示的文字,如:10#158#2。 ●物理量文字,如:60s,1km。 2、VHDL语言标识符有哪些书写规范?
VHDL语法简单总结 一个VHDL程序代码包含实体(entity)、结构体(architecture)、配置(configuration)、程序包(package)、库(library)等。 一、数据类型 1.用户自定义数据类型 使用关键字TYPE,例如: TYPE my_integer IS RANGE -32 TO 32; –用户自定义的整数类型的子集 TYPE student_grade IS RANGE 0 TO 100; –用户自定义的自然数类型的子集 TYPE state IS (idle, forward, backward, stop); –枚举数据类型,常用于有限状态机的状态定义 一般来说,枚举类型的数据自动按顺序依次编码。 2.子类型 在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。 子类型定义使用SUBTYPE关键字。 3.数组(ARRAY) ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。 TYPE type_name IS ARRAY (specification) OF data_type; –定义新的数组类型语法结构 SIGNAL signal_name: type_name [:= initial_value]; –使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明 例如: TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0); –滤波器输入延迟链类型定义 TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0); –滤波器系数类型定义 SIGNAL delay_regs: delay_lines; –信号延迟寄存器声明 CONSTANT coef: coeffs := ( ); –常量系数声明并赋初值 4.端口数组