IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    vhdl 语法总结

    techbulo发表于 2017-04-17 08:51:08
    love 0

    一、        数据类型

    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.端口数组

    在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。

    
    —————————————PACKAGE———————————-
    
    library ieee;
    
    use ieee.std_logic_1164.all;
    
    ——————————————
    
    PACKAGE my_data_types IS
    
    TYPE vector_array IS ARRAY (natural range <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0); –声明8位的数组
    
    END my_data_types;
    
    ———————————–Main Code—————————————
    
    library ieee;
    
    use ieee.std_logic_1164.all;
    
    use work.my_data_types.all; –用户自定义包集
    
    ——————————————————————
    
    ENTITY mux IS
    
    PORT (inp: IN vector_array(0 to 3);
    
    END mux;
    
    ——————————————————————————-
    
    

    5.有符号数和无符号数

    要使用SIGNED和UNSIGNED类型数据,必须在代码开始部分声明ieee库中的包集std_logic_arith。它们支持算术运算但不支持逻辑运算。

    
    library ieee;
    
    use ieee.std_logic_1164.all;
    
    use ieee.std_logic_arith.all;
    
    ……
    
    SIGNAL a: IN SIGNED (7 DOWNTO 0);
    
    SIGNAL b: IN SIGNED (7 DOWNTO 0);
    
    SIGNAL x: IN SIGNED (7 DOWNTO 0);
    
    ……
    
    v <= a + b;
    
    w <= a AND b;  –非法(不支持逻辑运算)
    
    

    ——————————————————————————-

    STD_LOGIC_VECTOR类型的数据不能直接进行算术运算,只有声明了std_logic_signed和std_logic_unsigned两个包集后才可以像SIGNED和UNSIGNED类型的数据一样进行算术运算。

    6.数据类型转换

    在ieee库的std_logic_arith包集中提供了许多数据类型转换函数:

    1. conv_integer(p): 将数据类型为INTEGER,UNSIGNED,SIGNED,STD_ULOGIC或STD_LOGIC的操作数p转换成INTEGER类型。不包含STD_LOGIC_VECTOR。

    2.conv_unsigned(p,b):将数据类型为INTEGER,UNSIGNED,SIGNED或STD_ULOGIC的操作数p转换成位宽为b的UNSIGNED类型数据。

    3.conv_signed(p,b):将数据类型为INTEGER, UNSIGNED, SIGNED或STD_ULOGIC的操作数p转换成位宽为b的SIGNED类型的数据。

    4.conv_std_logic_vector(p, b):将数据类型为INTEGER, UNSIGNED, SIGNED或STD_LOGIC的操作数p转换成位宽为b的STD_LOGIC_VECTOR类型的数据。

    vhdl

    vhdl



沪ICP备19023445号-2号
友情链接