芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 284|回复: 0

FPGA学习-VHDL语言

[复制链接]
  • TA的每日心情
    慵懒
    昨天 09:09
  • 3

    主题

    3

    帖子

    555

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    555
    发表于 2025-3-19 14:37:15 | 显示全部楼层 |阅读模式
    引言

    在 FPGA(现场可编程门阵列)行业中,许多从业者在工作里都有过理解,甚至调用基于 VHDL 语言编写的数字逻辑设计代码的经历。VHDL 作为数字电路设计领域的两大主流硬件描述语言之一,其语法标准的诞生比另一个主流标准 Verilog 早了约 8 年。
    相较于 Verilog,VHDL 语言在严谨性和准确性方面表现更优。即便在 Verilog 广泛应用的当下,军工和航空航天领域依然偏好使用 VHDL。此外,Xilinx 原厂提供的大量开源设计也采用 VHDL 语言编写。这些因素共同促使 VHDL 语言始终保持着旺盛的生命力。
    对于 FPGA 工程师而言,具备编写 VHDL 代码的能力,无疑会为工作带来诸多便利。退一步讲,即使无法进行代码编写,掌握阅读和理解 VHDL 代码的能力也是必不可少的。
    在此,小梅哥精心整理并总结了 VHDL 语法的一些常用内容,供大家参考学习。




    1.1认识VHDL

       
       
    在数字电路设计领域,Verilog和VHDL作为两大主流硬件描述语言(HDL),工程师需要具备跨语言理解能力。从概念上说,VHDL旨在支持硬件设计周期中的每个阶段。可以从VHDL参考手册(IEEE-1076-2008)的序言中清楚的看到这一点,该手册对VHDL做了如下定义:
       Abstract: VHSIC Hardware Description Language (VHDL) is defined. VHDL is aformal notation intended for use in all phases of the creation of electronicsystems. Because it is both machine readable and human readable, it supportsthe development, verification, synthesis, and testing of hardware designs; thecommunication of hardware design data; and the maintenance, modification, andprocurement of hardware. Its primary audiences are the implementors of toolssupporting the language and the advanced users of the language.
       摘要:VHSIC硬件说明语言(VHDL)定义。 VHDL是一种形式化符号,旨在在电子系统创建的所有阶段使用。因为它既是机器可读的,也是人类可读的,所以它支持硬件设计的开发,验证,合成和测试。硬件设计数据的通信;以及硬件的维护,修改和采购。它的主要受众是支持语言和高级用户的工具的实施者。
       VHDL是美国军方开发的一种RTL级语言,它有自己的特点,具体特点如下:
    1.语言严谨
       VHDL由于语法严谨,约束我们的书写结构,不容出现bug,因此有些对电路稳定性要求较高的设计单位采用VHDL。
    2.数据类型丰富
       VHDL支持丰富的数据类型,不同的数据类型不能进行值的传递。
    3.支持局部信号
       VHDL支持进程局部信号,即变量,verilog只支持全局信号。
    1.1.1设计单元
       Verilog将设计封装为模块module  … endmodule ,VHDL将设计分为4个部分,分别是库、包、实体、结构体。
    1.
       存放所有设计相关文件的仓库,在计算机中为一段存储空间,这个存储空间有物理映射名字,这个名字就叫做库名,规定库不能由用户定义,只能由语言的设计者或相关授权。
       Library 库名;
       Use 库名.包名.项;
       Use 库名.包名.all;
       ·IEEE库
          标准库,IEEE为美国电子机电工程师学会指定的库,也是使用最常见的库。
       ·STD库
          语言预定义库,本质上是IEEE库的扩展
       ·VITAL库
          针对ASIC设计提供了一些高进度,高效率的仿真模型。
       ·Work
          临时库,用来存放所有与用户设计相关的文件
    2.
       用来定义电路设计中的公共属性(参数,函数),相当于C语言的头文件。
       package 包名 is
          定义常量
          定义函数
          ……
       end;
       package body 包名 is
           函数体
       end;
       包可以由用户定义,也可以预定义包,常见的预定义包如下:
       ·STD_LOGIC_1164
          定义了一些数据类型,子类型,以及相关函数,其中STD_LOGIC和STD_LOGIC_VECTOR这俩数据类型在电路设计中对信号定义非常重要,代替了BIT和BIT_VECTOR。
       ·STD_LOGIC_ARITH
          定义了数学运算相关的运算符以及相关函数,包括有符号数和无符号数运算
       ·STD_LOGIC_SIGNED
          它是STD_LOGIC_ARITH包的完善,主要是针对有符号数据定义了有符号数运算相关的符号以及函数。
       ·STD_LOGIC_UNSINGNED
          它是STD_LOGIC_ARITH包的完善,主要是针对无符号数据定义了无符号数运算相关的符号以及函数。
    3.实体
       用来定义一个电路模块的外部属性,外部属性包括端口和模块参数
       entity 实体名 is
          Generic (
          常数名 : 数据类型:= 设定值
       );
        Port (
          端口名 : 端口方向 端口类型
       );
       end 实体名;
    4.结构体
       Architecture 结构体名 of 实体名 is
       定义信号;
       定义元件;
       定义常量;
       Begin
       行为建模;
       数据流建模块;
       结构建模;
       End 结构体名;
    1.2VHDL基本语法
    1.2.1  数的表示
       在HDL中数的表示与量的属性有关,量有逻辑和数学2种,换句话说就是量是数学类型还是逻辑类型。
    1.数学类型
       如果量(常量,信号,变量)是数学类型,比如integer ,数的表示如下:
       ·10#170#(十进制数170)
       ·2#101011#(二进制数101011,对应的十进制数是43)
       ·16#A5#(十六进制数A5,对应的十进制数是165)
       ·10#170#E2(十进制数170 * 10^2,即17000)
       ·2#101011#E3(二进制数101011 * 2^3,对应的十进制数是43 * 8 = 344)
       ·16#A5#E4(十六进制数A5 * 16^4,对应的十进制数是165 * 65536 = 10813440)
    2.逻辑类型
       如果量(常量,信号,变量)是逻辑类型,比如std_lotic_vetor ,数的表示如下:
       ·B“10101010”(表示二进制数10101010)
       ·"10101010" (表示二进制数10101010)
       ·O“34” (表示八进制数34,对应的二进制数是011100)
       ·X“A5” (表示十六进制数A5,位宽必须是4的整数倍)
    1.2.2  位的表示
       MSB:LSB  如:std_logic_vector(7 downto 0)
       LSB:MSB  如:std_logic_vector (0  to 7)
    1.2.3  沿的表示
       ·上升沿
          如:clk’event and clk =‘1’  
          Rising_edge(clk);
       ·下降沿
          如:clk’event and clk =‘0’  
          falling_edge(clk);
    1.2.4  运算符
    1.逻辑运算符
       AND(与)、OR(或)、NOT(非)、NAND(与非)、NOR(或非)、XOR(异或)、XNOR(同或)。
       适用类型:BIT、BIT_VECTOR、STD_LOGIC、STD_LOGIC_VECTOR等逻辑类型。
       优先级:NOT优先级最高,其他逻辑运算符优先级相同,需用括号明确顺序。
    2.算术运算符
       +(加)、-(减)、*(乘)、/(除)、**(指数)、MOD(取模)、REM(取余)、ABS(绝对值)。
       适用类型:INTEGER、REAL、SIGNED、UNSIGNED(需声明相应库,如numeric_std库)。
       注意:直接使用+、-对STD_LOGIC_VECTOR需类型转换,通常需引入算术库(如numeric_std)。
    3.关系运算符
       =(等于)、/=(不等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)。
       适用类型:所有可比较类型,如数值、逻辑向量等。
       注意:位矢量比较时需位宽一致,否则按从左到右逐位比较(可能导致逻辑错误)。
    4.移位运算符
       SLL(逻辑左移,右侧补0)、SRL(逻辑右移,左侧补0)。
       SLA(算术左移,右侧补0)、SRA(算术右移,左侧补符号位)。
       ROL(循环左移)、ROR(循环右移)。
       适用类型:BIT_VECTOR或STD_LOGIC_VECTOR。
    5.并置运算符
       &(连接符)。
       功能:将多个向量拼接成新向量。
       示例:B"1010" & X"A" → 10101010。
       适用类型:BIT、BIT_VECTOR、STD_LOGIC、STD_LOGIC_VECTOR。
    6.赋值运算符
       <=:用于信号(Signal)赋值,支持时序逻辑。
       :=:用于变量(Variable)或常量(Constant)赋值。












    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2025-4-2 07:29 , Processed in 0.075491 second(s), 30 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表