版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章常用EDA软件Lattice:ispEXPERT、LatticeDiamond
Altera:MAX+PLUSII、
QuartusIIXilinx:Foundation、ISE、Vivado本章内容:原理图/VHDL文本编辑综合FPGA/CPLD适配FPGA/CPLD编程下载FPGA/CPLD器件和电路系统时序与功能门级仿真1、功能仿真2、时序仿真逻辑综合器结构综合器1、isp方式下载2、JTAG方式下载3、针对SRAM结构的配置
4、OTP器件编程
功能仿真FPGA/CPLD设计流程3.2QuartusII操作指南
开发过程:
一、建立设计工程
二、源文件输入
三、编译(设计处理)
四、仿真验证
五、器件编程(下载)1.QuartusⅡ软件启动2.创建工程3.选择FPGA器件3.2.1建立设计工程步骤1:软件启动图4-1进入MAX+plusII,建立一个新的设计文件步骤2:创建工程步骤3:选择FPGA器件EP1C12Q240C8Assignments--Device1.建立原理图文件2.输入基本单元符号3.放置输入输出引脚符号4.连线5.为引线和引脚命名6.保存设计文件3.2.2源文件输入
(以原理图文件为例)步骤1:建立原理图文件
步骤2:输入基本单元符号
步骤2:输入基本单元符号
(1)在图形编辑器窗口的工作区中双击鼠标左键,或单击工具栏的符号按钮步骤2:输入基本单元符号
(2)选择所需要的图元或符号步骤3:放置输入输出引脚符号
步骤4:连线
符号之间的连线包括信号线NodeLine和总线BusLine。Quartus Ⅱ软件会自动根据端口是单信号端口还是总线端口画出信号线或总线。连线:将鼠标移动到其中一个端口上,这时鼠标指示符自动变为“+”形状,按住鼠标的左键并拖动鼠标到达第二个端口,放开左键即可。连线拐弯:在需要拐弯处放开鼠标左键,然后再继续按下左键拖动即可。连线删除:单击这根连接线并按Del键即可。步骤5:为引线和引脚命名步骤6:保存设计文件1.编译过程:选择Tools菜单的CompilerTool项3.2.3编译
2.分析综合(Analysis&Synthesis)1.建立波形仿真文件2.功能仿真和时序仿真设置3.启动仿真器3.2.4仿真验证
步骤1:建立波形仿真文件
(1)创建一个新的矢量波形文件步骤1:建立波形仿真文件
(1)创建一个新的矢量波形文件(2)在矢量波形文件中加入输入、输出节点选择View的UtilityWindows下的NodeFinder命令,弹出NodeFinder界面,查找要加入波形文件中的节点名;在Filter列表中选择Pins:all,在Named栏中键入“*”,然后点击List按钮,在NodesFound栏即列出设计中的所有节点名;选择要加入波形文件中的节点,然后按住鼠标左键,拖动到波形编辑器左边Name列的空白处放开。
步骤1:建立波形仿真文件
(3)编辑波形步骤2:功能仿真和时序仿真设置
(1)选择Assignments的Settings…命令,在Settings对话框的Category列表中选择Simulator,显示仿真器页面(2)功能仿真类型选择Functional,选择Processing的GenerateFunctionalSimulationNetlist命令,产生功能仿真网表文件;时序仿真类型选Timing,编译设计产生时序仿真的网表文件。步骤3:启动仿真器
在完成上面的仿真器设置以后,选择Processing的StartSimulation命令即可启动仿真器。同时状态窗口和仿真报告窗口自动打开,并在状态窗口中显示仿真进度以及所用时间。仿真结束后,在仿真报告窗口显示输出节点的仿真波形。1.引脚分配
(1)选择Assignments/AssignmentEditor菜单命令,在分配编辑器的类别(Category)列表中选择Locationspin,或直接选择Assignments的Pins菜单命令。(2)用鼠标左键双击To单元,将弹出包含所有引脚的下拉框,从中选择一个引脚名。(3)用鼠标左键双击Location单元,从下拉框中可以指定目标器件的引脚号。(4)完成所有设计中引脚的指定,关闭AssignmentEditor界面,保存分配。(5)在进行编译之前,检查引脚分配是否合法。选择Processing→Start→StartI/OAssignmentAnalysis菜单命令,当提示I/O分配分析成功时,点击OK按钮关闭提示。3.2.5器件编程
2.编程(1)全局编译选择Processing/StartCompilation,全局编译成功后,可以进行编程下载。(2)打开编程器窗口选择Tool/Programer命令,打开编程器窗口。(3)设置下载形式第一次使用下载时,需要选择下载形式。在编程器窗口,点击HardwareSetup按钮,打开HardwareSetup对话框,然后点击AddHardware,选择USB-Blaster[USB-0]后单击SelectHardware,则把下载形式设置为USB-Blaster[USB-0](4)下载下载可以选择JTAG方式和AS方式。JTAG方式把文件直接下载到FPGA里面,AS方式把文件下载到配置芯片里面。选择AddFile,添加.sof文件,选中Program/Configure,点击Start后开始下载。3.2.5器件编程
将设计项目设置成可调用元件
File---Create/Update---CreatesymbolFilesforCurrentFile设计顶层文件
File---new---blockdiagram/schematicFile;
保存在相同目录;设置成顶层文件:PROJECT/SETASTOP—LEVELENTITY;
分析综合;建立仿真文件,进行仿真。3.2.6层次设计讲解张三3.4Vivado软件操作Vivado为Xilinx公司2012年推出的新一代可编程逻辑器件集成开发工具,支持XilinxZynq系列产品。Vivado包含综合、实现、仿真、调试等工具,同时还支持高层次综合(HLS)功能,使FPGA设计更加高效。Vivado软件已由最初的2012版更新到2022版。本教程将基于Vivado2017.4版本,以设计一个4位二进制加法计数器为例,介绍该软件的基本开发使用流程。3.4.1Vivado简介在Vivado启动界面的菜单栏中选择“File”→“NewProject”命令,或点击“QuickStart”栏下的“CreateProject”新建工程,在新建工程设置界面,输入工程名“cnt_4”,工程名通常为设计程序的实体名,工程存放路径选择为E:/FPGA/vivado_test,如图所示。3.4.2
新建工程单击“Next”按钮,弹出新建工程类型选择界面,默认选择RTLProject;单击“Next”按钮,出现编程语言选择界面,本例将Targetlanguage设置为VHDL,Simulatorlanguage也设置为VHDL,如图所示。3.4.2
新建工程点击“Next”按钮,出现约束文件添加界面,本例暂不添加约束文件,继续点击“Next”按钮,出现目标芯片选择界面,本例选择Zynq-7000系列下的型号为xc7z020clg400-2的FPGA芯片,如图所示。3.4.2
新建工程点击“Next”按钮,出现新建工程概要界面,显示新建工程名、目标芯片等信息,点击“Finish”按钮,完成工程创建,新建工程界面如图所示。3.4.2
新建工程在工程管理区点击PROJECTMANAGER栏下的AddSources图标,弹出新建文件类型选择界面,选择默认的“Addorcreatedesignsources”选项;点击“Next”按钮,在弹出界面中选择“CreateFile”按钮;在文件名设置窗口输入文件名cnt_4,如图所示。3.4.3
新建VHDL源文件点击“OK”按钮,显示源文件添加完成界面,如图所示。3.4.3
新建VHDL源文件点击“Finish”按钮,显示端口定义对话框,如图所示。可以在该对话框中定义端口信号名及端口类型,也可不用定义端口信息,在后面程序设计时输入端口信号名及类型,本例不在该对话框中定义端口,直接单击“OK”按钮,在弹出的对话框中选择“Yes”。3.4.3
新建VHDL源文件在文件管理区显示出新建的源文件“cnt_4.vhd”,如图所示,双击该文件,在界面右边编辑区显示新建源文件模板,定义了库、程序包、实体名、结构体名。3.4.3
新建VHDL源文件在模板中输入程序代码,输入完成后的代码如图所示。程序编辑完成后,点击保存按钮进行保存。3.4.3
新建VHDL源文件在界面左边工程管理区“SYNTHESIS”下点击“RunSynthesis”综合工具对输入的源文件进行综合,若输入程序没有语法错误,则综合通过,弹出综合完成对话框,如图所示。若输入程序有语法错误,则综合不通过,需根据错误提示信息对程序进行修改,修改后再次综合,直至程序综合完成,确保程序无语法错误。在综合完成对话框中,点击Cancel按钮,暂不执行Implementation实现操作。3.4.3
新建VHDL源文件程序综合正确表明无语法错误,程序逻辑功能是否正确不能确定,需要通过波形仿真来测试。下面对上述程序描述的4位二进制加法计数器进行波形仿真,验证其逻辑功能是否正确。本例将使用VHDL硬件描述语言编写波形测试激励文件,设置输入信号的波形。3.4.4
波形仿真在工程管理区点击PROJECTMANAGER栏下的AddSources图标,弹出新建文件类型选择界面,选择“Addorcreatesimulationsources”选项;点击“Next”按钮,在弹出界面中选择“CreateFile”;在文件名设置窗口输入文件名cnt_4_tb,如图所示。3.4.4
波形仿真——创建波形文件点击“OK”按钮,在显示的源文件添加界面点击“Finish”按钮;端口定义对话框可定义端口信号名及端口类型,也可暂不定义端口信息,在后面程序设计时输入端口信号名及类型,本例不在该对话框中定义端口,直接单击“OK”按钮,在弹出的对话框中选择“Yes”,则完成波形激励文件的创建,如图所示。3.4.4
波形仿真——创建波形文件点击“OK”按钮,在显示的源文件添加界面点击“Finish”按钮;端口定义对话框可定义端口信号名及端口类型,也可暂不定义端口信息,在后面程序设计时输入端口信号名及类型,本例不在该对话框中定义端口,直接单击“OK”按钮,在弹出的对话框中选择“Yes”,则完成波形激励文件的创建,如图所示。3.4.4
波形仿真——编辑波形文件在文件管理区“SimulationSources”的“sim_1”下显示新建波形激励文件cnt_4_tb.vhd,双击该文件,在界面右边编辑区显示新建文件模板,在模板中输入程序代码,输入完成后的波形激励文件代码如图所示。程序编辑完成后,点击保存按钮进行保存。3.4.4
波形仿真——创建波形文件在工程管理区右键点击“SIMULATION”,在显示列表中选择SimulationSettings选项;在仿真参数设置界面,点击“Simulation”图标,在xsim.simulate.runtime栏设置仿真时间,本例仿真时间设置为1000ns,如图所示,设置完成后点击OK按钮。3.4.4
波形仿真——波形仿真参数设置在工程管理区点击“SIMULATION”下的“RunSimulation”图标,在显示列表中选择RunBehavioralSimulation选项,波形仿真结果如图所示。3.4.4
波形仿真由仿真波形图可以看出,在复位信号有效时间内,计数器cnt值为0,复位无效后,在每个时钟信号的上升沿触发下,计数器cnt加1,实现了程序设计的四位二进制加法计数器功能。在工程管理区点击“RTLANALYSIS”下的“OpenElaboratedDesign”图标,在弹出的窗口中点击“OK”按钮,显示RTL综合原理图,如图所示。3.4.5
管脚定义在菜单栏选择“Window”→“I/OPorts”命令;在弹出的管脚定义界面设置输入输出信号连接的FPGA芯片管脚,如图所示。3.4.5
管脚定义管脚定义完成后,点击保存按钮,弹出约束文件设置对话框,输入文件名cnt_4,文件类型默认“XDC”格式,点击“OK”按钮,则在文件管理区Constraints栏下显示新建的约束文件cnt_4.xdc。双击打开cnt_4.xdc约束文件,在文本编辑区显示文件内容,如图所示,根据约束文件管脚定义格式,也可通过新建约束源文件,输入管脚约束代码,实现管脚定义功能。3.4.5
管脚定义下载配置过程包括生成比特流文件,启动编程工具将生成的比特流文件下载到FPGA内部,或将生成的比特流文件转换成EEPROM文件,并下载到FPGA的配置存储芯片中。下面介绍JTAG下载模式下将比特流文件直接下载到FPGA内部的流程。3.4.6
下载配置在工程管理区点击“PROGRAMANDDEBUG”下的“GenerateBitstream”图标,在弹出的窗口中点击“OK”按钮,执行结束后将在工程目录下生成cnt_4.bit下载文件,如图所示。3.4.6
下载配置——生成下载文件在工程管理区点击“PROGRAMANDDEBUG”下的“OpenHardwareManager”图标,弹出下载管理界面,如图所示。使用下载电缆连接开发板与计算机,开发板上电,点击下载管理界面中的“AutoConnect”图标自动连接FPGA设备,右键点击扫描到的FPGA芯片xc7z020,选择ProgramDevice,将下载文件cnt_4.bit下载到FPGA芯片内部。3.4.6
下载配置——下载第4章VHDL语言基础常见的HDL有ABEL、AHDL、VHDL、VerilogHDL和SystemC等。HDLIEEE工业标准硬件描述语言VHDL、Verilog超高速集成电路硬件描述语言VHDL,美国国防部研究计划硬件描述语言HDL第4章VHDL语言基础覆盖面广,描述能力强,多层次硬件描述语言VHDL有良好的可读性,既是程序又是文件VHDL的移植性很强VHDL生命周期长,硬件描述与器件工艺无关代码量大,书写烦琐VHDL第4章VHDL语言基础基本组成语言要素本章内容:4.1基本结构参数部分实体部分结构体例:2选1多路选择器的VHDL描述4.1基本结构sy0a1b2选1多路选择器的VHDL描述4.1基本结构2选1多路选择器的VHDL描述方法一:
ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd<=aAND(NOTS);e<=bANDs;y<=dORe;ENDARCHITECTUREone;4.1基本结构实体结构体2选1多路选择器的VHDL描述方法二:ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;4.1基本结构sy0a1b【例4-1】
LIBRARYieee;--库程序包调用
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
4.1基本结构ENTITYcntm16IS--实体cntm16
GENERIC(cntwidth:integer:=4);
PORT
(ci:INstd_logic;
nreset:INstd_logic;
clk:INstd_logic;
co:OUTstd_logic;
qcnt:BUFFERstd_logic_vector(cntwidth-1DOWNTO0)
);
ENDcntm16;
4.1基本结构ARCHITECTUREbehaveOFcntm16IS--结构体
BEGIN
co<=’1’WHEN(qcnt=”1111”ANDci=’1’)ELSE‘0’;
PROCESS(clk,nreset)
BEGIN
IF(nreset=’0’)THEN
qcnt<=”0000”
ELSIF(clk’eventANDclk=’1’)THEN
IF(ci=’1’)THEN
qcnt<=qcnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
4.1基本结构模块结构
参数部分:库(LIBRARY)、程序包(USE);
实体(ENTITY):[类属]、端口(PORT);
结构体(ARCHITECTURE):赋值、进程(PROCESS-IF)。
4.1基本结构4.1基本结构调用程序包语句实体及实体声明语句结构体1结构体2结构体n标准程序包标准程序包定义程序包定义程序包进程1进程2进程nVHDL程序设计约定
语句结构描述中方括号“[]”内的内容为可选内容。程序文字的大小写是不加区分的。程序中的注释使用双横线“--”。建议书写使用层次缩进格式。建议各个源程序文件的命名均与其实体名一致。4.1基本结构库说明
存放已经编译的实体、结构体、程序包和配置,用于设计共享,是编程资源。
library<库名>;
4.1.1参数部分程序包引用使用USE子句指明要使用库中某一个设计单元。
use<库名>.<程序包名>.all;【例4-2】LIBRARYieee;
USEieee.std_logic_1164.ALL;实体(ENTITY)
实体是一个设计实体的表层设计单元,其功能是对这个设计实体与外部电路进行接口描述。它规定了设计单元的输入/输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。类似于原理图中的一个部件符号。4.1.2实体部分实体格式ENTITY实体名IS[GENERIC(常数名:数据类型[:设定值])];--类属表
PORT--端口表(端口名:方向(端口模式)端口类型;
:;
端口名:方向(端口模式)端口类型
);END实体名;ENTITY实体名IS
4.1.2实体部分GENERIC类属参数
定义端口界面常数(端口宽度、器件延迟时间)。类属参量的值可由设计实体的外部提供。书写格式:GENERIC([常数名:数据类型[:设定值]{;常数名:数据类型[:=设定值]});例4-1
GENERIC(cntwidth:integer:=4);
4.1.2实体部分PORT端口
用于定义模块所有的输入/输出信号,相当于定义一个模块符号需要定义端口信号名、端口模式、端口数据类型例4-1
4.1.2实体部分CICONRESETQCNT[3..0]CLKCNTM16端口模式端口模式说明(以设计实体为主体)IN输入,只读模式,将变量或信号信息通过该端口读入OUT输出,单向赋值模式,将信号通过该端口输出BUFFER具有读功能的输出模式,可以读或写,只能有一个驱动源INOUT双向,可以通过该端口读入或写出信息PORT端口模式端口数据类型VHDL数据类型:预定义数据类型、自定义数据类型只能使用已经定义的数据类型例4-1中数据类型Std_logic和Std_logic_vector,在ieee.std_logic_1164.all程序包中说明,使用时首先打开。实体实例【例4-3】4位全加器的实体描述。Libraryieee;Useieee.std_logic_1164.all;Entityadd4isPort(a,b:instd_logic_vector(3downto0);Ci:instd_logic;Sum:outstd_logic_vector(3downto0);Co:outstd_logic);Endadd4;结构体(ARCHITECTURE)
结构体主要用来描述实体的内部结构,即描述一个实体的功能。描述方式行为描述方式、数据流描述方式、结构描述方式、混合描述方式4.1.3结构体部分结构体格式ARCHITECTURE结构体名OF实体名IS[结构体说明部分];BEGIN
结构体描述部分;END结构体名;4.1.3结构体部分结构体组成4.1.3结构体部分行为描述
描述该设计单元的功能,主要使用函数、过程和进程语句,以算法形式描述数据的变换和传送
结构体描述风格例4-4Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityeqcomp4isPort(a,b:instd_logic_vector(3downto0);equals:outstd_logic);Endeqcomp4;Architecturebehavioralofeqcomp4isBeginComp:process(a,b)BeginIfa=bthenEquals<=’1’;ElseEquals<=’0’;Endif;Endprocesscomp;Endbehavioral;
行为描述结构描述
描述该设计单元的硬件结构,调用库中的元件或是设计模块,主要使用元件说明语句及元件例化语句
结构体描述风格例4-5U0xnor2x(0)a(0)b(0)U1xnor2x(1)a(1)b(1)U2xnor2x(2)a(2)b(2)U3xnor2x(3)a(3)b(3)U4and4equalsabcdyArchitecturestructofeqcomp4isComponentxnor2--元件说明
Port(a,b:instd_logic;X:outstd_logic);Endcomponent;Componentand4--Port(a,b,c,d:instd_logic;y:outstd_logic);Endcomponent;Signalx:std_logic_vector(0to3);
结构描述BeginU0:xnor2portmap(a(0),b(0),x(0));--元件例化
U1:xnor2portmap(a(1),b(1),x(1));U2:xnor2portmap(a(2),b(2),x(2));U3:xnor2portmap(a(3),b(3),x(3));U4:and4portmap(x(0),x(1),x(2),x(3),equals);Endstruct;
结构描述数据流描述从信号到信号的数据流的路径形式进行描述。使用并行的信号赋值语句,既显式表示了该设计单元的行为,也隐式表示了该设计单元的结构。
结构体描述风格例4-6Architecturedataflowofeqcomp4isBeginEquals<=’1’when(a=b)else‘0’;并行信号赋值语句Enddataflow;
一个实体可有多种方案的结构体,但仿真和综合时要用configuration配置语句选择一个结构体映射到硬件电路,即为实体选择、指定或者激活一个结构体。
结构体配置4.1.3结构体部分4.1.4语法小结数据类型信号赋值属性库和程序包实体结构体端口定义端口模式逻辑操作符IF语句变量对象进程语句顺序语句并行语句说明部分元件说明元件例化信号对象类属定义CASE语句条件操作符配置条件信号赋值数字文字规则运算符运算符重载类型定义4.2VHDL语言要素文字规则数据对象数据类型运算符属性4.2.1文字规则标示符数值字符串下标4.2.1文字规则标示符1、标识符由字母、数字及下划线组成;
2、以字母开头;
3、下划线不能放在结尾;
4、下划线不能连用;
5、不能使用保留字;
6、VHDL不区分大小写。4.2.1文字规则数值表示(1)整数表示
整数表示十进制数值,如:
11,123,135E2(=13500),12_345_678(=12345678)
(2)实数表示
实数也表示十进制数值,必须带有小数点,如:
1.252.01.56E-3(0.00156)1_120.123_678(11120.123678)数值表示(3)数制基数表示
有5部分组成:十进制数表示数值的基数;隔离符号“#”;该基数下对应的数值;隔离符号“#”;十进制表示的指数部分。
2#1110#--二进制表示数值14
8#120#--八进制表示数值80
16#A0#--十六进制表示数值160
10#12#E2--十进制表示数值1200
16#D#E1--十六进制表示数值2084.2.1文字规则字符串
字符、字符串:单引号引起来的ASCII字符(数值、符号或字母);双引号中的一维的字符数组。
如:‘R’,‘a’,‘*’,‘Z’,‘-’
,‘0’;“ERROR”,“NOTE”
两种类型字符串:文字字符串和数位字符串(位矢量,是BIT数据类型的一维数组)。B“1_0101_1010”--二进制数数组,长度是9O“17”--八进制数数组,长度为6X“A2E0”--十六进制数数组,位矢数组长度是164.2.1文字规则下标名及下标段名1、用于指示数组型变量或信号的某一元素或某一段元素
2、语句格式分别为:
名(表达式);
名(表达式1to/downto表达式2);
3、signala,b:bit_vector(7downto0);
signalc,d:bit;
a<=“01000111”;--给a(7)到a(0)赋值为“01000111”
c<=a(6);--把a(6)值’1’
赋值给c
b(7downto4)<=a(3downto0);--a的低4位赋给b的高4位
b(0to3)<=a(4to7);--a的高4位赋给b的低4位
d<=a(0);--把a(0)值’1’
赋值给d
4.2.2数据对象数据对象类似于一种容器,接受不同数据类型的赋值
常量变量信号对象种类:
信号signal、变量variable、常量constant、文件file。
常量:不对应电路中的物理量,但可以说明全局量。在结构体、实体、程序包、进程、函数、过程中均可使用。
变量:程序运算的中间量,并不对应电路中的物理量。变量说明局部量,用于进程、函数、过程。
信号:电路中的物理量,对应于电路的连线和节点。信号说明全局量,用于描述结构体、实体、程序包。
4.2.2数据对象对象特点:
1、信号和变量可以被连续地赋值;
2、常量只能被赋值一次;
3、信号和变量的赋值形式和执行过程不同:变量是立即赋值(:=),没有延迟,而信号赋值要有一定的延迟(<=)。4.2.2数据对象对象说明的格式
对象种类对象名:数据类型[:=表达式];
1、对象种类:Constant(常数)、Signal(信号)、Variable(变量)、File(文件)
2、表达式用于设定初始值,是可选项。
4.2.2数据对象【例4-8】常量说明实例:CONSTANTDBUS﹕BIT_VECTOR:=“01011010”;定义BIT_VECTOR位矢量型常量DBUS,取值“01011010”。CONSTANTVCC﹕REAL:=5.0;定义REAL实数型常量VCC,取值5.0。CONSTANTDELY﹕TIME:=25ns;定义TIME时间型常量DELY,取值25ns。4.2.2数据对象【例4-9】变量说明实例:VARIABLEx,y:INTEGER;定义变量x和y,整数类型。VARIABLEcount:INTEGERRANGE0TO255:=10;定义变量count,整数类型,取值在0-255,初始值为10。4.2.2数据对象【例4-10】信号说明实例:SIGNALsys_clk:BIT:=’0’;
SIGNALdata_bus:Std_Logic_Vector(7Downto0):=(others=>’1’);
4.2.2数据对象【例4-12】
libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;
entitybcdadderisport(op1,op2:inintegerrange0to9;result:outintegerrange0to31);endbcdadder;4.2.2数据对象architecturebehaveofbcdadderisconstantajustnum:integer:=6;signalbinadd:integerrange0to18;beginbinadd<=op1+op2;process(binadd)variabletmp:integer:=0beginifbinadd>9thentmp:=adjustnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;endbehave;4.2.2数据对象4.2.3数据类型VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且只有数据类型相同的量才能互相传递和作用。VHDL中的数据类型:标量(整数、浮点、枚举、物理)、复合(数组、记录)、文件、存取
。VHDL中的数据类型引用方式有:预定义、自定义
和类型转换等。标准数据类型(可直接引用)在VHDL标准程序包STANDARD中定义的,在实际使用中,已自动包含进VHDL的源文件中,因而不必通过USE语句以显式调用。
4.2.3数据类型标准数据类型(1)整数(INTEGER)
整数类型的数代表正整数、负整数和零。整数在硬件电路中是用二进制表示的,但其不能被看作位矢量(枚举型),不能使用逻辑操作符。整数常量的书写方式示例如下:2--十进制整数10E4--十进制整数16#D2#--十六进制整数2#11011010#--二进制整数标准数据类型(2)实数
VHDL的实数类型类似于数学上的实数,或称浮点数,取值范围为-1.0E38~+1.0E38。书写时一定要有小数。仅能在VHDL仿真器中使用,VHDL综合器不支持实数,因为实数类型的实现相当复杂,目前在电路规模上难以承受。实数常量的书写方式举例如下:65971.333333 --十进制浮点数8#43.6#E+4--八进制浮点数43.6E-4 --十进制浮点数(3)位(BIT)
位数据类型也属于枚举型,取值‘1’或‘0’。可以进行逻辑运算,运算结果仍是位数据类型。VHDL综合器用一个二进制位表示BIT。在程序包STANDARD中定义的源代码是:TYPEBITIS(‘0’,‘1’);例:signala,b,c:bit;c<=aandb;
标准数据类型(4)位矢量(BIT_VECTOR)
位矢量是基于BIT数据类型的数组。在程序包STANDARD中定义的源代码是:TYPEBIT_VECTORISARRAY(NATURALRANGE<>)OFBIT;位矢量是用双引号括起来的一组位数据。Signala:bit_vector(7downto0):=”11001010”;
标准数据类型(5)布尔(BOOLEAN)
布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。可以进行关系运算和逻辑运算,不能用于算术运算。IFa=b
标准数据类型(6)
字符(CHARACTER)
字符类型通常用单引号引起来,如‘A’。字符类型区分大小写,如‘B’不同于‘b’。(7)字符串(STRING)
非约束型字符数组,或称为字符串数组。字符串必须用双引号标明。
VARIABLESTRING_VAR﹕STRING(1TO7);
…STRING_VAR:=“ABCD”;标准数据类型
标准数据类型(8)时间(TIME)VHDL中唯一预定义物理类型,由整数和物理量单位两部分组成,之间至少留一个空格,如55ms。STANDARD程序包中时间型定义如下:TYPETIMEISRANGE-2147483647TO2147483647unitsfs; --飞秒,VHDL中的最小时间单位
ps=1000fs; --皮秒
ns=1000ps; --纳秒
us=1000ns; --微秒
ms=1000us;--毫秒
sec=1000ms;--秒
min=60sec; --分
hr=60min; --时enduntis;标准数据类型(9)错误等级(SEVERITY_LEVEL)
在VHDL仿真器中,错误等级用来指示设计系统的工作状态,共有四种可能的状态值:NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)。其定义如下:
TYPESEVERITY_LEVEIS(NOTE,WARNING,ERROR,FAILURE);
(10)自然数(NATURAL)和正整数(POSITIVE)
整数的子类型,即非负的整数、正整数它们在STANDARD程序包中定义的源代码如下:
SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;
SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;标准数据类型
IEEE预定义标准逻辑类型
在IEEE库的程序包STD_LOGIC_1164中,定义了两个非常重要的数据类型,即标准逻辑位STD_LOGIC
和标准逻辑矢量STD_LOGIC_VECTOR。使用时用USE语句显式调用。(1)标准逻辑位STD_LOGIC
STD_LOGIC数据类型的定义如下所示:TYPESTD_LOGICIS('U','X',‘0’,'1','Z','W','L','H','-');各值的含义是:'U'--未初始化的,'X'--强未知的,‘0’--强0,'1'--强1,'Z'--高阻态,'W'--弱未知的,'L'--弱0,'H'--弱1,'-'--忽略。IEEE预定义标准逻辑类型(2)标准逻辑矢量(STD_LOGIC_VECTOR)STD_LOGIC_VECTOR类型定义如下:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;例如:Signala:std_logic_vector(7downto0);a<=”11001010”;IEEE预定义标准逻辑类型其它预定义数据类型VHDL综合工具配带的扩展程序包中,定义了一些有用的类型。如Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH中定义了如下的数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)和小整型(SMALL_INT)。NUMERIC_STD程序包和NUMERIC_BIT程序包中也分别定义了针对STD_LOGIC型和BIT型的UNSIGNED、SIGNED数据类型。使用这些数据类型时,必须首先打开相应的程序包。(1)无符号数据类型(UNSIGNEDTYPE)UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是其最高位。【例4-13】UNSIGNED型举例:VARIABLEvar:UNSIGNED(0TO9);定义变量var为10位二进制数,最高位是var(0)。SIGNALsig:UNSIGNED(3TO0);定义信号sig为4位二进制数,最高位为sig(3)。其它预定义数据类型(2)有符号数据类型(SIGNEDTYPE)SIGNED数据类型表示一个有符号的数值,补码表示,例如:SIGNED(“0101”)代表+5;SIGNED(“1011”)代表-5。【例4-14】SIGNED型举例:VARIABLEvar:SIGNED(0TO9);定义变量var为10位二进制数,最高位var(0)是符号位。SIGNALsig:SIGNED(3TO0);定义信号sig为4位二进制数,最高位sig(3)是符号位。其它预定义数据类型用户自定义数据类型包括自定义的新类和子类即有约束范围的类;可以自定义的数据类型有:整数、实数、枚举、物理、数组、记录等。一般格式为:TYPE数据类型名{,数据类型名}IS数据类型定义;用户自定义数据类型枚举类型
VHDL中的枚举数据类型是用文字符号来表示一组实际的二进制数的类型(若直接用数值来定义,则必须使用单引号)。用户自定义数据类型定义格式:TYPE数据类型名IS(元素1、元素2、…);编码:枚举类型的文字元素在综合时会自动编码,其编码顺序默认最左边元素为0,向右依次加1,即在枚举列表中,最左边值最小,最右边值最大,可以使用比较运算。例:
TYPEweekIS(Sun,Mon,Tue,wed,Thu,Fri,Sat);
Signaltoday:week;
result<=‘1’whentoday>=Frielse‘0’;
枚举类型
应用
TYPEM_STATEIS(STATE1,STATE2,STATE3,STATE4,STATE5);
SIGNALCURRENT_STATE,NEXT_STATE:M_STATE;信号CURRENT_STATE和NEXT_STATE的数据类型定义为M_STATE,它们的取值范围是可枚举的,即从STATE1~STATE5共五种,而这些状态代表五组唯一的二进制数值。枚举类型
在综合中,整数和实数非枚举型数据类型的取值定义范围太大,综合器无法进行综合。需要定义其约束范围,综合时将负数编码为二进制补码,正数编码为二进制原码。整数和实数子类型
定义格式:TYPE数据类型名IS数据类型定义约束范围;SUBTYPE子类型名基本类型RANGE约束范围;【例4-17】TYPEcurrentISREALRANGE-1E4TO1E4;TYPEdigit1ISINTEGERRANGE0TO9;SUBTYPEdigit2INTEGERRANGE-9TO9;综合时digit1为4位二进制原码;digit2为5位二进制补码。整数和实数子类型
VHDL支持两种复合类数据类型:数组和记录。数组是相同类型元素的组合,记录则是不同类型元素的组合。综合器只支持一维数组或者线性记录。数组的元素可以是任何一种数据类型,用以定义数组元素的下标范围子句决定了数组中元素的个数以及元素的排序方向,即下标数是由低到高,或是由高到低。定义格式:TYPE数据类型名IS
ARRAY
范围
OF原数据类型名;数组类型
数组定义示例【例4-18】TYPEwordISARRAY(1TO8)OFSTD_LOGIC;TYPEwordISARRAY(INTEGER1TO8)OFSTD_LOGIC;TYPEinstructionIS(ADD,SUB,INC,SRL,SRF,LDA,LDB);SUBTYPEdigitISINTEGER0TO9;TYPEindflagISARRAY(instructionADDTOSRF)OFdigit;数组类型
数组赋值与引用:以单个元素、段元素或数组整体为单位。【例4-19】typebyteisarray(7downto0)ofbit;signala,b:byte;signalc:bit;signald:bit_vector(0to3);赋值:a<=“01000111”;等效于:a(7)<=‘0’;a(6)<=‘1’;……a(0)<=‘1’;引用:b<=a;c<=a(0);d<=a(7downto4);数组类型
线性记录是指记录中的元素是标量,即不能含有复合型元素。定义格式:TYPE数组类型名ISRECORD
元素名:数据类型名;
元素名:数据类型名;
::ENDRECORD;记录类型
记录赋值:可以整体或指定单元素“记录性对象.元素名”进行个别赋值。【例4-20】利用记录类型定义的一个微处理器命令信息表。TYPEREGNAMEIS(AX,BX,CX,DX);TYPEOPERATIONISRECORDOPSTR﹕STRING(1TO10);OPCODE﹕BIT_VECTOR(3DOWNTO0);OP1,OP2,RES:REGNAME;ENDRECORDOPERATION;记录类型
VARIABLEINSTR1,INSTR2:OPERATION;…INSTR1:=("ADDAX,BX","0001",AX,BX,AX);INSTR2:=("ADDAX,BX",“0010",OTHERS=>BX);VARIABLEINSTR3﹕OPERATION;…INSTR3.OPSTR:="MULAX,BX";INSTR3.OP1:=AX;记录类型
VHDL是强类型语言,不同数据类型的对象,不能直接运算和代入。一般用类型转换函数实现转换。数据类型的变换函数通常由“STD_LOGIC_1164”、“STD_LOGIC_ARITH”、“STD_LOGIC_UNSIGNED”、“STD_LOGIC_OPS”等程序包提供。
数据类型转换数据类型转换表4-1常用类型转换函数函数名定义程序包功能TO_STDLOGICVECTOR(A)STD_LOGIC_1164BIT_VECTOR转STD_LOGIC_VECTORTO_BITVECTOR(A)STD_LOGIC_1164STD_LOGIC_VECTOR转BIT_VECTORTO_STDLOGIC(A)STD_LOGIC_1164BIT转STD_LOGICTO_BIT(A)STD_LOGIC_1164STD_LOGIC转BITCONV_STD_LOGIC_VECTOR(a,位长)STD_LOGIC_ARITHINTEGER,UNSIGNED,SIGNED转STD_LOGIC_VECTORCONV_INTEGER(a)STD_LOGIC_ARITHUNSIGNED,SIGNED转INTEGERCONV_INTEGER(a)STD_LOGIC_UNSIGNEDSTD_LOGIC_VECTOR转INTEGERTO_VECTOR(a,位长)DATAIO库STD_LOGIC_OPSINTEGER转STD_LOGIC_VECTORTO_INTEGER(a)STD_LOGIC_VECTOR转INTEGER【例4-21】类型转换函数LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYCNT4ISPORT(CLK﹕INSTD_LOGIC;
P﹕BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYCNT4;数据类型转换LIBRARYDATAIO;USEDATAIO.STD_LOGIC_OPS.ALLARCHITECTUREARTOFCNT4ISBEGINPROCESS(CLK)ISBEGINIFCLK=‘1’ANDCLK'EVENTTHENP<=TO_VECTOR(TO_INTEGER(P)+1,4);
ENDIF;
ENDPROCESS;ENDARCHITECTUREART;数据类型转换
此例中利用了DATAIO库中的程序包STD_LOGIC_OPS中的两个数据类型转换函数:TO_VECTOR和TO_INTEGER(前者将INTEGER转换成STD_LOGIC_VECTOR,后者将STD_LOGIC_VECTOR转换成INTEGER)。数据类型转换【例4-1】
LIBRARYieee;--库程序包调用
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
4.1基本结构ENTITYcntm16IS--实体cntm16
GENERIC(cntwidth:integer:=4);
PORT
(ci:INstd_logic;
nreset:INstd_logic;
clk:INstd_logic;
co:OUTstd_logic;
qcnt:BUFFERstd_logic_vector(cntwidth-1DOWNTO0)
);
ENDcntm16;
4.1基本结构ARCHITECTUREbehaveOFcntm16IS--结构体
BEGIN
co<=’1’WHEN(qcnt=”1111”ANDci=’1’)ELSE‘0’;
PROCESS(clk,nreset)
BEGIN
IF(nreset=’0’)THEN
qcnt<=”0000”
ELSIF(clk’eventANDclk=’1’)THEN
IF(ci=’1’)THEN
qcnt<=qcnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
4.1基本结构VHDL的各种表达式由操作数和操作符组成,其中,操作数是各种运算的对象,而操作符则规定运算的方式。在VHDL中,一般有四类操作符,即逻辑操作符(LogicaOperator)、关系操作符(RelationaOperator)、算术操作符(ArithmeticOperator)和符号操作符(SignOperator),
4.2.4运算符逻辑运算符
种类
AND(与逻辑)、OR(或逻辑)、NAND(与非逻辑)、NOR(或非逻辑)、XOR(异或逻辑)、XNOR(同或逻辑)、NOT(非逻辑)。优先级
NOT的优先级高于其他6个,其他6个优先级别相同。适用类型
Std_Logic、Bit、Boolean;std_logic_vector、bit_vector逻辑运算符
注意:一个表达式中有两个以上的运算符时,要用括号将其分组。如果运算符是AND、OR、XOR中的某一种运算符的组合,则不需要加括号。【例4-22】SIGNALa,b,c:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALh,I,j,k:STD_LOGIC;SIGNALl,m,n,o,p:BOOLEAN;逻辑运算符
...a<=bANDc;d<=eORfORg;--两个操作符OR相同,不需括号
h<=(iNANDj)NANDk;l<=(mXORn)AND(oXORp);h<=iANDjANDk;
h<=iANDjORk;
a<=bANDe;
h<=iORl;
...算术运算符
求和类求积类混合类移位类求和类
求和类算术运算符包括:+(加)、-(减)、&(并置)。加、减运算的操作数是整数型,其他类型的数据加减时,则需要对运算符进行重载。并置运算用于将多个对象或矢量连接成维数更大的矢量。连接时可采用位置关联或序号关联。求和类
并置运算连接方式:
【例4-23】signala,b,c,d:std_logic;signalq:std_logic_vector;q<=a&b&c&d;q<=(a,b,c,d);q<=(3=>a,0=>d,2=>b,1=>c);OTHERS使用
Q<=A&A&C&D;Q<=(1=>C,0=>D,OTHERS=>A);求积类
求积类算术运算符包括:*(乘)、/(除)、MOD(取模)、REM(取余)。VHDL规定,乘与除的数据类型是整数和实数,而取模和取余的操作数及运算结果都是整数。求积类运算符只能有条件地被综合,比如QuartusII规定乘、除右边的操作数必须是2的幂,不支持MOD和REM运算。混合类
混合类算术运算符包括:**(乘方)、ABS(取绝对值)。VHDL规定,混合运算的操作数一般为整数类型。而综合器对乘方运算也有一定的限制。移位类
移位运算符包括:SLL(逻辑左移)、SRL(逻辑右移);(补0)SLA(算术左移)、SRA(算术右移);(不变)ROL(逻辑循环左移)、ROR(逻辑循环右移)。适用类型:
BIT或BOOLEAN数组;重载使其也支持STD_LOGIC_VECTOR和INTEGER。移位类
语句格式标识符移位操作符移位位数;移位操作符左边是支持的类型,右边必须是整数。举例:
关系运算符
关系运算符包括:
=(等于)、/=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。比较结果:对相同数据类型的数据进行数值比较,为BOOLEAN型常数TRUE或FALSE。关系运算符
应用:【例4-25】Signala:std_logic_vector(3downto0):=”1010”;Signalb:std_logic_vector(3downto0):=”1011”;Signalc:std_logic_vector(3downto0):=”1010;Signald:Boolean;Signale:Boolean;d<=(a=b);--由于a和b不等,所以d的值为falsee<=(a=c);--由于a和c相等,所以e的值为TRUE符号运算符
符号操作符+(正号)和-(负号)的操作数只有一个,操作数的数据类型是整数。“+”符号对操作数不作任何改变,“—”符号用于返回操作数的反码,使用时加括号,如:x:=y*(-z)运算顺序
重载:
VHDL规定了每种运算符的适用数据类型,要想扩大其适用范围,必须对原有的基本操作符重新定义,赋予新的含义和功能,从而建立一种新的操作符,这就是重载操作符,定义这种操作符的函数称为重载函数。运算符重载
重载函数
STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包中为许多类型的运算重载了算术运算符和关系运算符;使用:
因此只要引用这些程序包,SINGEND、UNSIGEND、STD_LOGIC和INTEGER之间;INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之间可以混合运算。运算符重载
【例4-26】libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycnt10is port(rst:instd_logic; clk:instd_logic; cnt:bufferstd_logic_vector(3downto0) );endcnt10;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湘师大版道德与法治九年级下册3.1《多民族的大家庭》听课评课记录
- 教科版道德与法治八年级上册6.2《公民的责任》听课评课记录
- 鲁教版数学六年级上册2.1《0科学计数法》听评课记录
- 岳麓版历史七年级上册第18课《汉代的科技与文化》听课评课记录
- 苏科版数学九年级下册5.1《二次函数》讲听评课记录
- 五年级数学听评课记录表
- 人教版九年级数学上册第二十二章二次函数《22.2二次函数与一元二次方程》第1课时听评课记录
- 【2022年新课标】部编版七年级上册道德与法治第六课 交友的智慧 2课时听课评课记录
- 韩式餐厅承包经营合同范本
- 个人入股分红协议书范本
- 2025年电力铁塔市场分析现状
- 中国服装零售行业发展环境、市场运行格局及前景研究报告-智研咨询(2025版)
- 临床提高脓毒性休克患者1h集束化措施落实率PDCA品管圈
- GB/T 3478.1-1995圆柱直齿渐开线花键模数基本齿廓公差
- GB/T 1346-2001水泥标准稠度用水量、凝结时间、安定性检验方法
- FZ/T 25001-2012工业用毛毡
- 瑞幸咖啡SWOT分析
- DL∕T 1867-2018 电力需求响应信息交换规范
- 小学生品德发展水平指标评价体系(小学)
- 水利工程地震应急预案
- 日历表空白每月打印计划表
评论
0/150
提交评论