第一章开发软件ISE与开发流程LUT主要适合SRAM工艺生产,因此FPGA都是基于SRAM工艺的,掉电就会丢失。
设计输入除了常见的文本输入,还可以采用图形输入方式:单击Design Utilities->Creat Schematic Symbol,则会在工程文件夹下生成一个文件,同时这个生成的符号被加入到符号库中。
这样可以添加元件。
用户约束文件UCF的编写:管脚约束:如NET “<Signal Name>” LOC = <Pin Name>; --将信号锁定到fpga的管脚。
时钟约束:如NET “<Net Name>” PERIOD = period {HIGH/LOW}[high or low time]。
采用图形化方法输入约束文件:创建ucf文件,选择ucf文件,然后点击Processes->User Constrains->Create Timing Constraints添加时序约束;点击Processes->User Constrains->I/O Pin Planning添加管脚约束。
设计综合(Synthesize)综合将概念性硬件描述语言HDL的设计定义转换成针对目标器件的逻辑或者物理表示。
XST(Xilinx Synthesis Tools)就是综合工具,其输出为Xilinx特有的NGC网表文件,NGC包含转化后的逻辑数据和约束信息。
综合是设计流程中的基本步骤,它将概念性硬件描述语言的设计定义转换为针对器件的逻辑或物理表示。
在综合过程中,状态机是单独处理、独立分析的,根据综合的选项,综合器选择状态机在综合过程中选用的实现算法。
综合完成后,综合器会根据综合选项和XCF(XST Constraint File, 综合约束文件),对综合结果做一些基础的优化。
HDL文件语法分析检查语法错误HDL综合宏识别、优先状态机展开资源共享技术底层优化宏实现、时序优化映射、复制寄存器NGR文件NGC文件LOG文件功能仿真(Simulation->behavioral)功能仿真可以对工程设计文件进行初步的功能验证。
仿真软件将HDL语言转换为抽象的逻辑电路,忽略信号在逻辑器件和传输线上的延时,并对应各种可能的输入信号仿真得到设计工程的输出信号,检验输出信号是否满足预期的要求。
功能仿真需要创建Test Bench文件。
工程实现(Implementation)工程实现包含以下四个步骤:Translate—将综合后的网表文件NGC和约束文件UCF融合到同一个Xilinx的设计文件PCF中。
Map—将设计中的功能器件映射到工程设计的目标器件资源中。
Place and Route—对映射后的目标器件资源进行布局和布线,满足时序约束。
Generate Programming File—生成可以下载到器件中的比特流文件,对器件进行编程配置。
时序仿真(Simulation->Post Route)对经过布局布线后的仿真模型加入延时文件进行仿真的过程,他将最基本的门级延时计算在内,模拟工程设计在FPGA器件内的实现过程。
经过时序仿真后的设计基本上与实际电路是一致的。
时序仿真的基本参数:时钟周期Period:最小时钟周期是指信号从一个触发器或锁存器的输入端,经过一系列的组合逻辑单元和信号线,到达下一个同步器件,所用的最长时间。
端口到建立时间(Pad to setup time):信号从进入fpga芯片,经过一系列的逻辑元件和连线,到达一个同步器件(触发器、锁存器或存储器)的输入端所用的最长时间。
时钟到端口时间(Clock to pad time):数据信号从触发器或锁存器的输入端口,经过逻辑单元和连线时延,到达fpga芯片的输出管脚的最长时间。
这个时间在约束文件中称为OFFSET OUT AFTER约束。
端口到端口时间(Pad to pad time):数据信号从输入端口进入fpga芯片,经过一系列逻辑元件和连线延时后到达fpga的输出端口的最大时间。
器件配置利用iMPACT工具将比特流文件编程到fpga中。
第二章 VHDL硬件描述语言基础知识fpga电路设计的四个层次:行为层次(Behavioral)、寄存器传输层次(RTL, Register Transfer Level)、逻辑门层次(Logic)和布图层次(Layout)。
行为层次主要关注模块的功能描述和仿真验证,寄存器传输层次要关注模块的可综合电路的实现,逻辑门层次考虑如何用门级电路实现给定功能,布图层次考虑如何将电路适配到fpga的资源中。
2.2VHDL基本结构实体与构造体实体与C++中的类相似。
构造体的行为描述通常采用process进程语句实现。
构造体的数据流描述方式主要使用VHDL语言中的标准布尔函数,将信号之间的布尔代数关系用布尔方程式来表示。
结构体的结构描述主要通过下层模块的声明和调用及端口映射将下层模块相连。
Generic参数声明类似于C++语言中的类属参数声明。
library IEEE;use COUNTER isgeneric( COUNT_WIDTH :INTEGER:=7);port( RST, SET, CLR :in STD_LOGIC;SETVALUE :in STD_LOGIC_VECTOR(COUNT_WIDTH downto0);COUNTOUT :out STD_LOGIC_VECTOR(COUNT_WIDTH downto0) );end COUNTER;库用户自定义库时,先用关键字library说明要引用的库名,然后用use语句打开库中程序包。
在计算机中新建一个文件夹,将文件夹名改为用户自定义“库名”,将编辑的程序包等以文件形式存在该文件下,此时该文件夹即为用户自定义库。
在ise中自定义library时,首先要新建library,然后编写相应的程序包,并将程序包移到(move to library)该library中,然后就可以使用use <库名>之类的语句了。
程序包程序包的作用是收集被多个VHDL实体共享的数据类型、子程序或数据对象,使其适用于更一般的访问和调用范围。
配置一个实体可以声明多个构造体,但形成最终电路时,只能使用一种结构体作为功能实现的描述,这时就需要使用配置将实体与结构体连接起来。
配置不是从属单元,可以独立存在。
通常在使用时都会将配置单独写入一个文件中。
1、默认配置语法如下。
当实体选择的结构体中,不包含BLOCK语句和COMPONENT语句时,可采用默认配置为实体选择不同的结构体和对VHDL程序的性能评估。
2、元件配置。
在层次化设计中,应用库中的元件是设计人员经常采用的一种效率比较高的工作方式。
引用元件的方法有两种:使用元件例化语句;使用元件配置。
元件配置语句的语法结构有两种形式,分别是低层次的配置和实体—结构体对的配置。
低层次的配置语法为:实体—结构体对的配置的语法结构如下:显然,实体—结构体对比低层次的配置要好。
3、结构体配置。
虽然元件配置语句配置实体具有一定的优势,这种方法易写也易懂;但是书写过于臃肿,于是引出了第三种配置语句—结构体配置语句。
结构体配置语句必须放在所要配置的实体中的结构体中。
其语法如下:【举例】采用结构体配置实现全加器y :out std_logic);end component;signal tmp1, tmp2, tmp3 :std_logic;for U1, U2 : add use entity(xor_str);for U3, U4 : add use entity(and_str);for U5 : add use entity(or_str);beginU1 : add port map(A,B,tmp1);U2 : add port map(tmp1,Cin,S);U3 : add port map(tmp1,Cin,tmp2);U4 : add port map(A,B,tmp3);U5 : add port map(tmp2,tmp3,Co);end structure;语法要素对象类型Port、Constant、Signal、Variable变量在综合后可以是一个连线(wire),也可以是一个寄存器(register),综合的结果取决于变量在时序电路中是否用于保存信号值。
变量虽然可以赋初始值,但是在综合时,综合器会忽略掉。
信号在声明结构中被赋予的初始值,与变量相同,在综合时也会被忽略。
信号的赋值可以加入延时,如 A <= B after5 ns;但是,延时语句只在行为建模时起作用,而在综合时也会被完全忽略。
数据类型标量类型1、bit类型是二值系统中的最基本单元,分别表示低电平和高电平。
2、Boolean类型没有数值的含义,也不能进行算术运算,只能作为关系运算的结果,在判断语句中判断使用。
3、 Integer类型的数据在底层电路中用一系列二进制位表示。
使用时要指定range范围,这样综合器才能综合。
4、real类型的数据很多公司的综合工具不支持。
5、物理类型用于表示一些物理量,完整的物理数据类型包含数值和单位两部分。
定义物理类型时必须先给出一个基准单位。
如VHDL只定义了一个物理类型:type TIME is range-47to47unitsfs;ps =1000 fs;ns =1000 ps;us =1000 ns;ms =1000 us;sec =1000 ms;min =60 sec;hr =60 min;end units6、符号类型character通常用单引号括起来,如’Z’。
7、标准逻辑类型STD_LOGIC与bit类型相似,也是表示单个数字信号逻辑的,每个STD_LOGIC都有9种不同的状态。
8、枚举类型enumerate在状态机和复杂系统的描述中尤其有用。
9、错误等级severity_level共有四种状态可用:note、warning、error、failure。
错误等级通常与assert语句配合使用。
复合类型1、位矢量类型BIT_VECTOR是由多个位型数据组合起来的一组数据。
例子如下:signal A_WORD :bit_vector(7downto0);A_WORD <= X"0101_1100";2、标准逻辑矢量型STD_LOGIC_VECTOR是由多个标准逻辑数据组合起来的。
3、字符串类型是由多个字符类型的数据组合起来的。
4、数组array是由多个相同类型的数据组成的集合。
VHDL中有两种定义矩阵的方法,一种称为Constrained,另一种称为Unconstrained,两者之间的不同在于定义数组时索引值的范围不同。