本实验指导演示了一个简单的正弦信号发生器在QuartusII上的实现。通过这个实验,旨在演示利用QuartusII开发数字电路的基本流程和QuartusII软件的相关操作,并借此介绍QuartusII的软件界面。通过此实验开始逐步了解SOPC的硬件开发平台;开始学习系统设计的全过程,重点掌握:模块配置、时序仿真和编译综合等主要环节。我们还针对NiosII的实验板,实现了本实验所示硬件模块的相关配置工作以及下载和实现。
实验条件:
ALTERA DEⅡ开发实验平台 QuartusII 6.0
一、设计原理
下图所示为正弦信号发生器的结构,共由4个部分组成:
VHDL顶层设计 singt.vhd 6位计数器(地址发生器) Sin数据存储ROM 8位DAC
顶层文件singt.vhd在FPGA中实现两个部分:
1、6位计数器产生地址信号;
2、存储正弦信号(6bits地址线,8bits数据线)的ROM,由LPM_ROM模块实现,LPM_ROM模块底层由FPGA的EAB、ESB或M4K来实现。
地址发生器的时钟频率CLK假设为f0,这里我们设定的地址发生器为6bit,则周期为26=64,所以一个正弦周期内可以采样64个点,DAC后的输出频率f为:
f=f0/64
我们可以如下生成sin数据以用于查找表,双、单极性Sin(x)数据波形可如下:
x = round((sin(linspace(0,2*pi,64))+1)*127.5);
1
所要得到的单极性信号波形。
二、实验步骤
1、工程创建 1.1 建立工程
进入QuartusII开发软件,选择File,点击New Project Wizard。
2
弹出工程向导对话框,选择Next
1.2 输入存放工程及其相关设计文件的文件夹:
指定“工程名”和工程对应的“顶层设计实体名”。这里我们将工程名和顶层设计实体名都取作“lab1”,再点击Next。(工程目录可以随意设置,但是必须是英文的目录,并且文件名中不能出现空格,否则在工程编译时会出现错误。)
3
接下来点击Add将先期已经输入的设计文件(*.bdf;*.vhd;*.v等)添加到工程中,这里我们没有事先输入好的文件,因此不用添加,即使点击Add All,也没有文件可以加入。
接着点击User Liberary Pathname指定用户自定义元件库的路径,这里我们没有要用的用户自定义元件库,也忽略跳过,直接进入下一步。
1.3 如有已经输入完毕的设计文件,我们可以参照下述方式建立新工程:
4
该文件已给出,在实验原始文件夹中;
打开此文件,正弦信号发生器的VHDL格式的设计文件已在文件框中;
5
对此文件做相应的编辑修改后点击file->save as存入新建立工程的目录下
此时会出现如下的提示,选择“是”,则开始了创建工程的步骤,如前所述;
6
指定目标器件:
实验所用的Altera套件为“CyclineII”系列的“EP2C35F672C6”。在实际开发中,可以通过查看核心板参考手册,或者直接观察核心板来获得所使用的器件具体型号。
7
接下来指定“设计输入,综合,仿真,时序分析……”用到的工具,QuartusII对第三方工具的支持比较完善,这里我们不选择,直接点击Next,QuartusII将使用默认的“设计输入,综合,仿真,时序分析……”工具。
上图给出了所创建工程的主要的信息。点击Finish,工程新建完成,工程相关的基本配置工作也完成,这些已经配置的参数,在开发工作进行的过程中,仍然可以通过菜单Assignments->Settings来修改。
2、sin信号发生器顶层模块的设计 2.1 新工程设计文件输入模式:
新建文件,打开File菜单点击New命令,选择Device Design Files子类中的VHDL File,
8
点击OK,创建一个vhdl文件,利用VHDL语言方式输入
我们刚才已经用拷贝文件方式新建了顶层设计文件保存,这是工程新建的第一个文件,系统会默认保存为顶层设计实体的名字,在本实例中,也就是“singt1”,点击“保存”,这样,就新建好了顶层设计实体的输入文件。下面我们介绍的是如何输入VHDL格式来建立我们所需模块的实现代码,没有兴趣的同学可以跳过此节。
提示: Quartus给我们提供了很多的帮助,比如对VHDL不熟悉或某些语法生疏的情况下,该软件提供了如下图的模板生成代码:
9
2.2 模块的设计及其输入
在singt.vhd文件中我们可以输入模块对应的实现代码。如下:
10
在该文件中我们完成了6位计数器的设计工作,调用了sin波形数据存储文件data_rom.vhd,并加以了例化。下面我们具体的给出该文件的编写方式。
3、定制ROM存储sin波形数据
构成ROM中初始化数据文件的方式有两种:Memory Initialization File(.mif)格式和Hexadecimal(Intel-Format)File(.hex)格式。下面我们仅仅以.mif格式的文件为例来讲解ROM初始化数据文件的生成。 3.1 建立.mif文件
点击Quartus II的File->New->Other Files项,选择Memory Initialization File,点击OK,出现一个参数设置框。
这里Number of words对应查找表中查找项的个数,为64;Word size对应sin输出波形的数据宽度,为8。点击OK出现如下表格:
3.2 ROM数据的生成
表格中的数据即为sin输出点所对应的8bits的幅度,我们可以在Matlab下生成这些数据:
11
x = round((sin(linspace(0,2*pi,64))+1)*127.5);
reshape(x,8,8)’
ans =
128 140 152 165 176 188 198 208 218 226 234 240 245 250 253 254 255 254 253 250 245 240 234 226 218 208 198 188 176 165 152 140 128 115 103 90 79 67 57 47 37 29 21 15 10 5 2 1 0 1 2 5 10 15 21 29 37 47 57 67 79 90 103 115
复制这些数据或直接输入到mif表格中,如图。
当然我们可以通过excel得到这些数据,也可以编程得到这些数据。最方便的方式则是在Matlab/Simulink的DSPBuilder下完成ROM波形数据文件的编写。我们将文件保存为singt.mif。
3.3 定制ROM元件
下面我们对初始化数据文件加载到一定的硬件模块中,本例中我们将之加载于LPM_ROM模块,步骤如下。 (1)调用Mega Wizard Plug-In Manager (Tool->Mega Wizard Plug-In Manager)
12
(2)设置LPM_ROM模块:选择Create a new custom megafunction variation,点击Next。
13
这里我们设置器件为CycloneII,输出文件的格式为vhdl,输出文件名为data_rom.vhd,选择 storage中的LPM_ROM。点击Next。
在Page 3 of 6,我们进一步设置LPM_ROM的相关参数,如下图:
14
其中器件为上一页面所选的CycloneII,rom输出的总线宽度为8bits,该查找表共有64个查找项,选择Daul Clock方式,inclock为地址锁存控制信号。点击Next。
取消’q’ output port 选项,点击next。
在page5 of 6中RAM block的类型由Quartus进行自动的选择(如ACEX1K为EAB,APEX20K为ESB,Cyclone为M4K),内存初始化的数据文件指定为我们刚才创建的
15
singt.mif,选择Allow In-System Memory Content Editor to …,表示允许Quartus II将能通过JTAG口对下载于FPGA中的此ROM进行在系统的测试和读写,这种读写不影响FPGA中系统的工作。点击Finish! (3)添加文件到工程
我们必须将刚才生成的所有文件添加到工程中。选择Quartus的Files选项,右键点击Add/Remove Files in Project。
16
点击右图的Add All-> OK
打开data_rom.vhd,修改绝对路径为相对路径!(如图所示,将init_file->\"singt.mif\"改写成init_file-> \"./singt.mif\"。)
(4)建立顶层设计文件
新建文件,打开File菜单点击New命令,选择Device Design Files子类中的Block
17
diagram/schematic file,点击OK,点击file->save as,文件名为lab1.bdf。这样创建一个.bdf文件作为顶层设计文件,顶层设计利用图形方式输入。(进行如下操作将lab1.bdf设置成顶层文件)
生成singt.vhd的synmbol以方便在.bdf文件中调用。
在lab1.bdf输入栏中双击空白处,弹出symbol调用窗口,如下图所示,选择刚才生成的singt的symbol,点击OK。
18
用相同的方式在原理图中添加input和output管脚。
输入管脚命名为clk,输出管脚命名为dout[7..0]
19
4、编译、综合等
Quartus II编译器由一系列处理模块组成,如设计工程的查错、逻辑的综合、结构的综合、输出结果的编辑配置、时序分析等。在编译前,我们可以设置一些参数使得编译器采取一些特别的综合和适配技术(如时序驱动技术等),也可提高工程编译的速度,优化器件的资源利用率等。
我们简单的点击Start Compilation 进行全程编译。
编译的时候,Quartus II会给出编译的一些相关信息,如果出错,则根据这些提示进行排错,直至无误。
编译完成后出现如下框图。
并给出编译报告,如图。
20
5、仿真
对工程的编译通过后必须进行功能和时序的仿真,以便了解系统是否满足要求。步骤如下:
5.1 编辑波形文件
点击File->New->Other Files–>Vector Waveform File
21
设置仿真时间:
保存波形文件:
22
导入singt工程的相关节点:
在波形向量文件编辑器左侧空白处双击左键或者右键->Insert Node or Bus弹出Insert Node or Bus对话框,在对话框中输入名字插入需要仿真的Node和Bus(也就是设计输入文件中的Pin或者Signal),也可直接点击Node Finder,让编辑器列出已知的Node和Bus。
点击Node Finder,就调出上述的对话框。选择所需的pin到观察列表,如图:
23
设置CLK的输入波形:
24
我们可以通过左侧的放大镜进行观察,保存该文件。
5.2 配置仿真参数
25
在菜单Assignments->Settings->Simulator页面,设置Simulation Mode,根据具体需要选择Functional或者Timing,这里我们选择功能仿真(Functional)。
仿真之前,先点击下图所示指令,生成功能仿真子表(功能仿真特有的步骤)。
26
5.3 进行仿真
点击菜单工具栏
按钮,得到仿真的结果。
为便于观察DOUT的输出结果,设置其数据格式:
27
结果如下:
28
注意:如果采用时序仿真,时钟周期太小,可能会造成数据输出不正确,所以建议时钟周期尽量大于毛刺检测时间的十倍以上。 6、内部电路观察
观察RTL电路:点击Tool->RTL Viewer
点击Tool->Technology Map Viewer
29
7、管脚分配
分析和综合之后,点击菜单Assignments->Pins,进入管脚分配编辑器,
注意:如果不需要将最后的设计生成文件烧写到开发板,而只是需要尝试QuartusII的设计流程,任意选择几个管脚就可以。这里为了观察我们设计的工程是否正常工作,我们将输出引脚分配到8个LED上,对应我们实验所采用的试验平台具体的管脚分配后面将会给出。(如果将设计输入到其他实验平台上,请具体参考对应的开发板的《硬件开发配置参考
30
手册》(名字可能有差别)或类似文档来分配管脚。)
确定锁定引脚编号后就可以完成以下引脚锁定操作了: (1)假设现在已打开了lab1工程(如果刚打开QuartusII,应在菜单File中选择Open Project项,并单击工程文件lab1,打开此前已设计好的工程)。 (2)选择Assignments菜单中的Assignment Editor项
即进入Assignment Editor编辑器窗。在Category栏中选择Pin,或直接单击右上侧的Pin按
钮。
(3)双击TO栏的《new》,在出现的下拉栏中选择并单击本工程要锁定的端口信号名(如
clk);
再双击location下的《new》输入FPGA的管脚号或有下拉菜单中寻找相应的管脚并单
击;如对应clk,选择B13脚。
31
由此重复输入,至所有管脚都分配完成;
(4)最后存储这些引脚锁定的信息后,必须在编译(启动Start Compilation)一次,才能将引脚锁定信息编译进编程下载文件中。此后就可以准备将生成好的.sof文件下载到实验系统的FPGA中去了。 8、下载
在编译下载之前,请查看本实验后的附录。
将开发板插上电源,将JTAG连接线连上开发板和PC。打开电源开关,计算机提示发现新硬件,安装JTAG驱动,驱动程序在程序安装目录DRIVER文件夹下。
点击菜单工具栏按钮进入下载页面,下载工程生成的烧写文件*.sof到FPGA芯片,首先要配置下载工具,点击Hardware Setup,进入下载工具设置页面,
32
首先点击Add Hardware,进入Add Hardware对话框添加用到下载电缆,选择Nios II Evaluation Board下载电缆,点击OK回到Hardware Setup对话框,
输入需要下载的文件(这里是lab1.sof),选择Program/Configure复选框,点击Start,即可完成烧写文件的下载。
注意:消息框中下载结束的信息条出现。
下载成功后,我们可以在实验平台上看到8个LED在闪亮。(也许会由于主频时钟频率过大,而观察不到明显的闪烁)
10、实践作业
在熟悉以上实验内容的基础上,自己设计一个三角波、锯齿波信号发生器,相关参数自己设定。
33
附A
菜单Assignments->Settings对话框
Setting对话框是QuartusII软件比较重要的一个设置工具,几乎和项目所有相关的设置工作都可以在这里找到,并做出相应的修改。
主要包括工程的配置,分析综合工具的配置,编译过程的设置,目标器件相关的配置。当然,其中的大部分设置如果不是工程有什么特殊要求,使用默认的配置就可以了,这些设置可以逐渐熟悉掌握。
Setting中一个比较重要的设置是Device,Device包含和目标器件相关的设置,在任何工程中都需要进行配置。
34
如上图所示,我们在新建工程向导中所配置的器件在这里可以进一步修改。 点击Device & Pin Options……
Device & Pin Options……主要包括:
产生何种编程烧写文件,如何处理未使用的器件管脚,如何处理多用途管脚,产生何种非JTAG下载方式的下载文件等。大部分配置仍然是只需要使用默认配置就可以了,
值得注意的是Unused Pins一项,由于我们的开发工作往往是在一个有很多外围电路的开发系统上进行的,而且FPGA的很多管脚都已经连接到外围电路上,而在我们的工程中,可能有未使用这些外围电路,为了让我们的工程不与外围电路相互干扰,最好将未使用的管脚配置为输入高阻态。
35
因篇幅问题不能全部显示,请点此查看更多更全内容