VHDL学习笔记(3)

三,VHDL中的数据类型

分为四大类:

1.标量型(Scalar Type)

属于单元素的最基本的数据类型,通常用于描述一个单值数据对象,它包括实数类型,整数类型,枚举类型和时间类型。

2.复合类型(Composite Type)

可以由细小的数据类型复合而成,如可由标量复合而成。复合类型主要有数组型(ARRAY)和记录型(RECORD)。

3.存取类型(Access Type)

为给定的数据类型的数据对象提供存取方式。

4.文件类型(Files Type)

用于提供提供多值存取类型。

1.VHDL的预定义数据类型

在VHDL标准程序包STANDARD中定义的,实际使用中已经自动包含进VHDL的源文件中,因此不用USE语句进行显示调用。

1).布尔(BOOLEAN)数据类型

二值枚举类型数据类型,它的取值有FALSE和TRUE两种。

2).位(BIT)数据类型

属于枚举型,取值有1或0

位数据类型的数据对象,可以参加逻辑运算,运算结果任然是位的数据类型。

3).位矢量(BIT_VECTOR)数据类型

基于BIT数据类型的数组

4).字符(CHARACTER)数据类型

通常用单引号包裹起来,区分大小写

5).整数(INTEGER)数据类型

正整数,负整数和零

自然数和正整数是整数的子类型

6).实数(REAL)数据类型

类似于数学上的实数,或称为浮点数

取值范围为-1.0E38~+1.0E38

重点:

实数类型仅能在VHDL仿真器中使用,VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。

7).字符串(STRING)数据类型

字符数据类型的一个非约束型数组,或称为字符串数组。

字符串必须要用" "标明。

8).时间(TIME)数据类型

VHDL中唯一的预定义物理类型是时间。

完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格,如55 ms,20 ns。

飞秒 皮秒 纳秒 微秒 毫秒 秒 分 时

9).错误等级(SEVERITY_LEVEL)

仿真器中,错误等级用来指示设计系统的工作状态,共有四种可能的状态值:

NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)。

2.IEEE预定义标准逻辑位与矢量

两个类型:

标准逻辑位STD_LOGIC

标准逻辑矢量STD_LOGIC_VECTOR

2.1标准逻辑位STD_LOGIN数据类型

U 未初始化 X 强不定 0 0 1 1 Z 高阻 W 弱信号不定 L 弱信号0 H 弱信号1  _ 忽略

重点:

在使用该类型数据时,在程序中必须写出库说明语句和使用包集合的说明语句。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

2.2标准逻辑矢量(STD_LOGIC_VECTOR)

2.3其他预定义标准数据类型

重点:想要使用如下的数据类型一定要在使用之前加如下语句

LIBRARY IEEE;

USE IEEE.STD_LOGIC_ARITH.ALL;

在STD_LOGIC_ARITH定义了如下的数据类型:

1.无符号型(UNSIGNED)

一个无符号数值 在综合器中,这个数值被解释为一个二进制数,最左位是其最高位。

2.有符号型(SIGNED)

一个有符号的数值 在综合器中,将它解释为补码,此数最高位为符号位

3.小整型(SMALL_INT)

2.4用户自定义数据类型方式

TYPE语句的用法

TYPE 数据类型名 IS 数据类型定义  [OF 基本数据类型]

TYPE 数据类型名 IS 数据类型定义 [OF 基本数据类型] [约束范围];

数据类型如果没有被指定,则默认为整数类型。

SUBTYPE语句的用法

子类型SUBTYPE只是由TYPE所定义的原数据类型的一个子集

SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围;

VHDL允许用户自行定义新的数据类型,它们可以有很多种

下面八种是最为常见的

1.枚举类型;

用文字符号表示一组实际的二进制数的类型。

直接用数值定义,则必须使用单引号。

2.整数类型;

3.实数,浮点数类型;

4.数组类型;

属于复合类型,将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。

数组可以一维数组或多维数组。

VHDL仿真器支持多维数组,但是VHDL综合器只支持一维数组。

限定性数组定义语句格式如下:

TYPE 数组名 IS ARRAY (数组范围) OF 数组类型;

非限制性数组的定义语句格式如下:

TYPE 数组名 IS ARRAY(数组下标名 RANGE <>) OF 数据类型;

5.存取类型;

6.文件类型;

7.记录类型;

由已定义的,数据类型不同的对象元素构成的数组称为记录类型的对象。定义记录类型的语句格式如下:

TYPE 记录类型名 IS RECORD

元素名 :元素数据类型;

元素名:元素数据类型;

...

END RECORD [记录类型名];

8.时间类型;

数据类型转换

VHDL是一种强类型语言 意味着即使对于非常接近的数据类型的数据对象,在相互操作时,也需要进行数据类型转换。

a)类型转换函数方式

类型转换函数的作用就是将一种属于某种数据类型的数据对象转换成属于另一种数据类型的数据对象。

DATAIO库中的程序包STD_LOGIC_OPS中的两个数据类型转换函数:

重点:

TO_VECTOR 将 INTEGER 转换成 STD_LOGIC_VECTOR

TO_INTEGER 将STD_LOGIC_VECTOR转换成INTEGER

b)直接类型转换方式

仅限于非常关联的数据类型之间

一般的格式:

数据类型标识符(表达式);

必须要的规则:

1.所有的抽象数字类型时非常关联的类型(整型,浮点型)

2.两个数组有相同的维数,且两个数组的元素是同一类型,并且在各处的下标范围内索引是同一类型或非常接近的类型,那么这两个数组是非常关联类型。

3.枚举类型不能被转换。

在类型与其子类型之间无需类型转换。

即使两个数组的下标索引方向不同,这两个数组任然有可能是非常关联类型的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小数分频器是一种常见的电路,能够将输入时钟信号分频为一个小于1的分数。VHDL是硬件描述语言,可以用于设计数字电路。下面是一个小数分频器的VHDL实现。 ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Fractional_Divider is Port ( CLK_IN : in STD_LOGIC; CLK_OUT : out STD_LOGIC; EN : in STD_LOGIC; RST : in STD_LOGIC; N : in UNSIGNED(9 downto 0); D : in UNSIGNED(9 downto 0)); end Fractional_Divider; architecture Behavioral of Fractional_Divider is signal counter : UNSIGNED(9 downto 0) := (others => '0'); signal div : UNSIGNED(19 downto 0) := (others => '0'); signal clk_div : STD_LOGIC := '0'; begin process (CLK_IN, RST) begin if (RST = '1') then counter <= (others => '0'); div <= (others => '0'); clk_div <= '0'; elsif rising_edge(CLK_IN) then if (EN = '1') then counter <= counter + 1; if (counter = (D - 1)) then counter <= (others => '0'); div <= div + N; clk_div <= not clk_div; end if; end if; end if; end process; CLK_OUT <= clk_div; end Behavioral; ``` 这个小数分频器的输入是一个时钟信号`CLK_IN`,还有一个使能信号`EN`和复位信号`RST`。输出是分频后的时钟信号`CLK_OUT`。`N`和`D`分别是分子和分母,用于计算分数。 在`process`中,首先根据复位信号清空计数器和除数寄存器以及分频后的时钟信号。然后在时钟上升沿触发时,如果使能信号为1,则将计数器加1。当计数器计数到D-1时,说明经过了D个时钟周期,需要对除数寄存器加上分数N,并将计数器清零。同时,分频后的时钟信号取反。 最后将分频后的时钟信号赋值给输出端口`CLK_OUT`即可。 这是一个简单的小数分频器的VHDL实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值