EDA硬件描述语言VHDL(三)--VHDL数据类型与顺序语句

VHDL数据类型与顺序语句

1. 位数据和位矢量

位数据类型BIT的取值范围是逻辑位‘1’和‘0’。位矢量类型BIT_VECTOR是BIT的数组类型。

程序包STANDARD中定义的源代码如下:
  TYPE BIT IS (‘0’, ‘1’);
 TYPE BIT_VECTOR IS ARRAY (NATURAL RANGE<>) OF BIT;
例:SIGNAL X,Y:BIT;
   SIGNAL A,B:BIT_VECTOR(3 DOWNTO 0);
    ...
    X<=‘1’;              --对BIT类型的信号X赋值
    A<=“1101”;           --赋值后A(3)、A(2)、A(1)、A(0)   分别为‘1’、‘1’、‘0’、‘1’
   B(2 DOWNTO 1)<=A(3 DOWNTO 2); --B(2)=A(3),B(1)=A(2)
   B(2 DOWNTO 0)<=X﹠Y﹠‘1’;-- B(2)=X、B(1)=Y、B(0)=‘1’

STD库符合VHDL语言标准,在定义BIT和BIT_VECTOR类型的程序中不必以显示打开STD库和STANDARD程序包。

2.STD_LOGIC所定义的9种数据

‘U’表示未初始化的; ‘X’表示强未知的; ‘0’表示强逻辑0;
‘1’表示强逻辑1; ‘Z’表示高阻态; ‘W’ 表示弱未知的;
‘L’表示弱逻辑0; ‘H’表示弱逻辑1; ‘-’表示忽略。
在使用STD_LOGIC_VECTOR中,必须注明其数组宽度,即位宽,如:

   B : OUT  STD_LOGIC_VECTOR(7 DOWNTO 0) ;  
 SIGNAL A :STD_LOGIC_VECTOR(1 TO 4);

3. 整数处理

在VHDL中,整数的取值范围是-214783647~+2147483647。VHDL仿真器将整数类型作为有符号数处理,VHDL综合器将整数 作为无符号数处理。使用整数时,综合器要求必须用RANGE子句为所定义的数限定范围,根据所限定的范围决定信号或变量的二进制的位数。
例:SIGNAL Q : INTEGER RANGE 15 DOWNTO 0;
–综合器自动将Q综合成4条信号线构成的总线方式信号:Q(3) 、Q(2)、Q(1)、Q(0)。

4. 布尔数据类型

布尔数据类型BOOLEAN在标准程序包STANDARD中定义的源代码:

TYPE BOOLEAN IS (FALSE,TURE);

布尔量不属于数值,不能用于计算,只能用于比较和判断,而且布尔类型是在数据比较中默认产生的。

5.SIGNED和UNSIGNED类型

在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了如下数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)和小整型(SMALL_INT)。这些数据类型使用前必须加入如下语句;

   LIBRARY IEEE;
       USE IEEE.STD_LOGIC_ARITH.ALL;

在STD_LOGIC_ARITH中定义的UNSIGNED和SIGNED类型的源代码如下:

TYPE UNSIGNED IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC;

TYPE SIGNED IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC;

STD_LOGIC和STD_LOGIC_VECTOR类型的数据可以进行逻辑运算和关系运算,却不能直接进行算术运算;
而UNSIGNED和SIGNED类型的数据可以进行算术运算和关系运算,但不能进行逻辑运算

6.其他预定义类型

6.1 字符(CHARACTER)类型

通常用单引号引起来,字符类型区分大小写,如‘B’和’b’不同。字符类型定义在STANDARD程序包中。

6.2 实数(REAL)类型

也称浮点数,实属类型只能用于VHDL仿真器,综合器不支持实数。

6.3字符串(STRING)类型

字符串必须用双引号标明,综合器支持此类型,但不对应具体电路。

VARIABLE string_v : STRING (0 TO 7 ) ;
 string_v := “01100101" ;

或string_v := B“0110_0101” ;
或string_v := X“65” ;

7.顺序语句

在用VHDL语言描述系统硬件行为时,按语句执行顺序对其进行分类,可分为顺序语句和并行语句。
   顺序语句:每条顺序语句的执行顺序是与它们的书写顺序基本一致,它们只能出现在进程和子程序(包括函数和过程)中。
   顺序语句:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句。

7.1赋值语句区别:

(1)赋值方式的不同: 变量 := 表达式;
信号 <= 表达式;
(2)赋值行为不同:变量赋值是立即发生的,而信号赋值有延时。
(3)硬件实现的功能不同: 变量代表电路单元内部的操作,代表暂存的临时数据;
信号代表电路单元、功能模块间的互联,代表实际的硬件连线。
(4)有效范围不同: 信号:全局量,(程序包、实体、结构体)。
变量:局部量,(进程、子程序)

7.2CASE语句属于顺序语句,必须放在进程PROCESS中使用。

CASE语句的结构如下:
CASE 表达式 IS
When 选择值 => 顺序语句;
When 选择值 => 顺序语句;
...
When OTHERS=> 顺序语句;
END CASE ;

7.3PROCESS语句

PROCESS语句结构的一般表达格式如下:

 [进程标号: ] PROCESS [ ( 敏感信号参数表  ) ] [IS]
 [进程说明部分]
  BEGIN
      顺序描述语句
  END PROCESS [进程标号];

① 进程标号和[IS]不是必需的;
② 进程说明部分只能定义一些变量及数据类型;
③ 顺序描述语句是一段顺序执行的语句,描述该进程的行为。
④ 敏感信号参数表中只能列出信号,任一敏感参数的变化都能启动进程。
⑤ PROCESS语句本身是并行语句,PROCESS结构中的语句是顺序语句。

7.4 其他语句

(1)操作符&表示将操作数或数组合并起来形成新的数组。
(2)if语句

IF   条件句  Then 
      顺序语句 
     END IF ;

8.D触发器的VHDL描述

  1. 上升沿检测表达式和信号属性函数EVENT
    上升沿检测常用表达式:CLK’EVENT AND CLK=‘1’
    关键词EVENT是信号属性函数,VHDL通过以下表达式来测定某信号的跳变情况:
    <信号名>'EVENT
  2. 不完整条件语句与时序电路
    完整的条件语句只能构成组合逻辑电路。不完整的条件语句是构建时序电路的关键。
【例】数据比较器
ENTITY COMP_BAD IS     
  PORT( a : IN BIT;
     b : IN BIT;
     q : OUT BIT    ); 
END ; 
ARCHITECTURE one OF COMP_BAD IS
  BEGIN 
   PROCESS (a,b)     
BEGIN         
IF  a > b   THEN  q <= '1' ; 
ELSIF a < b THEN  q <= '0' ;-- 未提及当a=b时,q作何操作
END IF;         
   END PROCESS ;
END ;

在这里插入图片描述

9.计数器更常用的VHDL表达方式

在这里插入图片描述
计数器由两大部分组成:
(1)完成加1的纯组合电路加法器;
(2)4位边沿触发方式锁存器,纯时序电路,计数CLK其实是锁存允许信号,并非想象中的计数信号。 缓冲模式BUFFER并非某种特定端口电路结构,它只是对端口具有某种特定工作方式的描述。
在这里插入图片描述
Q显示的波形是以总线方式表达的,其数据格式是十六进制,是Q(3)、Q(2)、Q(1)、Q(0)时序的叠加。

10. WAIT语句

	WAIT ON 信号表;            -- 第一种语句格式  
格式1:称为敏感信号等待语句,将运行的进程挂起直至敏感信号表中的任一信号发生变化时结束挂起,再次启动进程。
	WAIT UNTIL 条件表达式;       -- 第二种语句格式
格式2:称为条件等待语句,此语句挂起的进程需要顺序满足如下两个条件,进程才能脱离挂起状态,恢复执行WAIT语句之后的语句。(1)在条件表达式中所含的信号发生了改变。(2)此信号改变后,且满足了WAIT语句所设的条件。这两个条件缺一不可,而且必须依照以上顺序来完成。
	WAIT FOR 时间表达式;        --第三种语句格式
格式3:称为超时等待语句,在此语句中定义了一个时间段,从执行到WAIT语句开始,在此时间段内,进程处于挂起状态,当超过这一时间段后,进程自动恢复执行。(常用于VHDL仿真)
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用VHDL进行硬件描述语言的编辑设计通常遵循以下操作流程: 1. 确定设计规格:首先,你需要明确你的设计规格和要实现的功能。这包括确定输入和输出信号、设计约束和性能要求等。 2. 创建VHDL文件:在设计过程中,你需要创建一个或多个VHDL文件来描述你的电路设计。一个典型的VHDL设计包括实体(entity)和体(architecture)两个部分。 3. 编写实体声明:在VHDL文件中,你需要编写实体声明来定义输入、输出端口和其他重要的信号。实体声明描述了你的电路的外部接口。 4. 编写体描述:在VHDL文件中,你需要编写体描述来定义电路的内部逻辑和行为。可以使用结构化建模或行为建模来描述电路的功能。 5. 进行仿真:在设计完成之前,你可以使用仿真工具对VHDL代码进行仿真验证。仿真可以帮助你检查设计的正确性并调试任何错误。 6. 综合和布局:一旦你完成了VHDL设计的验证,你可以使用综合工具将VHDL代码转换为门级电路描述。然后,使用布局工具将门级电路映射到实际的硬件资源上。 7. 时序分析和优化:在综合和布局之后,你可以进行时序分析和优化,以确保设计满足时序要求并优化性能。 8. 下载到目标设备:最后,将设计编译为目标设备可识别的二进制文件,并将其下载到目标设备上进行测试和验证。 以上是一个一般的VHDL设计流程,具体步骤可能因项目需求和工具的不同而有所差异。使用VHDL进行硬件描述语言的设计可帮助实现复杂的电路功能并简化电路设计流程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值