FPGA第三章.docx
《FPGA第三章.docx》由会员分享,可在线阅读,更多相关《FPGA第三章.docx(62页珍藏版)》请在冰豆网上搜索。
FPGA第三章
第三章
3.1基于ISE的设计输入方法
设计输入(DesignEntry)是FPGA设计的第一步,设计输入完成对电路或电路功能的描述。
Xilinx公司开发的的ISE(IntegratedSoftwareEnvironment)FPGA/CPLD用户开发集成环境为FPGA设计者提供了多种输入方法,主要有原理图(schematic)输入,VHDL/Verilog语言描述,状态图输入,IP核复用等。
3.1.1原理图输入
原理图输入是FPGA设计中一个比较直观的输入方法。
顶层设计采用原理图输入有利于对整个系统的把握。
1.启动ISE10.1
“开始”“程序”“XilinxISE”,在下拉子菜单中点击ProjectNavigator启动ISE。
启动后的ProjectNavigator如图所示。
2.建立工程
(1)选择FileNewproject,跳出Newproject对话框,如下图所示。
选择目标器件,如图所示在ProjectDeviceOption中选择相应的目标器件。
DeviceFamily栏选择器件的系列,Device栏选择器件的型号,Package栏选择器件的封装,Speed栏选择器件的速度类型,DesignFlow栏选择设计流程。
如果不做特别申明,本书基于ISE的所有设计都将选用如图所示的目标器件。
文件名不能填写含有中文
2.建立工程
(2)如上图所示键入工程名和工程路径。
(3)如上图所示在ProjectDeviceOption中选择相应的目标器件。
DeviceFamily栏选择器件的系列,Device栏选择器件的型号,Package栏选择器件的封装,SpeedGrade栏选择器件的速度类型,DesignFlow栏选择设计流程。
如果不做特别申明,本书基于ISE的所有设计都将选用如图所示的目标器件。
3.建立原理图输入源文件
选择ProjectNewsource,或者在SourcesinProject窗口中单击鼠标右键,选择Newsource,跳出“新建工程设计文件”对话框。
原理图文件
新建Schematic文件
分类窗口及原理图符号
生成的ECS工作环境
4.原理图输入
下面以一个简单的半加器为例介绍如何在ISE中使用原理图输入:
假设半加器的输入为A和B,输出为S(和)和CO(进位)。
由半加器的真值表(如下表)得到半加器的输入输出的关系逻辑表达式为:
S=AxorB
CO=AandB
可以看到ECS的Symbols选项界面中有Categories(分类窗口)和Symbols(原理图符号)窗口。
Xilinx的原理图库中有大量的原理图符号可供选择,为画原理图提供了方便。
Categories中对所有的原理图进行了分门别类,有Buffer(缓冲器),Comparator(比较器),counter(计数器),Decoder(解码器),Flip_Flop(寄存器),Latch(锁存器),Logic(逻辑门)等。
由于半加器用到了异或门和与门,所以选择Logic。
鼠标单击Logic使其高亮,这时会在Symbols窗口中出现了很多逻辑门的名称。
设计需要的是一个两输入的异或门(xor2)和一个两输入的与门(and2)。
在Symbols窗口中找到and2然后选择AddSymbol,于是鼠标上出现了and2的原理图符号,在绘图区中单击鼠标左键便可以将“and2”放在任何地方。
或者也可以在Symbols窗口中单击“and2”也可以完成原理图符号的放置。
同样的方法放置好“xor2”。
单击工具栏中的可以放大显示。
放大后如图所示。
画好连线的原理图
放置好了原理图,下一步就是根据逻辑表达式进行电气连线。
单击工具栏中的或者选择AddWire,然后如下图所示画好连线。
单击工具栏中的或者选择AddI/OMarker都可以在相应的节点放置出输入输出端口,端口是输入还是输出可以从左边的Option选项中选择:
Addainputmarker(输入),Addaoutputmarker(输出),Addabidirectionalmarker(输入输出),Removethemarker(删除端口)。
如图所示。
放置好端口的半加器
对象属性设置
完成端口放置后,要为每一个端口取一个名称。
双击一个端口,跳出如右图所示的ObjectProperties(对象属性对话框)。
在Name(名称)属性的Value(属性值)中键入A。
添加现有的
端口属性
端口方向设置
同时也可以在PortPolarity(端口方向属性)的Value中设定端口的方向。
单击OK完成端口属性的设定。
用同样的方法完成所有端口名称的设定,设定好的端口如下图所示。
错误报告对话框
ECS还可以进行原理图检测,我们只需要选择ToolsCheckSchematic,ECS便自动对画好的原理图进行检测,检测完毕跳出错误报告。
如上图所示。
将做好的半加器“封装”起来,形成自己的原理图符号。
选择ToolsSymbolWizard,然后PinNameSource(引脚名来源)选择Usingschematic(使用原理图中的),Shape(形状)选项中选择Rectangle(矩形)如图所示。
关闭了当前窗口后在原先的Symbols选项栏中的Categories窗口中多了我们自己定义的半加器。
在Symbols窗口中单击half_add便可以把自己定义的半加器放置到工作区中,像其他原理图符号一样在设计中使用,如图所示。
原理图输入在FPGA的设计当中主要用于顶层的映射,设计直观,易于理解。
3.1.2HDL语言输入
VHDL超高速集成电路硬件描述语言和Verilog语言是当今最流行的硬件描述语言。
VHDL/Verilog语言输入已经成为FPGA设计输入的主要手段。
Xilinx公司的ISE集成了VHDL/Verilog语言输入,但是一个工程下只能使用一种语言输入,VHDL和Verilog语言不能混合使用。
本节将介绍如何在ISE中使用VHDL语言输入完成设计。
1.新建一个HDL语言输入的工程
2.
在ISE启动后,选择FileNewProject,跳出NewProject对话框,在对话框中输入工程名vhdl,如图所示。
2新建工程设计文件
最低位
最高位
选择ProjectNewsource,或者在SourcesinProject窗口中单击鼠标右键,选择Newsource,跳出“新建工程设计文件”对话框。
3.定义端口
结构体名称
设置端口的输入输出特性
定义好的VHDL程序模型
在上图中可以看到ISE会根据用户定义的实体,结构体和端口自动生成标准的VHDL源文件,包括所要用到的库,实体定义,端口定义,待描绘的结构等。
而且可以发现关键词是蓝色字体,数据类型是红色字体,可以方便设计人员区分。
剩下的工作就是如何用VHDL语言描绘这个D触发器。
4.VHDL编程
语言模板
对于初学者,如果不熟悉VHDL语言,可以单击工具栏上的图标,调出ISE自带的LanguageTemplates(语言模板)作为参考。
如图所示在Templates窗口中打开子菜单VHDLSynthesisConstructsCodingexamplesFlipFlops,选择DFlipFlopwithAsynchronousHighReset(带异步复位的D触发器)。
3.1.3状态图输入
状态图输入法用于设计状态机。
状态图直观,易于理解,修改方便。
在ISE10.1软件中集成了状态图输入(StateCAD),StateCAD提供了强大的查错,纠错,优化,HDL代码生成,仿真等功能,在很大程度上保证了状态机的高效性,稳定性,容错性。
StateCAD是状态机设计的一个综合性的工具。
本节以一个简单的受控制的三状态计数器的状态机为例,讲解如何使用ISE10.1集成的StateCAD设计状态机。
1.设计内容和设计要求
(1)系统端口定义
(2)状态机的状态定义
(3)状态机设计要求:
①系统复位后进入Idle状态,dout输出为全0
②当复位无效,并且控制信号为1的时,进入Cou状态,计数器开始计数(计数器使用的时钟为CLK)。
③当前状态为Cou时,如果控制信号C为0则进入Stop状态,停止计数。
④当前状态为Stop时,如果控制信号C为1则进入Cou状态。
2.新建立一个工程
3.新建StateDiagram输入文件
新建状态图文件
点击画状态图
生成的StateCAD工作环境
4.画状态图——状态机向导
状态机形状
状态数
画状态图——状态机复位向导
复位模式选择
Asynchronous(异步)或者synchronous(同步)
画状态图——转换设置向导
进入前一状态
进入下一状态
环行返回,下一个状态为本状态
生成的状态图
5.编辑状态图——编辑各个状态的名称
输出向导
状态名称
状态名调整后的状态图
编辑状态图——输出向导设置
编辑状态图——输出向导设置
设定好输出的状态图
6.状态间的转换和转换条件
完成了状态机的输出后,下一步要求描述状态之间的转换和转换条件。
根据设计要求,如上图中从stop状态到Idle状态的转换是不存在的,而设计中应该存在从stop状态转换到cou的转换过程。
所以,有必要去掉从stop到Idle的转换,添加从stop到cou的转换。
删除状态转换
(1)单击需要去掉的转换箭头,使其处于高亮状态,然后按Delete键便可以删除此转换。
添加状态转换
2)选择左边工具栏的(添加转换)按钮,单击stop状态,然后将鼠标移到cou状态图标,此时转换箭头会自动吸附到状态图标,单击鼠标左键完成状态转换。
可以通过拖动箭头线旁小方快改变线条的形状,使其更美观。
设定转换条件
双击状态转换线处→转换条件编辑
跳转条件
设定好转换条件的状态转换图
7.状态机编译与保存
选择菜单Option→Compile
弹出编译结果对话框。
如下图所示。
从对话框中可以看到很多重要的信息和数据,例如:
生成代码总的行数,所用的时间,占用了多少内存;状态机状态的个数,可能出现的状态转换的数目。
生成的HDL代码
StateCAD生成的代码是经过优化了的。
如果想使用这些代码,在关闭StateCADHDLBrower后,须保存该设计。
8.将StateCAD生成的代码加入工程
进入ProjectNavigator,选择ProjectAddsource,选择My_cou文件。
8.将StateCAD生成的代码加入工程
(2).选择VHDLModule(VHDL模型)
3.1.4IP复用
IP(知识产权)核将一些在数字电路中常用,但比较复杂的功能块,如FIR滤波器、SDRAM控制器、PCI接口等设计做成一个“黑盒”或者是可修改参数的模块,供设计者使用。
IP核包括硬IP与软IP。
调用IP核能避免重复劳动,大大减轻设计人员的工作量。
3.1.4IP复用
XilinxCoreGenerator采用了SmartIP技术和友好的用户参数设置界面。
使IP从生成到使用的过程简单,灵活,易用,高效,而且可以对IP使用的资源做一定估计。
3.1.4IP复用
下面以一个10进制计数器为例,讲解如何在ISE中生成IP和使用IP,实现设计。
1.设计要求
设计一个10进制计数器:
(1)计数频率为1Hz
(2)外部晶振为30MHz
(3)使用7段LED显示计
数器的值。
其原理框图如右图所示。
2.新建工程
3.新建VHDL(分频器)文件
4.编写分频器的VHDL源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydiv30is
Port(clkin:
instd_logic;
reset:
instd_logic;
clkout:
outstd_logic);
enddiv30;
architectureBehavioralofdiv30is
signalReg_clk:
std_logic:
='0';
begin
clkout<=Reg_clk;
process(clkin,reset)
variablecnt:
integerrange0to15000000:
=0;
begin
ifreset='0'thencnt:
=0;
Reg_clk<='0';
elsifrising_edge(clkin)thencnt:
=cnt+1;
ifcnt=15000000thencnt:
=0;
Reg_clk<=notReg_clk;
endif;
endif;
endprocess;
endBehavioral;
IP文件
5.建立一个IP文件
IP核生成器操作界面
IP核
在XilinxCoreGenerator(IP核生成器)操作界面左边的窗口中包含了很多文件夹,文件夹下又有子文件夹,子文件夹中装的就是各种功能的IP。
CoreGenerator中的IP相当丰富,而且已经分门别类装在不同的文件夹中。
如:
BasicElements(基本元素)中包含有一些最基本的功能IP,比较器,计数器,编码器/译码器,格式转换,逻辑门/缓冲器,各种存储器,复选器,寄存器,移位寄存器等。
IP核
还包含有:
Communication&Networking(通讯和网络)IP
DigitalSignalProcessing(数字信号处理)IP
MathFunctions(数学功能)IP
Memories&StorageElements(存储器)IP
Prototype&DevelopmentHardwareProduct(原形和开发硬
件产品)IP
StandardBusinterfaces(标准总线接口)IP
IP核生成器操作界面窗口中按钮的含义
6.IP参数设置
双击IP名BinaryCounter参数设置对话框
7.生成IP
将生成好的IP文件加入工程后SourcesinProject和ProcessesforCurrentSource中的变化如左图所示。
8.译码器设计
(1)定义端口
8.译码器设计
(2)编写VHDL源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydecoderis
Port(din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(6downto0));
enddecoder;
architectureBehavioralofdecoderis
begin
withdinselect
dout<="1000000"when"0000",--0
"1111001"when"0001",--1
"0100100"when"0010",--2
"0110000"when"0011",--3
"0011001"when"0100",--4
"0010010"when"0101",--5
"0000010"when"0110",--6
"1111000"when"0111",--7
"0000000"when"1000",--8
"0010000"when"1001",--9
"1111111"whenothers;
endBehavioral;
9.顶层映射
(1)定义端口
(2)编写VHDL源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitytopis
Port(clk:
instd_logic;
reset:
instd_logic;
dout:
outstd_logic_vector(6downto0));
endtop;
architectureBehavioraloftopis
componentdiv30
Port(clkin:
instd_logic;
reset:
instd_logic;
clkout:
outstd_logic);
endcomponent;
componentmy_cou
port(Q:
OUTstd_logic_VECTOR(3downto0);
CLK:
INstd_logic);
endcomponent;
componentdecoder
Port(din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(6downto0));
endcomponent;
signalclk1hz:
std_logic;
signalq:
std_logic_vector(3downto0);
begin
u1:
div30portmap(clkin=>clk,reset=>reset,
clkout=>clk1hz);
u2:
my_couportmap(clk=>clk1hz,q=>q);
u3:
decoderportmap(din=>q,dout=>dout);
endBehavioral;
到此已经使用IP完成了整个设计。
3.2基于QuartusII的设计输入方法
Altera公司的QuartusII和ISE一样为设计者提供了多种设计输入方法,包括原理图输入、状态图输入、HDL语言描述、网络表文件等,所不同的是,QuartusII11可以在一个工程中同时使用VHDL、Verilog语言输入。
本节介绍原理图输入和HDL语言输入方法。
3.2.1原理图输入
1.新建一个工程
与ISE一样,首先必须建立一个工程,所有的工作将在这个工程下完成。
下面将以占空比为50%的3分频器为例,介绍如何在QuartusII中使用原理图输入。
单击菜单FileNewProjectWizard,如果是首次使用将弹出新建工程向导介绍(Introduction)对话框,如图所示。
从对话框中可以了解到新建工程向导中将要完成的工作内容和一些其他信息。
工程向导介绍
单击Next进入工程建立路径和工程名称对话框,如图所示。
在第一栏中设定好工程建立的路径,在第二栏中填写工程的名称,在第三栏中填写工程顶层设计文件的名称。
在缺省(默认)状态下,顶层设计文件的名称和工程名称相同。
单击Next进入加入工程文件对话框。
如图所示。
由于本例所建立的工程没有可以使用的文件,所以不需要做任何操作。
单击Next进入EDA工具设定对话框。
如图所示。
本例由于没有可以使用的EDA工具,所以不需要任何操作。
单击Next进入目标器件系列选择对话框。
如图所示。
从图中可以看到,设计者可以自己选择想要的器件系列,也可以让编译器选择目标器件系列。
这里选择让编译器选择目标器件系列。
选择器件类型
建立好的工程
2.使用原理图输入设计3分频器
选择FileNew弹出新建文件对话框。
如图所示。
选择BlockDiagram/SchematicFile。
2.使用原理图输入设计3分频器
选择电路符号
放置电路符号
放置端口
绘制3分频器原理图
3.2.2HDL语言输入
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydivis
port(clkin:
instd_logic;
clkout:
outstd_logic);
enddiv;
architectureBehavioralofdivis
signalQ1,Q2,Q3,clk_nor:
std_logic:
='0';
begin
clk_nor<=Q1norQ2;
clkout<=Q3;
process(clkin)
begin
ifrising_edge(clkin)then
Q1<=clk_nor;
endif;
endprocess;
process(clkin)
begin
iffalling_edge(clkin)then
Q2<=clk_nor;
endif;
endprocess;
process(clkin)
begin
ifrising_edge(clkin)then
Q3<=notQ3;
endif;
endprocess;
本章小结
设计输入(DesignEntry)是FPGA设计的第一步,设计输入完成对一个功能的描述。
Xilinx公司的ISE为F