VHDL程序设计教程练习

第一章

1 .什么是VHDL?简述VHDL的发展史?VHDL的实现有哪几种形态?

VHDL 语言:VHDL语言的英文全名是Very High Speed Integrated Circuit Hardware Description Language,即超高速集成电路硬件描述语言。电子系统硬件行为描述、结构描述、数据流描述的语言。利用硬件描述语言可以进行数字电子系统SOC的设计、FPGA的设计、集成电路ASIC设计。

VHDL是美国国防部为电子项目设计承包商提供的,签定合同使用的,电子系统硬件描述语言。1983年成立VHDL语言开发,1987年推广实施,1993年扩充改版.VHDL是IEEE标准语言,广泛用于数字集成电路逻辑设计。

VHDL语言设计实现是指设计的程序以三种形态出现在产品中

1. IP 模块实现

2. FPGA 实现

3. ASIC 实现

2.VHDLIP模块实现流程?

3. VHDLFPGA实现?

 4.VHDLASIC实现

 第二章VHDL词法基础

1.什么叫对象?对象有哪几个类型?

VHDL语言中,对象(Objects)是具有特定数据类型且可以被赋值的客体。VHDL语言中的对象有4类:

  • 常量(Constant
  • 信号(Signal
  • 变量(Variable
  • 文件(Files

2.变量和信号的区别?

变量(Variable)是一个局部量,主要用于对临时数据进行局部存储。变量在进程中定义

变量值不能将数据输出到对其作出定义的当前进程以外,若将变量的值输出到当前进程之外必须将该值赋给一个相同类型的信号(Signal),即进程之间传递数据需要使用信号

变量的赋值是立即生效的,不存在赋值延时
变量在仿真中可用于高层次建模 在综合中可用于计算,作为索引载体和数据的暂存。
信号(Signal) 用于电路内部相互连接的抽象表示。信号是 全局量 ,通常在实体说明、结构体和包中使用。 和变量一样,信号的值也是可改变的,信号可以在 VHDL 程序中被 连续地赋值

信号可以存在赋值延时。

信号赋值语句格式:

  目标信号 := 表达式 ;

  目标信号 <= 表达式 ;

“:=”表示对信号直接赋值,用来表示信号初始值不产生延时;

“<=”表示代入赋值,是变量之间信号的传递,代入赋值允许产生延时

3.VHDL语言定义的标准类型有哪些?

数据类型根据其产生的来源还可以分为标准数据类型用户自行定义的数据类型。

标准数据类型包括整数类型(Integer Type)、实数类型或浮点类型(Real Type Floating  Type)、位类型(Bit Type)、位矢量类型(Bit_Vector Type),布尔类型(Boolean Type)、字符类型(Character Type),时间类型或物理类型(Time Type Physical Type)、错误类型(NoteWarningErrorFailure Type),以及自然数、整数类型(Natural Type)和字符串类型(Tring Type)。

用户自定义的数据类型包括枚举类型(Enumerated Type)、数组类型(Array Type)、存取类型(Access Type)、文件类型(Files Type)和记录类型(Recode Type)。

4.数据类型

VHDL 语言中的数据类型可以分为 5 类。
1. 标量类型( Scalar Types)、标量类型包括整数类型、浮点数类型、时间类型和枚举类型。
2. 复合类型( Composite Types)、复合类型由多个元素复合而成,包括数组类型和记录类型。
3. 存取类型(Access Types)、由同一类型的数据元素组织在一起而形成的新的数据类型称为数组,而由不同类型的数据元素组织在一起而形成的数据类型称为记录,记录用于描述总线,通讯协议很方便。记录更多地适用于仿真, 只有元素全部为标量数据类型时,该记录才是可以综合的。
4. 文件类型( File Types )、文件类型的对象是不可以被综合的。
5. 隐含类型( Protected Types )。

5.IEEE标准类型

IEEE 库的程序包 STD_LOGIC_1164 中定义了两个重要的数据类型—— 标准逻辑位STD_LOGIC和标准逻辑矢量STD_LOGIC_VECTOR 。它们是 IEEE 标准化数据类型,使用这两个数据类型前,必须在程序中写出库说明语句和使用程序包集合的说明语句;否则, EDA 工具在进行编译、综合时会报告类型错误。
  • LIBRARY IEEE
  • USE IEEE.STD_LOGIC_1164.ALL
  • ……

6.简述VHDL语言操作符的优先级

在表2.5中.取反和取绝对值优先级较高,与、或逻辑运算的优先级低于算术运算
的优先级。

7.不同类型的数据变换,3种方法?

类型标记法、函数转换法和常数转换法。

1. 类型标记法

A数据类型名:B数据类型名(表达式);

例如整数和实数的类型转换,如果:

variable I integer

variable R real

则有:

I :integer(r)  --将实数转换成整数赋予整型变量I

R :real(i)     --将整数转换成实数赋予实型变量R

2. 函数转换法

1STD_LOGIC_1164程序包定义的转换函数

  函数 TO_STD LOGIC_VECTOR(A)  --由位矢量BIT_VECTOR转换为标准逻辑矢量STD_LOGIC_VECTOR

  函数 TO_BITVECTOR(A)       --由标准逻辑矢量STD_LOGIC_VECTOR转换为位矢量BIT_VECTOR

  函数 TO_STDLOGIC(A)       --BIT转换为STD_LOGIC

  函数 TO_BIT(A)            --由标准逻辑STD_LOGIC转换BIT

举例:
SIGNAL a BIT_VECTOR(11 DOWNTO 0)
SIGNAL b STD_LOGIC_VECTOR(11 DOWNTO 0)
a <= H"AOF"               -- 十六制代入信号 a
b <= to_std_logic_vector ( H"A0F")
b <= to_std_logic_vector (B"1010 0000 1111")

2STD_LOGIC_ARITH程序包定义的转换函数

  函数:COMV_STD_LOGIC_VECTOR(A,位长)--integersingedunsigned转换std_logic_vector

  函数:CONVINTEGER(A)            --signedunsigned转换成std_logic_vector

  函数:CONVINTEGER(A)            --signedunsigned转换成integer

3STI_LOGIC_UNSIGNED程序包定义的转换函数

  函数:CONVINTEGER(A)           --STD_LOGIC_VECTOR转换成integer

3. 常数转换法

CONSTANT  type_conv_con:type_conv_con:=(0’│‘L=>0,1’│’H=>1,OTHERS => 0);

常量转换法中,低电平转换为‘0’,高电平转换为‘1’,其他不确定值转换为‘0’。

编程示例:
Signal  B: std_logic ;
Signal  S: std_unlogic ;
Begin
B <= type_conv_con (s);

 

8.并置运算符和状态运算符

VHDL 程序设计中,并置运算符“&”用于位的连接。并置运算符可用于位的连接,形成位矢量,也可将两个位矢量连接构成一个位矢量。
位的连接,可以用并置符连接法,也可用集合体连接法。举例如下:
DATA_C <=   D0 D1 D2 D3   -- 并置符连接
DATA_C <= (D0 D1 D2 D3)        -- 集合体连接

操作符“??”用于状态转换,将BIT类型中的“1”转换为BOOLEAN类型中的“TRUE,将“0”转换为“FALSE”。 

第三章 VHDL程序结构

1.简述VHDL设计实体的结构。

实体由实体名、类型说明、端口说明、实体说明部分和实体语句部分组成。

实体一般格式为:

ENTITY  实体名 IS
 [GENERIC语句;]     	--可选项(参数说明)
  PORT语句;         	--必需项(端口说明)
 [实体说明部分;]  	--可选项
 [BEGIN
  实体语句部分;]
END [ENTITY] [实体名];

2.分别用结构体的3种描述法设计一个4位计数器。

用行为描述方法设计一个4位计数器如下,

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsignal.all;

entity count is
port( clk,clr,en: in std_logic
     Qa,Qb,Qc,Qd: out std_logic );
end count;

architecture example of count is
signal count_4:std_logic_vector(3 downto 0);
begin
  Qa <= count_4(0);
  Qb <= count_4(1);
  Qc <= count_4(2);
  Qd <= count_4(4);
 process (clk,clr)
  begin
    if (clr) then
    count_4 <= "0000";
    elsif (clk'event and clk='1') then
      if(en='1') then
       if(count_4="1111") then
          count_4="0000";
       else
          count_=count_4+1;
       endif
      endif
     endif
 endprocess;
endexample;
        

3.什么叫进程?简述进程的工作方式。

进程语句不是一条语句,而是一段程序,这段程序描述了一个靠敏感信号触发的硬件模块反复执行的工作过程。进程语句(Process)是并行处理语句,即在结构体中多个进程语句是同时并发运行的。

进程语句具有如下特点:
1 )进程结构内部的所有语句都是顺序执行的。
2 )多个进程之间,是并行执行的,并可通过敏感信号访问结构体或实体中所定义的信号。
3 )进程依靠进程标识符 PROCESS 后的敏感信号表中指定的信号来触发启动,也可以用 WAIT 语句描述触发条件。

 进程Process语句中 一般带有几个信号量例表,称为该进程的敏感列表.这些信号无论哪个发生变化都将启动Process进程,启动进程Process中的程序将从上到下顺序执行一遍产生变化结果输出•当进程的最后一个语句执行完成后,就返回到进程开始处.等待敏感般的新变化.引发进程的再次执行.周而立始,循环往复.以至无穷,这就是进程的执行过程.

4.什么叫模块?区分模块与进程。 

模块(Block)语句是结构体中积木化设计并适用于复杂项目设计.
Block块是一个独立的子结构,可以包含PORT语句、GENERIC语句,允许设计者通过这两个语句将Block块内的信号变化传递给Block块的外部信号.同样.也可以将Block块的外部信号变化传递给Block块的内部信号。
对VHDL语言中的Block模块进行仿真时,Block模块中所描述的各个语句是可以并发
执行的
•和模块中的语句书写顺序无关.进程语句是段程序.这段程序是顺序执行的.

5.简述过程和函数的区别

子程序(Subprogram)是一个VHDL程序模块,利用顺序语句来定义算法或描述硬件行为。子程序能更有效地完成重复性工作。子程序有两种,即过程语句函数语句。

1.过程调用时,先将初始值传递给过程的输入参数。启动过程按顺序自上至下执行过程语句。执行结束后,将输出值复制到调用者的OUTINOUT所定义的变量或信号中。

2.并发过程调用(Concurrent Procedure Call)语句可以出现在结构体中,可以在进程中执行过程调用语句。

3.并发过程调用语句是一个完整的语句,具有独立的行为表现形式,在这个语句前面可以加标号。

4.并发过程调用语句应带INOUTINOUT参数,列于过程名后的括号内。并发过程调用可以有多个返回值,这些值通过过程中所定义的输出参数带回。

 过程调用语句也可以出现在进程中。因此,过程调用语句也可以由过程敏感量的变化而得到启动。

函数是具有某一特定功能的程序段,能够被主程序调用。函数被调用时,首先要初始化,执行处理功能后,将处理结果传递给主程序。函数内部的值不能保持,函数返回后,才能被再次调用,再次初始化

函数做成以后放在程序包中。几个函数构成一个程序包,几个程序包组成一个库

6.结构体的描述的3种方法?

 行为描述法,数据流描述法,结构描述法。

所谓结构体的行为描述Behavioral Descriptions),即对设计实体按算法的路径来描述。行为描述在EDA工程中称为高层次描述或高级描述。

比较器的行为描述:

LIBRARY IEEE;
USE IEEE std_logic_1164.ALL;
ENTITY comparator IS
PORT (a,b:IN std_logic_vector(7 downto 0);
          g:out std_logic);
END comparator;
ARCHITECTURE behavioral OF  comparator
BEGIN
  Comp:PROCESS(a,b)
    BEGIN
      IF a = b THEN
          G <='1';
      ELSE
          G <='0';
      END IF;
    END process comp;
  END behavioral;

程序分析:

1. 结构体采用简单的算法描述了实体行为,定义了实体的功能输入8位数ab,若ab,实体输出G1;若a不等于b,则实体输出G0。输出取决于输入条件。

2.  进程标志comp是进程顺序执行的开始,end process comp是进程的结束。

3.  保留字process(a, b)中,ab为敏感变量,即ab每变化一次就有一个比较结果输出。实体输出是动态的G值,时刻代表着ab的比较结果。

数据流描述Dataflow Description)是结构体描述方法之一,它描述了数据流程的运动路径、运动方向和运动结果,同样是一个8位比较器采用数据流法编程,如所示。

LIBRARY IEEE;
USE IEEE std_logic_1164.ALL;
ENTITY comparator IS
PORT (a,b:IN std_logic_vector(7 downto 0);
           G:out std_logic);
END comparator;
ARCHITECTURE dataflow OF  comp  IS
BEGIN
  G <="1" when (a = b) else"0";
END dataflow;

 用布尔方程的数据流描述法设计的8位比较器

LIBRARY IEEE;
USE IEEE std_logic_1164.ALL;
ENTITY comparator IS
PORT (a,b:IN std_logic_vector(7 downto 0);
            G:out std_logic);
END  comparator;
ARCHITECTURE bool OF comparator IS
BEGIN
 G<=not(a(0)xorb(0))
  and not(a(1)xorb(1))
  and not(a(2)xorb(2))
and not(a(3)xorb(3))
  and not(a(4)xorb(4))
 and not(a(5)xorb(5))
  and not(a(6)xorb(6))
  and not(a(7)xorb(7));
END bool;

 

八位比较器逻辑电路图

8位比较器的结构化描述法:

LIBRARY IEEE;
Use ieee std_logic_1164.ALL;
ENTITY comparator IS
PORT (a,b: in std_logic_vector(7 downto 0);
	        G:out std_logic);
END comparator;
USE work.gatespkg.ALL
ARCHITECTURE structural OF comparator IS
signal x: std_logic(0 TO 7);
BEGIN
  u0:xnor2 PORT MAP (a(0),b(0),x(0));
  u1:xnor2 PORT MAP (a(1),b(1),x(1)); 
  u2:xnor2 PORT MAP (a(2),b(2),x(2));
  u3:xnor2 PORT MAP (a(3),b(3),x(3));
  u4:xnor2 PORT MAP (a(4),b(4),x(4));
  u5:xnor2 PORT MAP (a(5),b(5),x(5));
  u6:xnor2 PORT MAP (a(6),b(6),x(6));
  u7:xnor2 PORT MAP (a(7),b(7),x(7));
  u8:xnor2  PORT  MAP  (x(0),x(1),x(2),x(3),x(4),x(5)x(6),x(7), x(8),G);
END structural;

第四章VHDL语法基础

目录

第一章

1 .什么是VHDL?简述VHDL的发展史?VHDL的实现有哪几种形态?

2.VHDL的IP模块实现流程?

3. VHDL的FPGA实现?

 4.VHDL的ASIC实现

 第二章VHDL词法基础

1.什么叫对象?对象有哪几个类型?

2.变量和信号的区别?

3.VHDL语言定义的标准类型有哪些?

4.数据类型

5.IEEE标准类型

6.简述VHDL语言操作符的优先级

7.不同类型的数据变换,3种方法?

8.并置运算符和状态运算符

第三章 VHDL程序结构

1.简述VHDL设计实体的结构。

2.分别用结构体的3种描述法设计一个4位计数器。

3.什么叫进程?简述进程的工作方式。

4.什么叫模块?区分模块与进程。 

5.简述过程和函数的区别

6.结构体的描述的3种方法?

第四章VHDL语法基础

1.用结构描述法和GENERATE语句设计个8位移位寄存器。

 2.断言语句


结构描述法

LIBRARY  IEEE;
USE  IEEE.STD_LOGIC_1164.ALL;
ENTITY  shift_register  IS
PORT(a,clk: IN   STD_LOGIC;b: OUT  STD_LOGIC);
END  ENTITY  shift_regester; 
ARCHITECTURE  eight_BIT_shift_register OF shift_register  IS
COMPONENT  dff                  --dff元件调用 
PORT(a,clk: IN STD_LOGIC;b: OUT  STD_LOGIC);
END  COMPONENT;
       SIGNAL  X:  STD_LOGIC_VECTOR(0 TO 8);
BEGIN
  X(0) <= a;
  dff1:dff PORT MAP (X(0),clk,X(1));
  dff2:dff PORT MAP (X(1),clk,X(2));
  dff3:dff PORT MAP (X(2),clk,X(3));
  dff4:dff PORT MAP (X(3),CLK,X(4));
  dff5:dff PORT MAP (X(4),CLK,X(5));
  dff6:dff PORT MAP (X(5),CLK,X(6));
  dff7:dff PORT MAP (X(6),CLK,X(7));
  dff8:dff PORT MAP (X(7),CLK,X(8));
  b<=X(8);
END ARCHITECTURE  eight_bit_shift_register;

GENERATE语句

LIBRARY  IEEE;
USE  IEEE.STD_LOGIC_1164.ALL;
ENTITY  shift_register  IS
PORT(a,clk: IN  STD_LOGIC;b: OUT  STD_LOGIC);
END  ENTITY  shift_regester; 
ARCHITECTERE  eight_shift register  OF  shift_register IS
COMPONENT  dff  	                               --元件调用语句
PORT  (c d,clk: IN  STD_LOGIC;q: OUT  STD_LOGIC);
END  COMPONENT;
SIGNAL  X:  STD_LOGIN_VECTOR(0 TO 8);
BEGIN
X(0) <= a;      	                           --输入信号代入语句
register1: FOR  i  IN  0 TO 7  GENERATE       --循环体的生成
     dffx:dff PORT MAP(X(i),clk,X(i+1));--端口映射
END  GENERATE;
     b <= X(8);    	                       	           --输出信号代入语句
END  ARCHITECTURE  eight_shift_register;

 2.断言语句

断言语句(Assert)主要用于程序仿真,调试中的人-机会话。在仿真、调试过程中,当ASSERT后的条件不成立时,则给出一个字符串作为提示信息。
提示信息分4类:失败(Failure)
                                   错误(Error)
                                   警告(Warning)
                                   注意(Note)
断言语句的书写格式为:
[标号:]ASSERT 条件 [REPORT报告信息][SEVERITY出错级别];

ENTITY  simulation  IS
      PORT(reset:IN Bit:='0');
BEGIN
ASSERT  reset='1'(REPORT " Reset active(i.e.reset='0')" SEVERITY ERROR);
P1:PROCESS        	--等价被动进程无敏感表
  BEGIN
   ASSERT reset='1' 	--断言条件
   REPORT"Reset  active(i.e.reset='0')" 	--报告信息
   SEVERITY  Error; 	--出错级别
   WAIT  ON  reset;  	--进程同步点
  END  PROCESS  P1;
END  ENTITY  simulation;
ARCHITECTURE  example  of assert  OF  Simulation  IS
BEGIN
  ASSERT  False    	--断言条件
  REPORT"This state ment will be executed only once at the beginning of simulation" 
                      --报告信息
SEVERITY  NOTE;  	--出错级别
  P2:  PROEESS     	--等价被动进程无敏感表
  BEGIN
     ASSERT  False   	--断言条件
     REPORT "This Statement Will be executed only once at the beginning of simulation"
                      --报告信息
     SEVERITY  NOTE;	--出错级别
     WAIT;		--由WAIT同步
  END  PROCESS  P2;
END  ARCHITECTURE  example Of assert;

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值