怎么往integer型数组添加数据_VHDL中的数据类型用法和类型转换

fa703584ff7e7ecd8dcc9ad4b95a8d34.png
//VHDL

[数据类型]

在VHDL中,
必须在信号声明(信号),变量声明(变量)和常量声明(constant)的所有情况下指定数据类型。
如果此类型不同,则诸如赋值之类的表达式将作为错误翻转。
VHDL不仅具有多种类型的数据,
还可以自己创建新类型。
此外,还有在这些不同类型之间转换的函数。 [VHDL的标准类型]
//下表中的类型是VHDL标准预先提供的,

[用户定义类型]

 用户可以定义新的数据类型。
那时,使用了称为type和subtype的声明语句。 (1)类型定义
  用于新类型定义的类型语句的格式如下。
 <<对于枚举类型>> 类型数据类型名称为(element,element,...);
  示例周类型WEEK的定义类型WEEK
   类型为(SUN,MON,TUE,WED,THU,FRI,SAT);
  示例std_logic
   std_logic 的定义是最常用的类型,在名为std_logic_1164的
   IEEE程序包中键入如下。
   std_logic类型为('U','X','0','1','Z','W','L','H','-');
 <<对于整数类型>>对于
   整数类型用范围指定值的范围。如果不这样做,则
   可能会创建32位类型,并且可能导致电路增大。 type数据类型名称是i到j的整数范围;
   示例BCD数字类型数字
    type digit is integer range 0 to 9; (2)子类型定义
  子类型是可以
  使用描述性名称重新定义的一系列现有数据类型。
  为此,请使用子类型语句,其格式如下。 subtype子类型名称是数据类型名称[range | range];    
std_logic_vector的子类型名定义:
  subtype IOBUS is std_logic_vector(7 downto 0);

   subtype DIGIT is integer range 0 to 9;

[数组类型]

数组是一种新的类型定义,它收集相同类型的数据并将其
定义为新类型。格式如下。

 type数据类型名称是原始类型名称的数组范围;

可以在此范围部分中指定各种类型。如果未指定类型,则将其
视为integer 。

示例以下内容相同。
  type WORD is array(1 to 8) of std_logic;
  type WORD2 is array(integer 1 to 8) is std_logic;

示例std_logic_vector类型定义
  在IEEE std_logic_1164中定义如下。

   type std_logic_vector is array (Natural range <>) of std_logic;


多维数组>>
 范围由两个或多个的组合指定以创建多维数组。

  示例二维数组示例
 
    type memarray is array (0 to 5, 7 downto 0)  of std_logic;

  使用上述类型
 
    常量ROMDATA的示例ROM创建示例:
memarray:=((''0','0','0 ','0','0','0','0','0'),
            ('0','1','1','1','0','0','0','1'),
       ('0','0','0','0' ,'0','1','0','1'),
       ('1','1','0','0','0','1','1','0' ),
       ('1','1','1','1','1','1','1','1')))
 (注)必须在常量语句中设置初始值然后,
     使用符号“:=” 在数据类型名称后定义初始值。
     constant AAA : std_logic := "0";

 (注)使用上述多维数组的ROM定义时,
     无法生成实际的逻辑电路。因此,上述ROM数据
     用于创建用于仿真模式的数据。


<<数组重载>>在
 定义类型时,定义数组的原始类型和新数组
 称为数组重载。
 例如,在下面的示例中,定义了
 最初具有数组std_logic_vector类型的WAVE类型,并且基于该WAVE类型重载了新的阵列ROM。

 在下面的示例中,此新的ROM类型定义了常量SINE。和
 实际的初始值被定义为:下面=,但由于它是std_logic_vector
 ,64个阵列的6位长度被布置并限定。此内容是一个6位分辨率正弦波
 周期的数据。

 因为由过载限定的ROM可以作为逻辑电路中产生在
 这种方式,有可能对许多恒定字符串与逻辑电路相结合。

   示例:生成6位正弦波的sin值的二进制数组
 
 

251c61d266df491a5f1a7be5186294e3.png

[类型转换]

VHDL需要精确的类型匹配。因此,
无法进行不同类型之间的操作和分配。为了执行分配,必须将其转换为分配侧的类型。
有用于转换此类型的语法,并且提供了类型转换功能。
功能名称	
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VHDL ,要将 INTEGER数组转换为 STD_LOGIC_VECTOR 类数组,可以采用以下方法: 1. 首先,我们需要确定 STD_LOGIC_VECTOR 的位宽。可以通过计算 INTEGER 数组的最大值和最小值来确定位宽,如下所示: ```vhdl -- 计算 INTEGER 数组的最大值和最小值 constant int_max : integer := integer'image(integer'max(array_name)); constant int_min : integer := integer'image(integer'min(array_name)); -- 计算 STD_LOGIC_VECTOR 的位宽 constant bit_width : integer := integer'image(int_max - int_min + 1)'length; ``` 2. 然后,我们可以使用 FOR 循环依次将 INTEGER 数组的元素转换为 STD_LOGIC_VECTOR 类,并存储到新的数组,如下所示: ```vhdl -- 声明 STD_LOGIC_VECTOR 数组 signal slv_array : std_logic_vector(array_name'length-1 downto 0); -- 转换 INTEGER 数组为 STD_LOGIC_VECTOR 数组 for i in array_name'range loop slv_array(i) <= std_logic_vector(to_unsigned(array_name(i) - int_min, bit_width)); end loop; ``` 注意: - 以上代码,我们使用 to_unsigned 函数将 INTEGER的元素转换为无符号数,再使用 std_logic_vector 函数将其转换为 STD_LOGIC_VECTOR 类。此处需要注意的是,to_unsigned 函数的第二个参数应该为整数的位宽,即 bit_width。 - 在转换后的 STD_LOGIC_VECTOR 数组,元素的位宽均为 bit_width。如果 INTEGER 数组的元素超出了 STD_LOGIC_VECTOR 的位宽,将会发生截断。因此,在进行转换之前,应该先对 INTEGER 数组进行适当的范围限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值