VHDL基础1
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 本质是并发执行的代码,但是在 process, function, procedure 内部的代码是顺序执行的,当它们作为一个整体时,相互之间也是并发执行的。
顺序代码并非只能与时序逻辑 (sequential logic) 对应,同样也可以用它们来实现组合逻辑 (combinational logic)。
这里主要讨论顺序代码,也就是这 3 个块中的代码,包括 if, wait, case, loop 语句。
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的更多相关文章
- VHDL基础2
Signals & Variables VHDL 提供了 signal 和 variable 两种对象来处理非静态数据:提供了 constant 和 generic 来处理静态数据. cons ...
- VHDL基础 学习笔记
最近一直忙着学校里的活动,所以没怎么更新,上周活动忙完了,正好也借着数电实验的机会,重新学习一下VHDL的编程.以下是转自360doc的教程: ———————————————————————————— ...
- vhdl基础---分频
偶数分频 ibrary IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_arith; use ieee.std_logic_unsigned ...
- VHDL TestBench基础(转)
TestBench的主要目标是: 实例化DUT-Design Under Test 为DUT产生激励波形 产生参考输出,并将DUT的输出与参考输出进行比较 提供测试通过或失败的指示 TestBench ...
- 1.ARM的基础知识
ARM简述 ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权.ARM技术具有很高的性能和功效,因而容易被厂商接受.同时,合作伙伴的增多,可获得更多的第三方工具.制造和软件支持,这又会使整个系统 ...
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
- 用C写一个web服务器(一) 基础功能
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- FPGA基础知识了解
FPGA学习的一些误区 FPGA入门必看资源 FPGA百度百科 FPGA基础知识及其工作原理 高端设计工具为少有甚是没有硬件设计技术的工程师和科学家提供现场可编程门阵列(FPGA).无论你使用图形化设 ...
- java基础数据类型包装类
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
随机推荐
- 以太坊测试网络搭建以及RPC服务开启-配置注意事项
.Eth QA Test环境: 数据文件路径: C:\Users\Administrator\AppData\Roaming\Ethereum console启动参数: --rpc --testnet ...
- socket错误代码
Socket error 0 - Directly send error Socket error 10004 - Interrupted function call一个封锁操作被对 WSACance ...
- asp.net core webapi iis jquery No 'Access-Control-Allow-Origin' header is present on访问跨域问题
我的解决方案是:设置特定method允许所有请求源访问,具体看业务需求 第一步:starup文件下ConfigureServices中增加如下配置 //跨域//设置了允许所有来源 services.A ...
- 10.9h5日记
一.单位 1.px是基本的单位,像素 2.em也是一个单位,使用方式,用元素父级的字体大小乘以em前的数字,父级没有就向上一个父级找, 直到body为止,如果body没有,就用默认的字体大小16px ...
- hdu 5455 (2015沈阳网赛 简单题) Fang Fang
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5455 题意就是找出所给字符串有多少个满足题目所给条件的子串,重复的也算,坑点是如果有c,f以外的字符也是不 ...
- POJ 2449Remmarguts' Date 第K短路
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 29625 Accepted: 8034 ...
- 模态框MODAL的一些事件捕捉
下表列出了模态框中要用到事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.modal 在调用 show 方法后触发. $('#identifier').on('show.bs.m ...
- is not allowed to connect to this MySQL server解决办法
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; myuser:代表你 ...
- mybatis 一次执行多条语句
现在的一些互联网应用 为了提高性能,现在一般比较少的使用外键.不是不用,只是在创建数据库不标明外键关系,用程序去维护. 为了维护数据一致性,我们需要手动完成相关数据的删除 比如用户和用户的关注 当用户 ...
- Linux入门练习操作命令
查看目录命令 1. 显示目录下所有文件 2.显示所有文件,包括隐藏文件 创建目录命令 1.在改目录下创建文件夹“practise” 切换目录 1.切换到指定的目录 2.切换到上一级目录 3.还在当前目 ...