Description Structure



  • 一个可综合的VHDL描述中一般由3部分组成:LIBRARY declarations、ENTITY、ARCHITECTURE
  • Library(库)用来设计重用和代码共享,使代码结构更清晰
 LIBRARY library_name;
USE library_name.package_name.package_parts;
    • 常用的三个Libray:ieee、std、work
    • 其中std、work是默认可见的,不需声明,ieee需要明确的声明
  • Entity(实体)描述电路的输入/输出引脚
    ENTITY entity_name IS
    GENERIC(参数名:数据类型:=设定值
    ...);
    PORT (port_name1: port_mode data_type;
    port_name2: port_mode data_type;
    ...);
    END entity_name;
    • GENERIC类属性为可选,用来指定诸如数据总线宽度、延时时间等参数
    • singal_mode 可以是 4 种类型:in  out  inout  buffer
    • OUT 模式无法回读到电路内部,Buffer 模式可以,但是 buffer 不能连接到其他类型的端口,即不能把该模块作为子模块例化,一般使用中间缓冲信号,解决回读问题。
  • Architecture(结构体)描述电路的行为和实现的功能
    • Architecture 包含两个部分:声明部分和代码部分
    • 声明部分(可选)用来声明数据类型、常量、信号、子程序、元件等
    • 代码部分 (begin...end)描述电路行为
       ARCHITECTURE 结构体名 OF 实体名 IS
      说明语句
      BEGIN
      功能描述语句
      ......
      END 结构体名;
  • 注释用 -- 开始
  • VHDL不区分大小写

Data Types


三种数据对象,声明信号 signal

 signal name : type [range] [:= initial_vaule];

还有 常量 constant 声明:

 constant name : type := value;

还有 变量 variable 声明

 variable name : type [range] [:= initial_vaule];

Pre-defined Data Types

bit & bit_vector

  • 用'0'、'1'赋值
 signal x : bit;
signal y : bit_vector ( DOWNTO ); x<='';
y<=""

std_logic & std_logic_vector

  • 不同于bit类型,可取9种逻辑数据类型,但只有、、X、Z 可综合
  • std_logic 是 std_ulogic的子集

Boolean

  • 两种取值:true、false

TIME

 CONSTANT t_delay:TIME:= ns
  • 数值部分和单位之间有个空格
  • fs、ps、ns、us、ms、sec、min、hr   103关系

integer

  • 32位表示的整数 范围-(231-1)~(231-1)
  • 其他进制整数先写进制数,再用#括起来16#1F#

real

  • 小数表示、科学计数表示

character & string

  • 使用字符串的可以是常量 和 变量

User-defined Data Types

 --integer range
TYPE student IS RANGE TO ; --enumerated(枚举)
TYPE state IS (state0,state1,state2,state3); --Array
TYPE matrix IS ARRAY ( TO ) OF std_loogic_vector;

Port Array

有时在定义端口时,需要把端口定义为矢量阵列。但是在 Entity 中不允许使用 type 定义,所以我们必须自己定义包集 (package),然后使用 use 声明使用该用户自定义的包集,最后才能在 Entity 中使用这种新定义的类型。

Data Conversion

  • 在 VHDL 中,不同类型的数据是不能直接进行算术/逻辑运算的,所以必要时必须进行类型转换操作。

             函数名称                        函数功能            
TO_STDLOGICVECTOR()         由BIT_VECTOR转为STD_LOGIC_VECTOR型  
TO_BITVECTOR() 与上相反
TO_STDLOGIC() 由BIT型转为STD_LOGIC型
TO_BIT 与上相反
CONV_STD_LOGIC_VECTOR(a,位长) 由整型转为STD_LOGIC_VECTOR型
CONV_INTEGER() 与上相反

Operators


VHDL 语法虽然枯燥无味,但是只有对数据类型、运算操作符及其属性有了深刻认识,才能写出高质量和高效率的代码。

Opreators

  • VHDL提供了6种预定义的预算符:
    • 赋值 assignment
    • 逻辑 logical
    • 算术 arithmetic
    • 关系 relational
    • 并置 concatenation

assignment

一共三种:

  • <= 用于给 signal 对象赋值
  • :=  用于给 variable, constant, 赋值
  • => 用于给矢量(vector)对象的某些位赋值,常和 others 一起使用

logical

进行逻辑运算,操作数必须是 bit, std_logic, std_ulogic 类型或者他们的扩展,即 bit_vector, std_logic_vector, std_ulogic_vector 类型

  • NOT, AND, OR, NAND, NOR, XOR

arithmetic

  • 操作数是 signed,  integer, real,其中 real 类型是不可综合的
  • +   -   *   /   **   MOD   REM   ABS

comparison

一共有6种:=   /=   >   <   >=   <=

concatenation

用于位的拼接。

  • 操作数:任何支持逻辑运算的数据类型
  • 操作符:&   (, , ,)

Concurrent Code


HDL对应的是硬件电路,而硬件电路时刻工作,所以它的代码是并发执行的。只有process、function、procedure中的代码是顺序执行的,而这些模块作为共同整体时,它们之间也是并行的。

在并发代码中可以使用下列各项:

  • 运算操作符
  • when 语句(when/else 和 with/select/when)
  • generate 语句
  • block 语句

when

when/else syntax:

 assignment WHEN condition ELSE
assignment WHEN condition ELSE
...;

with/select/when syntax:

 WITH 选择信号表达式 SELECT
assignment WHEN value,
assignment WHEN value,
...;

generate

常和 for/if 一起使用,因为描述对象是电路,电路是固定的,功能也是静态的,所以一种用途是生成相同元件的多次实例化,第二种用途是生成结构相同的多次赋值、组合逻辑。两种用途目的都是减少代码量,增加可读性和可维护性

block

为了把较长的代码分成几个较小的区域,便于阅读和维护,在每个块内都能对局部信号、数据类型和常量定义

 块标号:BLOCK[(块保护表达式)]
[说明部分]
BEGIN
并行语句
END BLOCK [块标号];

Sequential Code


VHDL 本质是并发执行的代码,但是在 processfunctionprocedure 内部的代码是顺序执行的,当它们作为一个整体时,相互之间也是并发执行的。

顺序代码并非只能与时序逻辑 (sequential logic) 对应,同样也可以用它们来实现组合逻辑 (combinational logic)。

这里主要讨论顺序代码,也就是这 3 个块中的代码,包括 ifwaitcaseloop 语句。

process

在一个结构体中允许放置多个进程语句,这些进程也都是并行的,每个进程内部由一系列顺序语句构成

 [进程标号:] PROCESS [敏感信号参数表] IS
[进程说明部分]
BEGIN
顺序描述语句
END PROCESS [进程标号];
  • 每当敏感信号参数表里的任何参数变化时,进程都被激活重新执行一遍
  • 进程说明部分主要定义一些局部量如常量, 变量,子程序等,但这里不能定义信号
  • 顺序描述语句是最重要的部分,常用顺序语句 if/case/loop

if

 IF conditions THEN assignment;
ELSIF conditions THEN assignments;
......
ELSE assignments;
END IF;

case

case 和 when 的区别在于,case 允许在每个测试条件下执行多个赋值操作,而 when 只能执行一个赋值操作。

 CASE 表达式 IS
WHEN value => assignment;
WHEN value => assignment;
...
WHEN OTHERS => assignments;
END CASE;

loop

常用格式有两种

loop

 [loop标号:] LOOP
顺序语句;
END LOOP[loop 标号];

for/loop

 [LOOP标号:] FOR 循环变量 IN 循环参数范围 LOOP
顺序语句;
END LOOP[LOOP 标号];
  • 循环变量是一个临时局部变量,由LOOP语句自动定义

LOOP不能自己跳出循环,也不能自己跳到另一个循环,有时候需要加入其它控制语句

 [标识:] EXIT [LOOP 标识] [WHEN condition];

 [标识:] NEXT [另一个LOOP 标识] [WHEN condition];

/*****注释*****/

*一组在逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上互相重叠

VHDL基础1的更多相关文章

  1. VHDL基础2

    Signals & Variables VHDL 提供了 signal 和 variable 两种对象来处理非静态数据:提供了 constant 和 generic 来处理静态数据. cons ...

  2. VHDL基础 学习笔记

    最近一直忙着学校里的活动,所以没怎么更新,上周活动忙完了,正好也借着数电实验的机会,重新学习一下VHDL的编程.以下是转自360doc的教程: ———————————————————————————— ...

  3. vhdl基础---分频

    偶数分频 ibrary IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_arith; use ieee.std_logic_unsigned ...

  4. VHDL TestBench基础(转)

    TestBench的主要目标是: 实例化DUT-Design Under Test 为DUT产生激励波形 产生参考输出,并将DUT的输出与参考输出进行比较 提供测试通过或失败的指示 TestBench ...

  5. 1.ARM的基础知识

    ARM简述 ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权.ARM技术具有很高的性能和功效,因而容易被厂商接受.同时,合作伙伴的增多,可获得更多的第三方工具.制造和软件支持,这又会使整个系统 ...

  6. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

  7. 用C写一个web服务器(一) 基础功能

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  8. FPGA基础知识了解

    FPGA学习的一些误区 FPGA入门必看资源 FPGA百度百科 FPGA基础知识及其工作原理 高端设计工具为少有甚是没有硬件设计技术的工程师和科学家提供现场可编程门阵列(FPGA).无论你使用图形化设 ...

  9. java基础数据类型包装类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

随机推荐

  1. C#按制定的环境编译替换不出对应的配置项的解决措施。

    1. 比如选择的 编译或者发布 环境是 QA ,但是QA里面配置的 替换节点 实际并没有被替换 解决方案: 在项目文件.csproj中最底部加入一下代码,应该成功.成功将QA的配置节点 替换掉默认的 ...

  2. Redhat(RHEL)配置静态IP

    vim /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=itcc.dev GATEWAY=192.168.0.1 v ...

  3. mybatis入门--#{}和${}的区别

    我们知道,在mybatis中,sql语句是需要我们自己写的.跟在普通的sql不一样的是,我们在使用mybatis框架的时候,使用的占位符不是 ? 而是 #{} 有时候还会出现这个符号 ${} 这些符号 ...

  4. qrcode解决方案大全

    QRCODE解决方案 1.delphi原生QRCode.pas 2.delphi编写http服务器实现QRcode请求生成图片,http下载 3.delphi编写cgi程序,加载到apache服务器 ...

  5. jQuery操作(二)

    一: 操作元素 1. 属性操作 1.1 $("p").text() $("p").html() $(":checkbox").val() 1 ...

  6. 存储过程和函数 PROCEDURE & FUNCTION

    SQL语句执行的时候,要首先编译,然后在被执行.在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行. 具体而言 ...

  7. Servlet 2.x 规范

    Servlet 2.x 规范 sun 公司制订的一种基于 Java 技术的 WEB 服务器功能的组件规范.1997 年六月,Servlet 1.0 版本发行,最新版本 Servlet 4.0 处于研发 ...

  8. Previous Permutation

    Similar to next permutation, the steps as follow: 1) Find k in the increasing suffix such that nums[ ...

  9. openssl编译安装-各种蛋疼

    arm平台  ubuntu Linux xxxxxx 3.0.62 #2 PREEMPT Tue Apr 2 20:14:12 CST 2013 armv7l armv7l armv7l GNU/Li ...

  10. Spring中@Autowired注解、@Resource注解的区别 (zz)

    Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...