没头没脑小憨包
FPGA(Field Programmable Gate Array)现场可编程逻辑门阵列
专用集成电路(英语:Application Specific Integrated Circuit,缩写:ASIC),是指依产品需求不同而客制化的特殊规格集成电路;相反地,非客制化的是应用特定标准产品(Application-specific standard product)集成电路。
HDL (Hardware description language) 硬件描述语言
CPLD (Complex programmable logic device) 复杂可编程逻辑器件
低密度可编程逻辑器件也称为简单可编程逻辑器件(SPLD)
VHDL,全称超高速集成电路硬件描述语言(英语:VHSIC very high-speed hardware description language),在基于复杂可编程逻辑器件、现场可编程逻辑门阵列和专用集成电路的数字系统设计中有着广泛的应用。
Verilog是一种用于描述、设计电子系统(特别是数字电路)的硬件描述语言,主要用于在集成电路设计,特别是超大规模集成电路的计算机辅助设计。
逻辑器件:通常指门电路和触发器。
逻辑功能部件:指能执行某个单一功能的电路,如计数器、译码器、加法器等。
数字系统:指由若干逻辑部件组成,能实现复杂功能的电路;规模较大的系统还可分成若干子系统。
系统与部件:其区别在于功能是否单一。
存储器称为部件(尽管规模很大,但功能单一);
数字密码锁称之为系统(只需几片MSI器件即可实现)
**仿效计算机组成方式:**将整个数字系统分为控制器和受控器二部分(或 分成控制器、处理器和存储器三个部分)。
该情况下,系统与部件的区别在于其中有无控制器:一个数字电路, 无论其规模大小,必须具有控制器才可称之为系统。
IP核就是知识产权核或知识产权模块的意思
IP核有三种不同的存在形式:HDL语言形式,网表形式、版图形式。分别对应我们常说的三类IP内核:软核、固核和硬核。
PLD设计(可编程ASIC)
1.设计输入(原理图/HDL文本编辑)
2. 综合
3. 适配
4.仿真:行为仿真、功能仿真与时序仿真、静态时序分析
5. 编程下载
如果编译、综合、布线/适配和行为仿真、功能仿真、时序仿真等过程都没有发现问题,即满足原设计的要求,则可以将由FPGA/CPLD布线/适配器产生的配置/下载文件通过编程器或下载电缆载入目标芯片FPGA或CPLD中。
6. 硬件测试
ASIC设计简介
ASIC设计一般流程简述
基本原理
作图表示
器 件 | 与 阵 列 | 或 阵 列 | 输出电路 |
---|---|---|---|
PROM | 固定 | 可编程 | 固定 |
PLA | 可编程 | 可编程 | 固定 |
PAL | 可编程 | 固定 | 固定 |
GAL | 可编程 | 固定 | 可组态 |
例:半加器
General Array Logic Device
与阵列 + 输出逻辑宏单元(OLMC)
优点:
通用性好。宏单元可根据需要任意组态,当输入引脚不够用时还可将OLMC组态为输入端,因而使用十分灵活.
采用UVMOS或EECMOS工艺,可重复使用
不足:
※ 只能作为同步时序电路使用,且只能是外加时钟;
※ 各触发器只能同时置位和清零;
※ 每个宏单元只有一条向与阵列反馈的通道;
※ 每个OLMC中或门的输入端是固定的。
MAX 7000S器件的内部结构
FPGA器件的内部结构示意图
典型FPGA的结构 XC4000器件的CLB结构
Altera的Cyclone IV器件结构
Cyclone IV器件的LE结构
(1)基于电可擦除存储单元的EEPROM或Flash技术。
(2)基于SRAM查找表的编程单元。
(3)基于一次性可编程反熔丝编程单元。
CPLD在系统编程
FPGA配置方式
Altera的FPGA器件配置方式
方 式 | 说 明 |
---|---|
PS**(Passive Serial)模式** | 被动串行,由外部主机(MAX II芯片或微处理器)控制配置过程 |
AS**(Active Serial)** | 主动串行,用串行配置器件(如EPCS1,EPCS4,EPCS16)配置 |
FPP**(Fast Passive Parallel)** | 快速被动并行,使用增强型配置器件或并行同步微处理器接口进行配置 |
AP**(Active Parallel)** | 主动并行 |
PPS**(Passive Parallel Synchronous)** | 被动并行同步,使用并行同步微处理器接口进行配置 |
PPA**(Passive Parallel Asynchronous)** | 被动并行异步,使用并行异步微处理器接口进行配置 |
JTAG模式 | 使用下载电缆通过JTAG接口进行配置 |
VHDL 库: 使用LIBRARY语句打开
常用的有:IEEE、STD、WORK等
程 序 包:需要时可使用USE语句打开,常用的包括:
STANDARD、TEXTIO、STD_LOGIC_1164、
STD_LOGIC_ARITH、STD_LOGIC_SIGNED、
STD_LOGIC_UNSIGNED 等
实 体: ENTITY name is
…
END ENTITY name;
结 构 体: ARCHITECTURE name OF entity_ name is
…
END ARCHITECTURE name
端口模式: IN、OUT、INOUT、BUFFER
数据类型: bit、std_logic、integer、boolean等
实体使用实体说明来描述。实体说明描述的是一个设计的外貌,即描述实体的外部接口情况以及实体内的类属参数等。
ENTITY <实体名> IS
[参数说明部分];
[端口说明部分];
END [ENTITY] <实体名> ;
实体说明以“ENTITY <实体名> IS” 开始,至" END ENTITY <实体名>” 结束。
参数说明主要为设计实体指定参数,如端口宽度、器件延迟时间等;
端口说明描述的是设计实体和外部的接口,具体说就是对端口名称、端口模式和端口数据类型进行说明。
【程序】
ENTITY mux21 IS
PORT( a, b : IN BIT ;
s : IN BIT;
y : OUT BIT) ;
END ENTITY mux21 ;
(1)端口名称:输入输出信号的名称,在实体中必须是唯一的。
(2)端口模式:说明信号的方向,有以下几种模式:
IN 输入信号;
OUT 输出信号;
INOUT 双向信号;
BUFFER 输出信号,但可在内部反馈使用(缓冲);
BUFFER是INOUT的子集,但作输入用时,信号不是由外部驱动,而是从输出反馈得到。
(3)端口数据类型:端口信号的取值类型
明确地指定和严格地定义端口信号的取值类型是VHDL的重要特点, 即所谓的强数据类型,是学习VHDL应特别注意之处.
VHDL中常见的数据类型有以下几种:
BIT 位类型,取值'0','1' ;在VHDL中,逻辑位0或者1的表达必须加单引号,否则VHDL综合器会将其解释成整数数据类型INREGER
BIT_VECTOR 位向量类型,是BIT的组合;
STD_LOGIC 工业标准的逻辑位类型,取值0 '0','1','X','Z'等九种;
STD_LOGIC_VECTOR 工业标准的逻辑位向量类型,是STD_ LOGIC的组合
INTEGER 整数类型,可用作循环的指针或常数;
BOOLEAN 布尔类型,取值FALSE、TRUE.
结构体(Architecture )描述的是实体内部的逻辑功能。 在电路上相当于器件的内部电路结构.
【结构体程序】
ARCHITECTURE one OF mux21 IS
BEGIN
y <= a WHEN s = ‘0' ELSE
b;
END ARCHITECTURE one;
ARCHITECTURE <结构体名> OF <实体名> IS
[结构体说明部分]
BEGIN
<功能描述语句>
END [ARCHITECTURE] <结构体名> ;
(1)OF后的实体名应与实体说明中的实体名一致;
(2)功能描述语句是结构体中的主要部分,用于描述所实现实体的功能
四种不同类型的并行语句:
进程语句
进程语句
子程序调用语句
元件例化语句
(3)结构体说明部分是对结构体的功能描述语句中将要用到的信号、数据类型、常数、元件、函数和过程等加以说明。
VHDL的基本结构由前述的设计实体和结构体组成,但实际中的VHDL程序除上述两个基本部分以外通常还包括另外三个部分:库、程序包和配置
库:主要用来存放已经编译的实体、结构体、程序包等。
程序包:主要用来存放各个设计都能共享的数据类型、子程序、常数和元件等。
VHDL一个库中的设计单元可以用作其他设计的资源;一个设计可以使用多个库中的设计单元。
当一个设计要使用库中的设计单元时:
首先要在每个设计的开头说明要引用的库;
然后指明要使用库中的哪一个设计单元(程序包)。
(1)库说明语句格式: library <库名>;
(2)程序包语句说明格式: use <库名>.<程序包名>.all;
all表示使用该程序包中的所有项目
举例如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY example IS
PORT ( d: IN STD_ LOGIC_VECTOR (15 DOWNTO 0);
clk, reset, oe: IN STD_LOGIC;
q1: OUT STD_LOGIC_VECTEOR (15 DOWNTO 0);
q2: INOUT STD_LOGIC_VECTOR (15 DOWNTO 0);
int: BUFFER STD_LOGIC;
opt: OUT STD_LOGIC );
END example;
配置可以把特定的结构体指定给一个确定的实体
例如当对实体进行仿真时可为同一实体配置不同的结构体以比较其差别。
配置语句的一般格式如下:
CONFIGURATION <配置名> OF <实体名> IS
FOR <选配结构体名>
END FOR;
END [<配置名>];
也即是VHDL自己的文字规则
标识符主要用来为常数、变量、信号、端口、子程序和参数等命名
其规则如下:
有效的字符:包括26个大小写英文字母,数字包括0~9 以及下划线“_”;
任何标识符必须以英文字母开头;
下划线“_”的前后必须有英文字母或数字;
标识符中的英语字母不分大小写。
例: Decoder_1 , FFT, sig_n, Not_ACK 是正确的
而 Decoder_1 , 2FFT, sig#n,return 是错误的。
(1)整数:整数都是十进制的数,
如:5,678,0,156E2(=15600),45_234_287(=45234287)
(2)实数:实数也都是十进制的数,但必须带有小数点,
如:1.335, 88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499)
(3)以数值基数表示的数:
用这种方式表示的数由五部分组成:基 # 整数 # [指数]
第一部分:用十进制数标明数值进位的基数;
第二部分:数值隔离符“#”;
第三部分:表达的数值;
第四部分:指数隔离符“#” ;
第五部分:用十进制数表示的指数部分,若为0可省略不写。
例如:
10#170# ; -- (表示第三部分为十进制数,等于 170)
16#FE#; -- (表示第三部分十六进制数 ,等于 254)
2#1111_1110#; -- (表示第三部分为二进制数,等于 254)
8#376#; -- (表示第三部分为八进制数,等于 254)
16#E#E1 ; -- (表示十六进制数,等于14×16的一次方,等于224)
(1) 字符是用单引号括起来的ASCⅡ码
一般情况下VHDL对字母的大小写不敏感,但对字符的大小写是敏感的,例:‘A’ 和 ‘a’ 是不同的。
(2) 字符串是用双引号括起来的字符序列
在VHDL中字符串常用来作为说明文字出现。
例:“it is time out”, “ ERROR”, “Both S and Q equal to 1”
注意:“a” 和 ‘a’是不同的
位串是用双引号括起来的数字序列,数字序列前面加上一个基数说明符:
B:二进制基数符号;
O:八进制基数符号;
X:十六进制基数符号(0~F);采用位串的优点是为了增加源代码的可读性。
例:B"1_1101_1110" -- 二进制数数组,位矢数组长度是9
O"15" -- 八进制数数组,位矢数组长度是6
X"AD0" -- 十六进制数数组,位矢数组长度是12
B"101_010_101_010" -- 二进制数数组,位矢数组长度是12
"0AD0" -- 表达错误,缺X
注释语句用**“--“** 开始到本行结束的一段文字来进行一段的描述;
注释不是设计功能描述的一部分,所以不会被编译。
VHDL是一种硬件描述语言,硬件电路的工作过程实际上是信号的传输、存储和处理的过程,所以VHDL最基本的描述对象是常量和信号。为了便于描述,还定义了另外一类数据对象:变量。
常量是指在设计实体中不会发生变化的值。
常量定义的一般表述:
CONSTANT 常量名:数据类型:= 表达式 ;
数据类型按住Ctrl然后单击即可跳转
例如: constant a,b : INTEGER := 2;
constant VCC : REAL := 3.3;
注意:
常量一旦被赋值就不能再改变;
常量可以在程序包、实体说明、结构体和进程的说明区域进行说明;
常量所赋的值应与其所定义的数据类型一致,否则出错。
变量主要用于对暂时数据进行存储,它不能将信息带出对它作出定义的当前单元。
变量定义的一般格式:
VARIABLE 变量名:数据类型 := 初始值;
例: VARIABLE a : std_logic;
VARIABLE b, c : integer := 2;
VARIABLE count1,count2,count3 : integer range 0 to 255 := 0;
例中定义a为标准逻辑位变量,b, c为整数型变量,初始值为2等。
变量的赋值
变量可以被连续地进行赋值,变量的赋值采用的符号是 “:=”,格式如下:
变量名 := 表达式;
例: a := “1010101” ; -- 位矢量赋值
b := ‘0’ ; -- 位赋值
x := 100.0 ; -- 实数赋值
注意:
1)赋值语句右边的表达式必须是一个与目标变量具有相同数据类型的数值。
2)变量是一个局部量,只能在进程和子程序中使用。
3)变量的赋值是一种理想化的数据传输,是立即发生的,不存在任何延时的行为。
信号是描述硬件系统的基本数据对象,它是设计实体中并行语句模块间动态交换数据的手段。在物理上信号对应着硬件设计中的一条连接线。
信号定义语句格式:
SIGNAL 信号名: 数据类型 := 初始值 ;
例:SIGNAL clk : std_logic := ‘0’;
SIGNAL a : integer range 0 to 15;
SIGNAL data : std_logic_vector(15 downto 0);
信号的初始值不是必须的,而且仅在VHDL的行为仿真中有效,信号的使用和定义范围是实体、结构体和程序包。
信号赋值格式: 信号名 <= 表达式;
例: x <= 9;
y <= x;
在进程中,可以允许同一信号有多个赋值源,即在同一进程中存在多个同名的信号被赋值,其结果只是最后的赋值语句被启动。
……
SIGNAL a,b,c,y,z: integer ;
……
PROCESS(a,b,c )
BEGIN
y <= a*b; -- 不对y进行赋值。
z <= c-b;
y <= b; -- y的最后赋值。
END PROCESS;
……
变量(VARIABLE)
基本用法:在进程中作为局部数据存储单元使用。
适用范围:只能在所定义的进程中使用。
行为特性:赋值是没有延迟的。
在进程中是立即赋值。
信号(SIGNAL)
基本用法:在电路中作为信号连线使用 。
适用范围:在整个结构体内的任何地方都能适用。
行为特性:赋值具有一定的延迟 。
在进程中,只在进程的最后才对信号赋值。
VHDL的强类型特性主要体现在以下几个方面:
每一对象只能具有一个数据类型且只能具有那个数据类型的值.
对某对象进行操作的类型必须与该对象的类型相匹配。
不同类型之间的数据不能直接带入,即使数据类型相同而位长不同也不能进行带入。
VHDL中的数据类型可分为五大类:
标量类型:是最基本的数据类型,通常用于描述一个单值数据对象。标量类型包括:实数类型、整数类型、枚举类型和时间类型。
复合类型:由细小的数据类型复合而成,如可由标量类型复合而成。复合类型主要有数组型和记录型。
子类型:是上述基本类型的子集,是对已有的数据类型加以限制。
文件类型:不同类型的数据和数据名组织在一起形成新的数据对象。
存取类型:为数据对象提供存取方式。
上述五大类数据类型又可分成在现成程序包中可以随时获得的预定义数据类型和用户自定义数据类型两类。预定义数据类型是VHDL中最常用、最基本的数据类型,这些数据类型都已在VHDL的标准程序包Standard和std_logic_1164及其它的标准程序包中作了定义,可在设计中随时调用。
VHDL的预定义数据类型都是在VHDL标准程序包STANDARD中定义的。
(1)布尔(BOOLEAN)数据类型:属于枚举型,取值为false和true。
(2)位(BIT)数据类型:属于枚举型,取值只能是1和0。
(3)位矢量(BIT_VECTOR)数据类型:是BIT的数组,使用位矢量必须注明位宽。例:signal a: bit_vector(7 downto 0);
(4)字符(CHARACTER)数据类型:字符类型通常用单引号引起来。如:‘a’ 。字符类型区分大小写,这一点和标识符的大小写是不同的。
(5)整数(INTEGER)数据类型:正整数、负整数和零。可以使用预定义的运算操作符,如“+”、“-”等进行算术运算。
在VHDL中,整数的取值范围是-2147483647~+2147483647
仿真时:将其作为有符号数处理。综合时:作为无符号数处理。
自然数(NATURAL)数据类型, 正整数(POSITIVE)数据类型
(6)实数(REAL)数据类型:
类似于数学中的实数,或称为浮点数,通常情况下实数类型仅能用于VHDL的仿真,综合器一般不支持实数。
(7)时间(TIME)数据类型
VHDL中唯一的预定义物理类型是时间。完整的时间类型包括整数和物理量单位两部分,整数和单位之间至少留一个空格。
例:55 ms, 20 ns等。
(1)标准逻辑位(std_logic)数据类型
(2)标准逻辑矢量(std_logic_vector)数据类型
std_logic_vector是std_logic的数组形式。
因为是ieee的预定义数据类型,使用时必须先打开ieee库。
即:
library ieee;
use ieee.std_logic_1164.all;
std_logic是一个9值的逻辑。其取值为:
U:未初始化状态; X: 不定态; 0: 逻辑0; 1: 逻辑1;
Z: 高阻态; W: 弱不定态;L: 弱逻辑0;H: 弱逻辑1;
-: 无关态;
Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了3种数据类型,下面是其中常用的2种:
(1)无符号数据类型(UNSIGNED TYPE)
UNSIGNED数据类型代表一个无符号的数值,以二进制数表示,二进制数的左边为最高位。
(2)有符号数据类型(SIGNED TYPE)
SIGNED数据类型代表一个有符号的数值,综合器将其解释为补码,最高位为符号位。
使用上述数据类型时,应作如下声明:
library ieee;
use ieee.std_logic_arith.all;
用户自定义数据类型是用类型定义语句实现的,格式如下:
(1)TYPE语句用法:
TYPE 数据类型名 IS 数据类型定义 ;
上述格式中的数据类型名由设计者自定;数据类型定义部分用来描述所定义元素的表达方式和表达内容。
例: type week is (sun,mon,tue,wed,thu,fri,sat);
(2)SUBTYPE语句用法:
SUBTYPE是TYPE所定义的数据类型的一个子集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型,SUBTYPE 格式如下:
SUBTYPE 子类型名 IS 基本数据类型 range 约束范围;
上述格式中的子类型名由设计者自定;基本数据类型必须是前面已有过type定义的类型。
例: subtype dig is integer range 0 to 9;
其中,integer是标准程序包中已定义过的数据类型,子类型只是把integer约束到只含10个值的数据类型。
(3)自定义数据类型举例
1.枚举数据类型:
VHDL中的枚举数据类型是一种特殊的数据类型,是用文字符号来表示一组实际的二进制数。例如:
type m_state is (state1, state2, state3, state4, state5 );
signal p_state,n_state : m_state;
枚举数据类型也可以使用数值来定义,如:
type my_logic is ( ‘1’ , ’z’ , ‘u’ , ’0’ );
在综合过程中,枚举类型文字元素的编码通常是自动的,编码顺序是默认的,一般将第一个枚举量(最左边的量)编码为0,以后的依次加1。前例中的默认编码值如下:
state1 =’000’; state3 =’010’; state5 =’100’;
state2 =’001’; state4 =’011’;
2.数组类型:
数组类型属复合类型,是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。数组可以是一维数组或多维数组。
语句格式如下:
TYPE 数组名 IS ARRAY (数组范围) OF 数据类型 ;
例: type stb is array (7 downto 0) of std_logic;该数组有8个元素,其下标排列是7、6、…1、0。
type data_bus is array (0 to 7) of bit;
对数组的赋值有两种方法:一是对整个数组进行一次赋值;二是按照下标对每一个数组元素进行赋值。例:
type data_bus is array (0 to 7) of bit;
signal a:data_bus;
整体赋值: a <= “01000111”;
分别赋值: a(0) <= ‘0’;
a(1) <= ‘1’;
a(2) <= ‘0’;
a(3) <= ‘0’;
a(4) <= ‘0’;
a(5) <= ‘1’;
a(6) <= ‘1’;
a(7) <= ‘1’;
3.记录类型:
将不同数据类型的元素组织在一起,而形成新的对象。语句格式如下:
TYPE 记录类型名 IS RECORD
记录元素名1:数据类型名;
记录元素名2:数据类型名;
……
END RECORD;
下面是记录类型定义的一个例子:
type c_time is record
year :integer range 0 to 3000;
month :integer range 1 to 12;
date :integer range 1 to 31;
enable:bit;
data :std_logic_vector(15 downto 0);
end record;
signal number: c_time;
记录元素的赋值:
对于记录类型的对象的赋值和数组类似,可以对其进行整体赋值,也可分别赋值.
一个记录的每一个元素要由它的记录元素名来进行访问。从记录类型的对象中提取记录元素时应使用==“.”==。
对记录元素整体赋值:
number <= (2014,10,10,‘1’,data_in);
对记录元素分别赋值:
number.year <= 2014;
number.month <= 10;
number.date <= 10;
number.enable <= ‘1’;
number.data <= data_in;
在VHDL语言中,数据类型的定义是相当严格的,不同的数据类型之间不能进行运算和直接代入。
为了实现正确的赋值操作,有时需要将带入的数据进行类型转换。
数据类型转换函数通常由程序包来提供。
下表列出了常用的数据类型转换函数
函 数 名 | 功 能 |
---|---|
●std_logic_1164 程序包 to_std_logic_vector to_bit_vector to_std_logic to_bit | 由bit_vector 转换为std_logic_vector 由std_logic_vector 转换为bit_vector 由bit 转换为std_logic 由std_logic 转换为bit |
●std_logic_arith 程序包 conv_std_logic_vector conv_integer conv_signed conv_unsigned |
由integer、unsigned、signed 转换为 std_logic_vector 由unsigned、signed 转换为integer 由integer、unsigned 转换为 signed 由integer、signed 转换为 unsigned |
●std_logic_unsigned程序包 conv_integer | 由std_logic_vector 转换为integer |
●std_logic_signed 程序包 conv_integer |
由std_logic_vector 转换为integer |
数据类型转换
【程序】
LIBRARY IEEE;
USE IEEE std_logic_1164.ALL;
USE IEEE std_logic_UNSIGNED.ALL;
ENTITY add5 IS
PORT(num:IN std_logic_vector(2 downto 0);
……
);
END add5;
ARCHITECTURE rt1 of add5 is
signal in_num:integer range 0 to 7;
BEGIN
in_num〈= CONV_INEGER(num); --变换式
……
END rtl;
VHDL中共有四类运算符:
逻辑运算符、关系运算符、算术运算符和连接运算符
实验一到实验三的实验报告要求:
实验内容与原理说明(包括框图、逻辑表达式和真值表);
实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench);
仿真波形图;
综合得到的门级电路图;
实验结果分析及思考。
实验软件工具:
QuartusII;
ModelSim SE.
实验报告要求:
实验内容与详细说明(包括框图、逻辑表达式和真值表);
分别用格雷码和one-hot码进行编码,进行综合时,在QuartusII的器件库中选择一款器件,报告中要说明所用器件的型号;综合后要说明设计模块所占用该型器件的资源等;
实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench);
仿真波形图;
综合得到的门级电路图,所用器件的型号以及设计模块所占用该型器件的资源情况;
实验结果分析及思考。
每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。
实验软件工具:
QuartusII;
ModelSim SE.