Signals & Variables


VHDL 提供了 signal 和 variable 两种对象来处理非静态数据;提供了 constant 和 generic 来处理静态数据。

constant 和 signal 是全局的,可以在顺序执行的代码中,也可以在并发执行的代码中;variable 是局部的,只能值顺序代码中,并且它们的值是不能向外传递的(如果想传递出去,必须先把这个变量值传递给一个信号,再由这个信号传递出去)。

constant

constant 可以定义在 package, entity, architecture 中,对应的作用域也不同。

  • 定义在 package 中的 constant 是真正的全局的,可以被所有调用该 package 的 entity 使用

  • 定义在 entity 中的 constant 对于该 entity 的所有 architecture 而言是全局的

  • 定义在 architecture 中的 constant 仅在该 architecture 中是全局的

signal

VHDL 中的 signal 代表的是逻辑电路中的 “硬”连线,既可以用于电路的输入输出端口,也可以用于 内部单元之间的连接。

variable

相比于 signal 是局部的,variable 只能在 process,function,procedure 中使用,而且对它的赋值是立即更新的,新的值可以在下一行代码中立即使用。

Packages and Components


package

除了 componentfunctionprocedure 之外,package 中还可以包含 TYPECONSTANT 的定义。

 PACKAGE package_name IS
(declarations)
END package_name; [PACKAGE BODY package_name IS
(delarations
and conments)
END package_name;]

可以看到,语法包括两部分,PACKAGE 和 PACKAGE BODY

Component

一个 component 是一段完整的代码(包括 library, entity, architecture 这些组成部分),如果将这些代码声明为一个 component,那么就可以被其他电路调用,从而使代码具有了层次化的结构。

使用 component 必须先声明这个元件,然后再例化这个元件(类似 C++,变量先声明,在定义)。声明和例化都必须在 architecture 中进行。

declaration syntax
 COMPONENT component_name IS
--元件端口信息
PORT(
port_name: signa_type;
port_name: signa_type;
...);
END COMPOMENT;
instantiation(例化) syntax
 例化名: component_name PORT MAP (port_list);

声明元件时,可以有两种方法:

  • 上面的方法,先声明再例化

  • 使用 package 进行声明,将 component 的声明放在 package 中,则可以避免每次元件例化都要重复声明

Functions and Procedure


function 和 procedure 统称为 子程序,它们和 process 相似,内部包含的都是顺序描述的代码,通常使用相同的顺序描述语句。但是,function 和 procedure 的存在主要是为了建库,以达到代码重用和共享的目的,当然它们也可以直接建立在主代码中。

Function

在写代码的过程中,我们通常会遇到一些有共性的问题,我们希望实现这些功能的代码可以被共享和重用,从而使代码变得简洁,易于理解,function 的建立和使用就能达到这个目睹。 function 中可以使用 ifcaseloop 等语句,但是不能有 signal 和 component

Function Body
 FUNCTION function_name [<参数列表>] RETURE 数据类型 IS
[说明部分] BEGIN
(顺序语句)
END function_name;

其中,函数的参数列表:

 <parameter list> =[CONSTANT] name : type;
= SIGNAL name : type;
Function Call

函数可以单独构成表达式,也可以作为表达式的一部分

Function Location

函数可以存放在两个地方:

  • Package 中,这时候,函数声明在 package 中,函数定义在 package body 中

  • Main Code 中,既可以在 entity 中,也可以在 architecture 中

FUNCTION versus PROCEDURE Summary

  • function 有任意个输入参数和一个返回值,输入参数只能是 constant, signal

  • procedure 有任意个输入/输出/双向参数,可以是 signal, variable, constant

  • function 可以作为表达式的一部分,procedure 直接调用

  • function 和 procedure 内部,wait 和 component 都不可综合

  • function 和 procedure 的存放位置相同,经常位于 package 中,也可以在主代码中

VHDL基础2的更多相关文章

  1. VHDL基础1

    Description Structure 一个可综合的VHDL描述中一般由3部分组成:LIBRARY declarations.ENTITY.ARCHITECTURE Library(库)用来设计重 ...

  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. 遇到返回键会退到页面的问题(window.location)

    我的需求是a全局列表页->b展示列表页->c新增页(编辑页)我从b展示列表页,通过编辑进入c编辑页,保存回到b展示列表页. 重,我的b展示列表页,返回要返回的其实是a全局列表页*使用rep ...

  2. maven项目打包发布到私有仓库

    在项目开发中通常会引用其他的jar,怎样把自己的项目做为一个jar包的形式发布到私服仓库中,主要有以下三个步骤 (怎样配置maven私服仓库,就不再这里说明了,可以参考以前的文章)1.在maven的s ...

  3. Java泛型:List<?>与List的区别

    为什么说List<?>是type-safe而List不是type-safe的? 1.List<?> compiler看到了你使用了wildcard ?,那么相当于你对compi ...

  4. ES6解构赋值的应用场景

    一.变量交换 1.ES6的方式 { let a=; let b=; [a,b]=[b,a]; console.log(a,b); } 输出为 2.ES5的方式 采用中间变量的方式进行存储 二.获取函数 ...

  5. [转载]linux awk命令详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  6. UVA-1364.Knights of the Round Table 无向图BCC

    题目链接:https://vjudge.net/problem/UVA-1364 题意:有n个人参加会议,互相憎恨的人不能坐在相邻的位置,并且每个会议参加的人数必须是奇数,求有多少个人不能参加任何一个 ...

  7. 买茶叶想到的哪个比较便宜 x1/y1 >x2/y2 x代表多少钱 y代表 多少克 无聊的试炼

    茶叶1 128元     200克 茶叶2  330元    160克 当然这个哪个便宜 一眼就知道了,这里不过抛砖引玉 128元    330元 200克    160克 我们把价钱用x表示 多少克 ...

  8. Nodejs学习笔记:基础

    本文章主要记录Nodejs基础知识点 安装 首先从Node.js官网下载安装包,并添加到环境变量.然后打开命令行,输入 node --version ,可查看版本信息 npm是Node.js的包管理工 ...

  9. IPutils

    package com.mmall.util; import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils ...

  10. iOS中堆和栈的区别

    管理方式: 对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作有程序员控制,容易产生memory Leak. 申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块 ...