FPGA简易教程

FPGA Advantage简易教程注:下面的界面是基于HDS2003.2,如果软件版本不同,可能界面会不一样。

这是一个简单的计时器例子,设计输入是一个十比特的数据总线和一些控制信号包括起始,停止,复位和时钟信号。计数器的输出用两个四比特的总线描述高低值,同时也有一个逻辑输出用来激励音频输出。如下所示:

我们将在Mentor Graphics公司的FPGA Advantage 设计环境中完成包括设计输入、仿真、综合、甚至后仿真的完整的FPGA设计流程。通过练习,可以熟悉框图、状态机、真值表等各种设计输入方式以及用ModelSim进行仿真、用Precision进行综合的方法,从而熟悉整个FPGA Advantage 的设计环境和FPGA设计流程。

注意:对于所有的图形,软件支持单键操作的一笔划技术,也就是放大和缩小,适配纸张等等。比如:在图形中按住中间键(三键鼠标),往左上方划表示View All。八个方向分别有不同的含义。用中间键选择一个区域就是显示该区域。

1. 创建一个Project

HDL Designer 用Project 来管理设计,一个Project里可以包含多个库(Library)。开始一个新项目前,首先建一个新的project。每个Project 对应一个.hdp 文件,该文件中包含project中的所有库的信息。软件安装后自带一个缺省的名为example的 project(example.hdp),里面包括一些作为例子的库。

在Design Manager窗口中点击Project工具栏下的快捷图标New Project ,创建一个新的Project。

点击New Project后, Creating a New Project 对话框弹出,

输入Project 名、存放位置、缺省库的名字。点击Next,弹出Project Summary 窗口,

点击Next,弹出Project Content窗口,选择Create design files, 点击 Finish。

Project被创建的同时,Tutorial库也被创建并打开。注意,在指定的路径下创建了源设计数据目录C:\tmp\Myproject\TUTORIAL\hds, HDL文件目录存放目录C:\tmp\Myproject\TUTORIAL\hdl。

2.设置缺省的语言

从Options菜单中选中Main,选择General ,确保VHDL被选中作为默认的语言,其它所有的选项都保留默认值,然后OK。

当然设计者也可以选择Verilog,如果选择了Verilog作为默认的语言,在信号定义、功能描述的时候,要遵循Verilog的语法规则,具体练习过程参见《Graphical Design Tutorial》中的Chapter 2 Verilog Timer Exercise (在Design Manager 窗口的Help下拉菜单中选择HDL Designer Series Tutorials)。

3.创建一个框图

对于当前的TOP-DOWN设计流程,整个设计刚开始都要进行逻辑上的功能划分,这个功能用画框图来完成很方便。激活TUTORIAL库,在Designer Manager 窗口中点击按钮,选择Graphical View > Block Diagram,

一个新的框图编辑窗口被打开。

4.添加Blocks

点击(add block) 快捷图标在框图中添加两个模块,模块会显示默认的库和模块名,以及唯一的实例名I1和I0。

5.添加嵌入式模块

点击快捷图标添加两个嵌入式模块到框图中,这些模块也显示默认的名字,如图所示:

在一个库中,描述一个Block的视图必须被命名和保存成一个独一无二的设计单元。嵌入式模块和一般模块的区别是不支持层次化,而且只能有一种描述方式。一个Block同时可以存在很多种描述方式,可以是状态机,框图,源代码等等,但是Embedded Block只能有一种描述方式存在,而且描述方式很有限。Block可以进行设计复用,但是Embedded Block不支持,它完全没有层次化的概念。

6.添加端口和信号

你可以使用下面的按钮添加信号和总线。

选择使用连接三个信号从I0到I1。选择使用添加一个输入的总线信号到eb1模块。其它的连接同理,最后完成的连接如下图所示:

添加从从模块中输出的信号时(输出到断口),在信号结束的位置双击即可完成。信号默认的类型是std_logic,总线默认的类型是std_logic_vector(15 downto

0)。双击信号和总线可查看属性,也可以用鼠标右键弹出菜单中的Object

Properties进行操作。

7.添加一个Bundle和全局连接器

用在框图的左边添加三个信号(注意:双击结束)。选中这三个信号,然后点击就可以连接一个包括这三个信号的bundle到模块I0,如图所示,默认的名字是bundle0。如果有很多信号连到一个模块,用Bundle很方便。

用在框图中添加一个global connector,并添加一个输入信号端口连接到global connector,该信号会隐含地连接到框图中的所有模块。对于需要连接到所有模块的信号如:时钟等,这样操作比较方便。

8.保存框图

点击保存框图。选择TUTORIAL库,Design Unit名字是Timer,如下所示:

然后点击OK。此时可以看到框图的窗口标题被更新为。

在Designer Manager窗口中选择下拉菜单Vew > SubWindows > Design Hierarchy ,打开Design Hierarchy(设计层次)窗口。

从Design Units 窗口中选择 Timer 模块拖到Design Hierarchy 窗口并展开,可以看到:

红色字样表示模块没有被定义,也就是说这些模块没有具体地描述实现,仅仅有一个空的符号,相当于只有VHDL的实体头,没有结构体。

9.编辑模块和信号名

现在已经完成了Timer的顶层设计规划,但是模块和信号还是默认的名字。

对于模块名和信号名字的更改,可以选中对象,击右键,修改属性(Object Properties)。在属性中修改对应的模块名和信号名以及总线位宽。也可以双击对应的文本直接进行编辑修改。

从下拉菜单Diagram > Singals > Scope for Changes中选择Entire Net in diagram,使得信号的修改在整个图中都有效。或者在Object Properties 对话框中改名时同时修改其中的Apply change to项。

注意:模块的名字大小写要区分,也就是control和Control是不同的。模块名字进行如下修改:

信号和模块修改后如下:

修改总线的一个例子如下(注意:在Declaration中改位宽):

如果修改后的总线看不到位宽的描述,可以在修改总线时修改名字旁边的Visibility。也可以右键单击对应的总线,选择Singal Visibility,然后选择如下即可:

选中OR1 嵌入式模块,按右键,从Open中选择New View显示如下:

现在OR1旁边,也可以编辑OR1模块的属性,如下:

在文本中输入:alarm <= hold OR beep;注意此语句一定要符合VHDL语法,包括后面要有一个“;”。否则当你按下OK或者Apply时将会提示你语法错误。

默认的模块形状是矩形,可以在修改属性时按Change Shape进行更改。因为改模块实现的是OR功能,所以可以改变成OR的形状。此时模块如下所示:

整个设计如下图所示:

说明:其实Embedded Block的功能都可以用Block来实现,只是Mentor Graphics提供很多种设计输入方式,不同的设计者可以根据自己习惯的设计输入方式进行设计。

11.创建一个状态机(模块Control用状态机来描述)

选中Control模块,点击右键,选择Open As > New View,此时如下所示:

选择State Diagram,点击Next,然后

点击Finish,一个新的状态机图作为

Control模块的子视图被创建,

状态机编辑窗口弹出。

12.定义状态和状态转移条件

点击添加五个状态,默认的状态名为s0,s1,s2,s3,s4。注意:你输入的第一个状态被假定为起始状态,用绿色的

双线圆圈表示。点击加入状态之间

的转移,如图所示:

转移条件的优先级缺省按照加入的顺序给

定,也可以通过编辑转移条件的属性进行灵活

设置。

保存状态机。

保存后在Designer Manager窗口中可以看

到如下:

在窗口中Control设计单元作为一个Block显示出来,因为在父框图中它的接口已经被连接关系完全定义。

13.编辑状态

编辑状态属性有多种途径,可以直接双击要编辑的状态,也可以选中状态后单击鼠标右键,选择弹出菜单中的Object Properties。比如s0,

状态名在Name栏内修改,Actions对应的栏目描述的是该状态所描述的动作,相当于状态解码一样,也就是处于该状态时相关信号的电平状态。注意:一定要符合VHDL 语法,每一行要用“;”结束。

编辑转移条件用同样的方法,属性对话框如下图所示:

转移条件在IF Condition栏中输入,注意没有“;”,因为这里相当于IF语句中的条件表达式。在Use Priority中设置转移条件的优先级。修改后的状态机如下图所示:

相关主题
相关文档
最新文档