首页资源分类FPGA/CPLDAltera > 5《HELLO FPGA》- 软件工具篇

5《HELLO FPGA》- 软件工具篇

已有 445185个资源

下载专区

文档信息举报收藏

标    签:《HELLOFPGA》

分    享:

文档简介

5《HELLO FPGA》- 软件工具篇

文档预览

封面 前言 为什么要学软件工具篇:Altera 的开发环境为 Quartus II,Xilinx 的开发环境为 ISE(Integrated Software Environment)。这里我们选择的是 Altera 的器件,所以开发环境为 Quartus II,Quartus II 开发软件是 Altera 公司为其 FPGA 芯片设计的集成化专用开发工具,是 Altera 最新一代功能 更强的集成 EDA 开发软件,使用 Quartus II 可完成从设计输入,综合适配,仿真验证到下载调 试的整个设计过程。Quartus II 集成了 Modelsim-Altera、SignalTap 工具,可以直接调用来完 成设计任务的仿真及调试。 软件工具篇包含了哪些内容:该篇不仅讲解了如何使用 Quartus II 软件、ModelSim 和 SignalTap II 软件,还讲解了 PLL、ROM、RAM 和 FIFO IP 核的使用。从第一个新工程建立, 管脚分配,程序下载及工程仿真,工程调试等一系列图文操作手把手带领读者掌握软件的操作, 更进一步铺开来详细讲解软件的操作界面及菜单说明,功能使用。解决读者在学习上遇到的最棘 手的“软”问题,为进一步学习实战篇奠定了基础。 目录 第一章 Quartus II 软件 .................................................................................................................. 1 §1.1 Quartus II 软件介绍 ........................................................................................................3 §1.2 Quartus II 使用流程 ........................................................................................................4 §1.3 Quartus II 工程实战 ........................................................................................................5 1.3.1 新建工程 ..................................................................................................................5 1.3.2 选择器件 .................................................................................................................8 1.3.3 选择工具 .................................................................................................................9 1.3.4 输入设计 ............................................................................................................... 11 1.3.5 编译工程 ............................................................................................................... 14 1.3.6 分配管脚 ............................................................................................................... 15 1.3.7 配置工程 ...............................................................................................................19 1.3.8 下载程序 .............................................................................................................. 22 第二章 ModelSim 软件................................................................................................................29 §2.1 ModelSim 软件介绍......................................................................................................31 §2.2 ModelSim 使用流程 .................................................................................................... 32 §2.3 ModelSim 工程实战之自动仿真 ................................................................................. 32 2.3.1 检查 EDA 路径..................................................................................................... 33 2.3.2 选择 EDA 工具 .................................................................................................... 34 2.3.3 编写仿真文件 ...................................................................................................... 35 2.3.4 配置仿真功能 ...................................................................................................... 38 2.3.5 开始功能仿真 ....................................................................................................... 41 2.3.6 开始时序仿真 ...................................................................................................... 44 §2.4 ModelSim 工程实战之手动仿真 ................................................................................. 46 2.4.1 新建仿真工程 ....................................................................................................... 46 2.4.2 编译仿真文件 ...................................................................................................... 49 2.4.3 配置仿真环境 ...................................................................................................... 50 2.4.4 开始功能仿真 ...................................................................................................... 53 2.4.5 开始时序仿真 ...................................................................................................... 54 §2.5 VWF 波形仿真............................................................................................................. 58 第三章 SignalTap II 软件.............................................................................................................65 §3.1 SignalTap II 软件介绍.................................................................................................. 67 §3.2 SignalTap II 使用流程 ................................................................................................. 67 §3.3 SignalTap II 功能介绍 ................................................................................................. 68 3.3.1 例化管理 .............................................................................................................. 69 3.3.2 节点列表 ............................................................................................................... 71 3.3.3 触发条件 .............................................................................................................. 73 3.3.4 信号配置 .............................................................................................................. 75 3.3.5 Jtag 配置 .............................................................................................................. 80 3.3.6 数据日志 .............................................................................................................. 80 3.3.7 分层显示 ...............................................................................................................81 §3.4 SignalTap II 工程实战 ..................................................................................................81 3.4.1 创建分析文件 ........................................................................................................81 3.4.2 选择监测信号 ...................................................................................................... 83 3.4.3 配置采样属性 ...................................................................................................... 85 3.4.4 定义触发条件 ...................................................................................................... 85 3.4.5 重新编译工程 ...................................................................................................... 86 3.4.6 下载分析波形 ...................................................................................................... 87 §3.5 SignalTap II 上电触发 ..................................................................................................91 第四章 IP 核之 PLL .....................................................................................................................95 §4.1 IP 核之 PLL 的介绍...................................................................................................... 97 §4.2 IP 核之 PLL 的配置 ..................................................................................................... 97 4.2.1 参数设置(Parameter Settings)...................................................................... 98 4.2.2 PLL 重配置(PLL Reconfiguartion) ............................................................... 101 4.2.3 输出时钟(Output Clocks) ............................................................................. 101 4.2.4 电子设计自动化(EDA) ..................................................................................102 4.2.5 总结(Summary) ............................................................................................103 §4.3 IP 核之 PLL 的应用 ....................................................................................................104 4.3.1 使用 Quartus II 软件创建 PLL IP 核 ..................................................................104 4.3.2 使用 ModelSim 软件仿真 PLL IP 核 .................................................................108 4.3.3 使用 SignalTap II 软件调试 PLL IP 核 .............................................................. 110 第五章 IP 核之 ROM ................................................................................................................. 113 §5.1 IP 核之 ROM 的介绍 .................................................................................................. 115 §5.2 IP 核之 ROM 的配置 .................................................................................................. 115 5.2.1 参数设置(Parameter Settings)..................................................................... 116 5.2.2 电子设计自动化(EDA) .................................................................................. 118 5.2.3 总结(Summary) ............................................................................................ 118 §5.3 IP 核之 ROM 的应用 .................................................................................................. 119 5.3.1 Mif 文件的创建方法 ............................................................................................. 119 5.3.2 使用 Quartus II 软件创建 ROM IP 核................................................................120 5.3.3 使用 ModelSim 软件仿真 ROM IP 核 ...............................................................123 5.3.4 使用 SignalTap II 软件调试 ROM IP 核 ............................................................125 第六章 IP 核之 RAM..................................................................................................................129 §6.1 IP 核之 RAM 的介绍................................................................................................... 131 §6.2 IP 核之 RAM 的配置 .................................................................................................. 131 6.2.1 参数设置(Parameter Settings).....................................................................132 6.2.2 电子设计自动化(EDA) ..................................................................................135 6.2.3 总结(Summary) ............................................................................................136 §6.3 IP 核之 RAM 的应用 ..................................................................................................137 6.3.1 使用 Quartus II 软件创建 RAM IP 核 ................................................................137 6.3.2 使用 ModelSim 软件仿真 RAM IP 核................................................................ 141 6.3.3 使用 SignalTap II 软件调试 RAM IP 核.............................................................143 第七章 IP 核之 FIFO..................................................................................................................147 §7.1 IP 核之 FIFO 的介绍...................................................................................................149 §7.2 IP 核之 FIFO 的配置 ..................................................................................................149 7.2.1 参数设置(Parameter Settings).....................................................................150 7.2.2 电子设计自动化(EDA) ..................................................................................155 7.2.3 总结(Summary) ............................................................................................156 §7.3 IP 核之 FIFO 的应用 ..................................................................................................157 7.3.1 使用 Quartus II 软件创建 FIFO IP 核 ................................................................157 7.3.2 使用 ModelSim 软件仿真 FIFO IP 核................................................................ 161 7.3.3 使用 SignalTap II 软件调试 FIFO IP 核.............................................................163 版权声明 .......................................................................................................................................167 Quartus II 软件 第一章 Quartus II 软件 §1.1 Quartus II软件介绍 Quartus II 是 Altera 公司的综合性 FPGA 开发软件,有原理图、VHDL、Verilog HDL 等多 种设计输入形式,内嵌综合器以及仿真器,可以完成从设计输入到硬件配置的完整 FPGA 设计 流程。Quartus II 可以在 XP、Win7 以及 Linux 上使用,除了可以使用 Tcl 脚本完成设计流程外, 提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。 Quartus II 支持 Altera 的 IP 核,包含了 LPM/MegaFunction 宏功能模块库,可以使用户充分利 用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方 EDA 工具的良好支持也可以 使用户在设计流程的各个阶段使用熟悉的第三方 EDA 工具。 由于 Quartus II 软件更新的比较块,从 Quartus II 6.0 版本更新到了 Quartus II 15.1 版本, 所以我们在选择 Quartus II 软件版本上也就成了一大问题,这里我们选择使用的 Quartus 版本 是 13.1,好奇的读者也许会问,为什么要选择 Quartus13.1 呢?大家看,如图 1.1 所示,这是我 们在知名电子开发论坛 EETOP 上看到的调查。 图 1.1 Altera Quartus II 软件版本调查图 从该图中我们可以看出,Quartus II 13.1 相对于其他版本还是比较稳定,如果你是一个具有 强迫症的读者,也可以去尝试一下最新的 Quartus II 15.1 版本,Quartus II 15.1 与 Quartus II 13.1 相比较而言,除了界面上稍微变化以外,基本的使用功能还都是一样的。我们这里说的没有变化 是在站在使用上的角度上来说的,具体的性能变化那肯定是有的,比如编译速度更快了,优化的 更好了等等。 变化比较大的几个版本要属 Quartus II 9.x 版本到 Quartus II 13.x 版本。下面我们就简单的 4 软件工具篇 §1 介绍一下 9.x 版本、11.x 版本和 13.x 版本的几个比较大的变化:Quartus II 11.x 版本在 Quartus II 9.x 版本的基础上 (1) 去掉了软件自带的仿真组件(也就是我们常说的 Vector Waveform File 仿真功能),我 们想要仿真就必须要安装 Modelsim。 (2) 添加了 Qsys 软件功能,也就是说 Qsys 和 SOPC Builder 这两个功能都有。 Quartus II 13.x 版本在 Quartus II 11.x 版本的基础上: (1) 去掉了 SOPC Builder 软件功能,只剩下了 Qsys 软件功能, (2) 添加了 University Program VWF(也就是 Vector Waveform File 仿真功能)。 这里我们需要注意的是,如果你没有安装 Modelsim,这里的 University Program VWF 仿 真功能也是使用不起来的,University Program VWF 仿真功能需要借助 Modelsim 仿真软件才 能正常工作。当然,这些版本中还有很多的变化,我们说的这几个只是其中的几个关键点,至于 其他的功能变化,我们也是不需要知道的,我们只要会用就可以了。 §1.2 Quartus II使用流程 下面我就来介绍一下 Quartus II 使用流程,如图 1.2 所示。 打开软件 新建工程 选择器件 选择工具 输入设计 编译工程 分配管脚 配置工程 下载程序 图 1.2 Quartus II 软件的使用流程图 从该图中我们可以看出,首先我们需要打开 Quartus II 软件,打开软件之后,英文不好的读 者就要呆住了,因为 Quartus II 软件它是一个英文版本的,这时有的读者就会冒出这么一个疑 问:有没有中文版本的 Quartus II 软件呢?很遗憾,我们的回答是:没有的。这里我们希望大家 能够坚持一下,虽然刚开始使用英文版本会不习惯,但是多用几次以后就会习惯了,其实 Quartus II 软件的使用是很简单的,并没有大家想象中的那么可怕。学习 Quartus II 软件就像我们学习 Word、Excel 和 PPT 这些软件一样,刚开始使用的时候,虽然很多功能我们都不知道,也不理 解,但是这些我们不知道的功能、不理解的功能,它并不会妨碍我们正常使用软件,随着我们使 用的深入,我们用的多了也就什么都知道了,什么都理解了。 跑题了跑题了,打开软件之后,我们第一件事就是新建一个工程,在新建工程中,我们可以 通过创建工程向导来完成器件的选择,完成工具的选择,直至完成整个工程的建立。工程建立完 毕以后,我们需要新建一个 Verilog 顶层文件,然后我们将设计的代码输入到新建的 Verilog 顶 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 5 层文件中。接下来我们就可以编译整个工程了,在编译过程中,Quartus II 软件会检查你的代码, 如果代码出现错误,那么 Quartus II 软件将会给出相关提示,如果代码没有错误,那么 Quartus II 软件将会显示编译完成,编译完成后,我们还需要给工程分配管脚、配置工程。最后,我们通 过下载工具将编译生成的.sof 文件下载至开发板完成整个开发流程。在这里,我们只是简单的介 绍了一下上述的流程图,目的是为了让大家对每个流程做到心中有数,接下来我们将会对每个流 程进行详细的操作演示,一步步、手把手带领大家学习使用 Quartus II 软件。 §1.3 Quartus II工程实战 1.3.1 新建工程 下面我们就来创建一个新工程。在创建工程之前,我们建议大家在硬盘中专门建立一个文件 夹专用于存储自己的 Quartus II 工程,这个工程目录的路径名应该只有字母、数字和下划线,以 字母为首字符,且不要包含中文和其他符号。(想要成为一个优秀的嵌入式工程师,首先要养成 一个良好的习惯)。创建好了我们的专属文件夹后,我们便可以打开我们的开发工具,这里我们 使用的开发工具是 Quartus II 13.1 版本软件,还没有安装软件的请参考我们的《软件安装指导手 册》,这里我们就不在详细介绍了。双击计算机桌面上的 Quartus II 13.1 (64-bit)图标(如果安装 的是 32 位程序应选择 Quartus II 13.1 (32-bit)图标),打开 Quaruts II 软件,Quartus II 软件主 界面如图 1.3 所示。 图 1.3 Quartus II 软件主界面 第一次打开软件,通常默认由菜单栏、工具栏、工程文件导航窗口、编译流程窗口、主编辑 窗口以及各种输出打印窗口组成。在菜单栏上选择【File】→【New Project Wizard…】来新建 http://www.fpga.gs/ 6 软件工具篇 §1 一个工程。这里要注意不要把【New…】误认为【New Project Wizard…】,新建工程向导说明 页面如图 1.4 所示。 图 1.4 新建工程向导说明页面 在“Introduction”页面中,我们可以了解到在新建工程的过程中要完成哪些工作,这些工作 主要包括以下 5 点: (1) 指定项目目录、名称和顶层实体; (2) 指定项目设计文件; (3) 指定该设计的 Altera 器件系列; (4) 指定用于该项目的其他 EDA 工具; (5) 项目信息报告; 接下来我们可以单击下面的【Next>】按钮进入图 1.5 所示页面。 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 7 图 1.5 新建工程向导的文件名和路径设置 图 1.5 第一栏用于指定工程所在的工作库文件夹;第二栏用于指定工程名,工程名可以取任 何名字,这里我们建议大家直接使用顶层文件的实体名作为工程名;第三栏用于指定顶层文件的 实体名。这里我们设置的工程路径为 E:/Zircon_Verilog/Verilog_First 文件夹,工程名与顶层文 件的实体名同为 Verilog_First。在这里大家需要注意的是:不同的设计项目最好放在不同的文件 夹中,而同一工程的所有文件都必须放在同一文件夹中。 文件名和路径设置完毕后,我们单击【Next】按钮,进入下一个页面,如图 1.6 所示。 http://www.fpga.gs/ 8 软件工具篇 §1 图 1.6 文件添加页面 在该页面中,我们可以添加已有的工程设计文件(Verilog 或 VHDL 文件),由于我们这里是 一个完全新建的工程,没有任何预先可用的设计文件,所以我们不用添加,直接单击【Next】按 钮,进入选择器件页面。 1.3.2 选择器件 这里我们要根据实际所用的 FPGA 来选择目标器件,由于我们这里用的开发板主芯片是 Cyclon IV E 系列的“EP4CE10F17C8”,所以这里我们要选择和开发板主芯片一样的型号,如 图 1.7 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 9 图 1.7 器件选择页面 在图 1.7 右边选项区域中,我们可以通过指定封装、引脚数以及器件速度等级来加快器件查 找的速度。在“Available devices”中,我们还可以看到该器件的内核电压,逻辑资源,用户 I/O 等一些器件信息,接着我们再单击【Next】按钮进入 EDA 工具选择页面。 1.3.3 选择工具 如图 1.8 所示,在“EDA Tool Settings”页面中,我们可以设置工程各个开发环节中需要用 到的第三方 EDA 工具,比如:仿真工具 Modelsim、综合工具 Synplify。由于本实例着重介绍 Quartus II 软件,并没有使用任何的 EDA 工具,所以我们这里将所有选项更改为。 http://www.fpga.gs/ 10 软件工具篇 §1 图 1.8 新建工程向导的 EDA 工具设置 工具选择完毕后,我们可以单击【Next>】进入图 1.9 所示页面。 图 1.9 新建工程配置信息报告页面 从该页面中,我们可以看到工程文件配置信息报告,接下来我们点击【Finish】完成工程的 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 11 创建。 1.3.4 输入设计 下面我们就来创建工程顶层文件,我们在菜单栏中找到【File】→【New】,然后点击弹出如 图 1.10 所示的新建文件窗口,在这里可以选择各种需要的设计文件格式。可以作为工程顶层设 计文件的格式主要在“Design Files”类别下,选择“Verilog HDL File”并单击 OK 按钮完成文 件创建。(小提示,创建工程顶层文件我们还可以通过工具栏来创建,具体使用方法就不给出图 片,读者可以用鼠标放置在工具栏的图标上会显示出其图标所标示的其功能,工具栏使用方法和 word 功能相同,我们还可以通过快捷键【Ctrl】+【N】来创建工程顶层文件)。 图 1.10 创建顶层文件 在主编辑窗口中,出现了一个新建的空白的可编辑文件,接着在该文件中输入实现实验功能 的 Verilog 代码,如图 1.11 所示。 http://www.fpga.gs/ 12 软件工具篇 §1 图 1.11 在顶层文件中输入代码 下面我们给出图 1.11 中的程序代码,如代码 1.1 所示。 代码 1.1 Verilog_First 源代码 1 module Verilog_First 2( 3 //输入端口 4 CLK_50M,RST_N, 5 //输出端口 6 LED1 7 ); 8 9 //--------------------------------------------------------------------------- 10 //-- 外部端口声明 11 //--------------------------------------------------------------------------- 12 input CLK_50M; //时钟的端口,开发板用的 50M 晶振 13 input RST_N; //复位的端口,低电平复位 14 output LED1; //对应开发板上的 LED 15 16 //--------------------------------------------------------------------------17 //-- 内部端口声明 18 //--------------------------------------------------------------------------- 19 reg [26:0] time_cnt; //用来控制 LED 闪烁频率的定时计数器 20 reg [26:0] time_cnt_n; //time_cnt 的下一个状态 21 reg led_reg; //用来控制 LED 亮灭的显示寄存器 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 13 22 reg led_reg_n; //led_reg 的下一个状态 23 24 //设置定时器的时间为 1s,计算方法为 (1*10^6)us / (1/50)us 50MHz 为开发板晶振 25 parameter SET_TIME_1S = 27'd50_000_000; 26 27 //--------------------------------------------------------------------------- 28 //-- 逻辑功能实现 29 //--------------------------------------------------------------------------- 30 //时序电路,用来给 time_cnt 寄存器赋值 31 always @ (posedge CLK_50M or negedge RST_N) 32 begin 33 if(!RST_N) //判断复位 34 time_cnt <= 27'h0; //初始化 time_cnt 值 35 else 36 time_cnt <= time_cnt_n; //用来给 time_cnt 赋值 37 end 38 39 //组合电路,实现 1s 的定时计数器 40 always @ (*) 41 begin 42 if(time_cnt == SET_TIME_1S) //判断 1s 时间 43 time_cnt_n = 27'h0; //如果到达 1s,定时计数器将会被清零 44 else 45 time_cnt_n = time_cnt + 27'h1;//如果未到 1s,定时计数器将会继续累加 46 end 47 48 //时序电路,用来给 led_reg 寄存器赋值 49 always @ (posedge CLK_50M or negedge RST_N) 50 begin 51 if(!RST_N) //判断复位 52 led_reg <= 1'b0; //初始化 led_reg 值 53 else 54 led_reg <= led_reg_n; //用来给 led_reg 赋值 55 end 56 57 //组合电路,判断时间,控制 LED 的亮或灭 58 always @ (*) 59 begin 60 if(time_cnt == SET_TIME_1S) //判断 1s 时间 61 led_reg_n = ~led_reg; //如果到达 1s,显示寄存器将会改变 LED 的状态 62 else 63 led_reg_n = led_reg; //如果未到 1s,显示寄存器将会将保持 LED 的原状态 64 end 65 http://www.fpga.gs/ 14 软件工具篇 §1 66 assign LED1 = led_reg; 67 68 endmodule //最后,将显示寄存器的值赋值给端口 LED1 这里我们可以将上述源代码直接复制到主编辑窗口源代码,按快捷键【Ctrl】+【S】或选择 【File】→【Sava】,则会弹出一个对话框提示输入文件名和保存路径,默认文件名会和所命名 的“module 名称一致,默认路径也会是当前的工程文件夹,如图 1.12 所示。通常也都采用默认 设置进行保存即可。 图 1.12 顶层文件路径保存图 1.3.5 编译工程 至此,工程创建和设计输入工作已经完成。为了验证代码是否正确,我们可以双击【Flow】 →【Compilation】下的【Analysis & Synthesis】,来验证基本语法是否正确,也可以先对整个工 程进行一次全编译,既可以选择工具栏【Processing】→【Start Compilation】进行全编译,也 可以在“Task”→“Compilation”中双击【Compile Design】进行全编译,这里我们推荐大家 使用全编译。编译如果没有错误,通常前面的问号会变成对勾,表示编译通过,如图 1.13 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 15 图 1.13 编译过程图 最后,我们可以查看打印窗口的“Processing”里的信息,如图 1.14 所示。包括各种“Warning” 和“Error”。“Error”是不得不关注的,“Error”意味着代码有语法错误,后续的编译将无法继 续;而“Warning”则不一定是致命的,很多时候“Warning”中暗藏玄机,很多潜在的问题都 可以从这些条目中寻找蛛丝马迹。如果设计者确认这些“Warning”符合设计要求,或者说对我 们的设计没有影响,那么我们也可以忽略它,不用死磕这些 Warning。 图 1.14 Messages 窗口 1.3.6 分配管脚 编译通过以后,接下来我们就需要对工程中输入、输出端口进行管脚分配。管脚分配有两种 方法:第一种就是手动分配,我们需要对照管脚分配表将管脚输入到对应的端口中,这种方法适 用于一些少量的端口分配。第二种就是使用 Tcl 脚本文件进行管脚分配,使用这种方法我们需要 制作相应的脚本文件,这种方法适用于大量的端口分配。下面我们对这两种方法分别进行介绍。 首先我们介绍的是手动分配方法:我们可以使用菜单栏里【Assignments】→【Pin Planner】 对工程的 I/O 引脚进行分配,也可以通过工具栏打开管脚分配工具,“Pin Planner”界面如图 1.15 所示。 http://www.fpga.gs/ 16 软件工具篇 §1 图 1.15 Pin Planner 管脚分配页面 从该页面中,我们可以看到出现了三个端口分别是我们的时钟,复位和 LED,如果你打开 管脚分配页面,页面中并没有出现顶层文件的端口信号,那么我们建议大家先对整个工程执行一 次全编译。接下来我们就可以参考管脚分配表,将它们对应的引脚号输入到对应信号名的 “Location”中,如图 1.16 所示。(这里我们在啰嗦几句说一下如何输入:首先我们用鼠标点击 CLK_50M 信号名 Location 下面的空白位置,我们可以输入 PIN_E1,也可以直接输入 E1 接下 来我们回车,管脚就分配完成)。 图 1.16 管脚分配完成图 我们完成了管脚分配,就可以关闭 Pin Planner 重新全编译工程即可。对于一些比较少的管 脚可以进行手动分配,但是碰到很多或者要经常分配管脚,这种方法显然是比较繁琐。下面我们 就来介绍一下如何利用“Tcl Scripts”来进行管脚分配。 首先我们需要一个.tcl 管脚分配表。.tcl 管脚分配文件怎么获得呢,这里有两种方法:第一 种:可以利用菜单栏里的【project】→【Generate Tcl File for Project…】出现如图 1.17 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 17 图 1.17 自动生成 Verilog_First.tcl 管脚分配文件 第二种方法:打开菜单栏里【Assignments】→【Pin Planner】功能,也可以通过工具栏打 开,如图 1.18 所示,然后在编辑引脚栏里右键找到【Export】。 图 1.18 导出 Verilog_First.tcl 管脚分配文件 【Export】会帮你把你定义的管脚给导出为.tcl 文件,点击【Export】会出现如图 1.19 所示: http://www.fpga.gs/ 18 软件工具篇 §1 图 1.19 保存 Verilog_First.tcl 文件路径 这里默认的后缀是.csv 你可以选择保存类型 Tcl script file (*.tcl),点击【Export】就生成了 Verilog_First.tcl。我们可以在工程下找到 Verilog_First.tcl 以记事本方式打开来查看,如图 1.20 所示。 图 1.20 Verilog_First.tcl 文件内容 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 19 这里可以随意修改 CLK_50M,RST_N,LED1 信号所对应的管脚,也可以添加其他管脚以 供其他工程的使用,是不是方便快捷简单,不过现在还没有结束,我们有了 Verilog_First_.tcl 文 件之后,我们该怎么使用它呢,我们可以点击菜单栏里的【Tools】→【Tcl Scripts】出现如图 1.21 所示。 图 1.21 TCL Scripts 工具窗口 选中我们刚刚导出的 Verilog_First.tcl,我们可以在下面的窗口中预览 Verilog_First.tcl 的内 容。接下来我们可以点击【Run】来进行分配管脚,你可以把刚刚手动分配的管脚删除掉。利用 Tcl Scripts 尝试进行分配一次。我们这里可以看到我们的 Verilog_First.tcl 脚本文件是在我们的 工 程 下 的 , 当 我 们 打 开 其 他 工 程 就 会 看 不 到 我 们 的 Verilog_First.tcl 文 件 , 我 们 可 以 将 Verilog_First.tcl 放入到 c:/altera/13.1/quartus/common/tcl/apps/gui 文件夹中,我们再打开其他 工程就能够看到 Verilog_First.tcl 文件了。至此,我们工程的管脚就已经分配完成了,接下来我 们再来配置一下我们的工程。 1.3.7 配置工程 在我们的工程中,我们有两个地方需要配置,第一个需要配置的是没有使用的管脚,第二个 需要配置的是双用管脚。首先我们配置的是没有使用的管脚,我们在 Quartus II 软件的菜单栏中 找到【Assignments】→【Device...】,出现如图 1.22 所示页面。 http://www.fpga.gs/ 20 软件工具篇 §1 图 1.22 器件选择页面 我们可以在该页面中重新选择我们工程所使用的器件,如果我们在创建工程发现器件选择 错误,我们不需要重新创建工程,我们只需要在这里就可以进行修改。当然,这些都不是重点, 重点是我们找到页面中的【Device and Pin Options】按钮,并点击打开,我们在打开的页面中 找到【Unused Pins】并点击,如图 1.23 所示页面。 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 21 图 1.23 不使用的管脚设置为“As input Tri-stated” 在该页面中,我们就可以设置不使用的管脚的状态,这里我们将不使用的管脚设置为“As input Tri-stated”。没有使用的管脚配置完成了以后,我们点击左侧的【Dual-Purpose Pins】 则会出现如图 1.24 所示也。 http://www.fpga.gs/ 22 软件工具篇 §1 图 1.24 双用的管脚设置成 I/O 在该页面中,我们就能够配置双用的管脚,这里我们将双用的管脚全都设置为“Use as regular I/O”。其余的设置我们保持默认配置就可以了,至此,我们就完成了整个工程的配置。 1.3.8 下载程序 我们分配完了管脚、配置完了工程之后,我们需要对整个工程进行一次全编译,编译完成后, 我们就可以给开发板下载程序,来验证我们的程序能否正常运行。我们在工具栏上找到 【Programmer】按钮或者选择菜单栏【Tools】→【Programmer】,进入下载界面,如图 1.25 所示。 图 1.25 Programmer 下载窗口界面 连接好“USB Blaster”(PC 和开发板),连接好电源,按下电源开关上电。然后确认设备管 理器中通用串行总线控制器下是否有“Altera USB-Blaster”设备,如果没有则检查“USBBlaster”设备是否正确安装驱动,然后在“Programmer”下确认 Quartus II 是否识别了“USB Blaster”下载器。若没有识别,则按照如图 1.25 所示,单击左上角的【Hardware Setup】按钮 建立连接。 Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 23 图 1.26 USB-Blaster 设备连接图 前面的步骤都确定好,如图 1.27 所示,直接单击右侧的【Start】按钮就可以启动下载操作, 观察右上角的“Progress”是否会从 0 变化到 100%。 图 1.27 设备连接完成图 http://www.fpga.gs/ 24 软件工具篇 §1 下载完成之后,我们可以看到开发板上的 D1 指示灯欢快地亮了起来,如图 1.28 所示。 图 1.28 开发板运行图 这个下载程序是下载的.sof 文件,开发板断电在上电程序将会丢失。如果我们想要下载了程 序之后开发板断电在上电程序仍然存在,那么我们需要下载什么样的文件呢,第一种方法就是利 用 AS 接口下载.pof 文件,就可以实现程序掉电不丢失。由于我们开发板上没有 AS 接口,只有 JTAG 接口,那么我们需要利用另一种方法,利用 JTAG 烧写.jic 文件实现程序掉电不丢失。如 何操作呢,下面我们就来详细进行讲解。首先打开菜单栏【File】→【Convert Programming Files…】 出现如图 1.29 所示: Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 25 图 1.29 sof 文件转换 jic 文件窗口 下面我在描述一下,第一步修改“programming file type”为【JTAG Indirect Configuration File (.jic)】;第二步修改“Configuration device”为【EPCS128】(我的开发板为 M25P128);第 三步选中窗口中的“Flash Loader”点击右边的【Add Device..】按钮出现如图 1.30 所示。 图 1.30 器件选择图 选种自己开发板器件(这里我的开发板为 Cyclone IV E EP4CE10)点击 OK。第四步选中 “SOF Data”点击右边的按钮【Add file….】出现如图 1.31 所示: http://www.fpga.gs/ 26 软件工具篇 §1 图 1.31 添加 Sof 文件 找到“output_files”下面的“First_project”点击【Open】即可,最后完成所有设置界面如 图 1.32 所示。 图 1.32 最终完成设置 点击【Generate】出现如图 1.33 所示: Zircon Opto-Electronic Technology CO.,Ltd. §1 Quartus II 软件 27 图 1.33 转换成功 点击【OK】,这时.jic 文件就已经生成了。关闭“Convert Programming File”。打开菜单栏 【Tools】下的【Programmer 】,点击左边的【 Add File..】找到“output_files ”文件下的 “output_file.jic”。添加完成后发现【start】不能点击,需要在【Program/Configure】方框下面 点击打勾。如图 1.34 所示。 图 1.34 Programmer 下载窗口 这里我们还可以看到不只有“Program/Configure”可以选择,还可以选择“Verify”、“BlankCheck”、“Examine”、“Security bit”、“Erase”、“ISP CLAMP”,而这里我们必须要勾选 Program/Configure,其他的两个 Verify 和 Blank-Check 可以不勾选。简单来说,Verify 是验证 FPGA 配置芯片里的程序与烧写的文件是否一致;Blank-Check 是检查配置芯片是否为空; Examine 可将配置芯片内的内容导出成文件;Security Bit 是防止他人导出配置芯片里的文件; Erase 可以擦除器件内容;ISP CLAMP 是当你在下载程序的时候,允许每个 I/O 管脚保持静态 的状态。点击【Start】,便可下载完成。我们把开发板电源关闭,然后我们再一次打开开发板电 源,可以看到,LED 又亮了起来,如图 1.35 所示。 http://www.fpga.gs/ 28 软件工具篇 §1 图 1.35 开发板运行图 至此,我们的 Quartus II 软件就讲解完了,下面我们就来给大家讲解一下 ModelSim 软件。 Zircon Opto-Electronic Technology CO.,Ltd. ModelSim 软件 第二章 ModelSim 软件 §2.1 ModelSim软件介绍 Mentor 公司的 ModelSim 是工业界最优秀的语言仿真器,它支持 XP、Win7 和 Linux 系统, 是单一内核支持 VHDL 和 Verilog 混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk 技 术、单一内核仿真,不仅编译仿真速度业界最快、编译的代码与平台无关,而且便于保护 IP 核。 它还提供了最友好的调试环境,具有个性化的图形界面和用户接口,为用户加快调试提供强有力 的手段,它是 FPGA/ASIC 设计的首选仿真软件。 Modelsim 有几种不同的版本:SE(System Edition)、DE(Deluxe Edition)、PE(Personal Edition)和 OEM(Orignal Equipment Manufactuce,即原始设备制造商),其中 SE 是最高级 的版本,而集成在 Actel、Atmel、Altera、Xilinx 以及 Lattice 等 FPGA 厂商设计工具中的均是 OEM 版本。我们这里选择使用的是 Altera 公司提供的 OEM 版本,也就是我们常说的 ModelSim AE(即:ModelSim-Altera Edition)。下面我们给出 Altera 官方对 ModelSim AE 的介绍,如图 2.1 所示。 图 2.1 ModelSim Altera 软件介绍 (源自 https://www.altera.com.cn/products/design-software/model---simulation/modelsim- altera-software.html#note3) 从该图中我们可以看出,Modelsim Altera 是有两个版本的,一个是免费版本(ModelSim- 32 软件工具篇 §2 Altera Starter Edition);一个是收费版本(ModelSim-Altera Edition)。由于图中给出了收费版 本和免费版本的区别,所以我们就不在进一步介绍它们了,这里我们说一下,ModelSim-Altera 版软件与 ModelSim PE/DE 软件的区别,ModelSim-Altera 版软件仅支持 Altera 门级库。 ModelSim-Altera 版软件包括 ModelSim PE 的基本特性,包括了行为仿真、HDL 测试台和 Tcl 脚本。但是,ModelSim-Altera 版软件并不支持 ModelSim PE 的可选特性,ModelSimAltera 版的仿真性能要低于 ModelSim PE/DE 软件。 §2.2 ModelSim使用流程 介绍完了 ModelSim 软件,接下来我们再来介绍一下 ModelSim 使用流程。在介绍 ModelSim 的使用流程之前,我们需要对给大家说明一下仿真的两个概念,仿真一般分为前仿真与后仿真: (1) 前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是 不考虑电路门延迟与线延迟。 (2) 后仿真也就是时序仿真。是指电路已经映射到特定的工艺环境下,综合考虑电路的路径 延迟与门延迟的影响,验证电路在一定时序条件下是否满足设计构想的过程。 说完了仿真的两个概念,接下来我们在来说一说 ModelSim 的使用,ModelSim 的使用主要 分为两种情况,第一种就是通过 Quartus II 软件调用我们的 ModelSim 来进行仿真,这种情况也 就是我们通常所说的自动仿真。第二种情况就是直接打开 ModelSim 进行仿真,不经过我们的 Quaruts II 软件,这种情况也就是我们通常所说的手动仿真。不管是自动仿真还是手动仿真,它 们的都遵循以下 5 个步骤: (1) 新建工程。 (2) 编写 Verilog 仿真文件。 (3) 编写 Testbench 仿真文件。 (4) 开始功能仿真。 (5) 开始时序仿真。 当我们执行了仿真以后,ModelSim 软件会根据我们的设计文件和仿真文件生成波形图,最 后,我们观察波形并判断设计的代码功能是否正常。前仿真完成以后,接下来我们就需要进行后 仿真了,后仿真与前仿真的步骤大体相同,只不过中间需要添加仿真库、网表和延时文件等步骤。 这里我们要注意的是,对于时序要求不严格的小规模设计,我们一般只进行功能仿真。 §2.3 ModelSim工程实战之自动仿真 说完了 ModelSim 的使用流程,接下来我们将会对每个流程进行详细的操作演示,一步步、 手把手带领大家学习使用 ModelSim 软件。首先我们讲解的 ModelSim 自动仿真,所谓自动仿 真,其实是在 Quartus II 中调用 ModelSim 软件来进行仿真,在调用过程中,Quartus II 会帮我 们完成 ModelSim 中的所有操作,我们只需要分析最后的仿真结果。下面我们就以上章节中我们 创建的 Quartus II 软件工程为例,进行仿真。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 33 2.3.1 检查 EDA 路径 首先我们打开之前的 Quartus II 工程,如图 2.2 所示。 图 2.2 Quartus II 软件界面 在该页面中,我们在菜单栏中找到【Tool】→【Options】按钮并打开,在打开的页面左侧, 我们找到“EDA Tool Options”点击,如图 2.3 所示页面。 http://www.fpga.gs/ 34 软件工具篇 §2 图 2.3 EDA Tool Options 工具设置页面 在该页面中,如果你安装的是 ModelSim 软件,那么你需要在 ModelSim 路径中进行设置, 这 里 我 们 使 用 的 ModelSim-Altera , 所 以 我 们 将 ModelSim-Altera 路 径 设 置 成 了 C:\altera\13.1\modelsim_ase\win32aloem。这里需要大家注意的是一定要选择 modelsim_ase 文件夹中的 win32aloem,不要选择 modelsim_ae 文件夹中的 win32aloem。还记得我们前面说 的么?ae 是收费版本,我们是不能使用的,这里的 ase 免费版本也是可以满足我们的设计的。 路径设置完成以后,我们点击【OK】返回我们的 Quartus II 软件界面。 2.3.2 选择 EDA 工具 我们在 Quartus II 软件页面的菜单栏中,我们找到【Assignments】→【Settings】按钮并 打开,在打开的页面左侧我们找到“EDA Tool Settings”点击,如图 2.4 所示页面。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 35 图 2.4 EDA Tool Settings 选择工具页面 还记得我们之前创建工程的时候,由于在 Quartus II 软件中我们没有用到仿真,所以我们将 这里设置成了“None”,现在我们需要用到仿真工具了,我们需要在这里将 Simulation 设置成 “ModelSim-Altera、Verilog HDL”。设置完成之后,我们点击【OK】返回 Quartus II 软件页 面中。 2.3.3 编写仿真文件 我们在 Quartus II 软件页面的菜单栏中,我们找到【Processing】→【Start】→【Start TestBench Template Writer】按钮并点击,这时 Message 窗口中会显示,如图 2.5 所示。 图 2.5 Message 窗口信息提示 我 们 可 以 在 该 图 中 看 到 , 这 么 一 条 信 息 : Generated Verilog Test Bench File E:/Zircon_Verilog/Verilog_First/simulation/modelsim/Verilog_First.vt 。我们可 以 从这条信息 中 知道,Quartus II 软件自动给我们生成了一个 TestBench 模板,我们只需要在这个模板上稍作 修改就能直接使用了。我们在工程目录下找到 Verilog_First.vt 文件,我们可以用记事本打开进 行修改,也可以使用 Quartus II 软件打开它进行修改,这里我们建议还在 Quartus II 软件中进行 http://www.fpga.gs/ 36 软件工具篇 §2 修改。我们在 Quartus II 软件的菜单栏中找到【File】→【Open】按钮并打开,在对话框中找到 我们的 Verilog 文件,如图 2.6 所示。 图 2.6 打开 Verilog_First.vt 文件 打开之后,如图 2.7 所示。 图 2.7 Verilog_First.vt 文件中的内容 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 37 在该图中我们可以看到,Quartus II 软件已经为我们完成了一些基本工作,包括端口部分的 代码和接口变量的声明,我们要做的就是在这个模板里添加我们需要的测试代码(也就是我们常 说的激励)。下面我们给出修改完毕的代码,如代码 2.1 所示。 代码 2.1 TestBench 源代码 1 `timescale 1 ps/ 1 ps 2 module Verilog_First_vlg_tst(); 3 // constants 4 // general purpose registers 5 reg eachvec; 6 // test vector input registers 7 reg CLK_50M; 8 reg RST_N; 9 // wires 10 wire LED1; 11 12 // assign statements (if any) 13 Verilog_First i1 ( 14 // port map - connection between master ports and signals/registers 15 .CLK_50M(CLK_50M), 16 .LED1(LED1), 17 .RST_N(RST_N) 18 ); 19 20 initial 21 begin 22 #0 CLK_50M = 1'b0; 23 #10000 RST_N = 1'b0; 24 #10000 RST_N = 1'b1; 25 #10000000 $stop; 26 end 27 28 always #10000 29 begin 30 CLK_50M = ~CLK_50M; 31 end 32 endmodule 为了让读者能够更好的理解,这里我们就简答介绍一下 TestBench 源代码:代码的第 1 行, 表示仿真的单位时间为 1ps,精度为 1ps。想要进行仿真首先要规定时间单位,我们建议大家最 好在 Testbench 里面统一规定时间单位,不要在工程代码里定义,因为不同的模块如果时间单 位不同可能会为仿真带来一些问题,timescale 是 Verilog 语法中的不可综合语法。代码的第 2 行就是我们熟悉的部分了,其中第 5 行至第 10 行是我们的数据类型定义,这里我们可以看到 reg eachvec 是一个多余的信号,没有任何作用,我们也可以将它删除,到了第 7 行、第 8 行、第 http://www.fpga.gs/ 38 软件工具篇 §2 10 行,代码相信大家都能看的懂,不过为什么要用 reg 和 wire 类型去定义,想必大家就不一定 能够理解了。大家看,如图 2.8 所示。 Verilog模块 wire CLK_50M reg LED1 TestBench模块 reg CLK_50M wire LED1 图 2.8 TestBench 模块与 Verilog 模块 我们可以把 Testbench 看做一个模块,我们利用 TestBench 这个模块和我们的 Verilog 模 块进行数据通信,TestBench 模块中的输出信号便是我们 Verilog 代码中的输入信号,TestBench 模块中的输入信号便是我们 Verilog 代码中的输出信号。因此,在 Verilog 模块中的 reg LED1 在 Testbench 模块中就变成了 wire LED1,Verilog 模块中的 wire CLK_50M 在 Testbench 中则对 应为 reg CLK_50M。 说完了数据类型声明,接下来我们再来看第 13 行至第 18 行,这一部分就是一个模块调用, 它将我们的 Verilog 模块中的信号连接到我们的 TestBench 模块中。最后,我们再来看下第 20 行至第 32 行代码,其中第 20 行至第 26 行是信号的初始化,第 28 行至第 31 行是时钟信号的 生成。这里我们主要来讲讲#10000,#10000 表示的是延迟 10000ps(即 10ns),具体的延迟单 位,还是要看我们的 timescale 是如何设置的。至此,整个代码都介绍完了。 2.3.4 配置仿真功能 编写完了仿真文件,接下来我们需要在 Quartus II 软件中配置仿真功能,我们在 Quartus II 软件界面的菜单栏找到【Assigement】→【Settings】按钮并打开,在打开的页面中,我们找到 左侧的 Simulation 点击,出现如图 2.9 所示的页面。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 39 图 2.9 Setting 中 Simulation 选项卡 我们选中“Compile Test bench”,然后单击后面的【Test Benches】按钮,则出现如图 2.10 所示的“Test Benches”窗口(也就是图中上面的窗口),接着我们单击【New】按钮,则会出 现如图 2.10 所示的“New Test Bench Settings”窗口(也就是图中下面的窗口)。 图 2.10 添加仿真文件页面 http://www.fpga.gs/ 40 软件工具篇 §2 在该页面中,我们将 TestBench 模块名输入到“Test bench name”和 “Top level module in test bench”的编辑栏中。接着我们在“Test bench and simulation files”下拉列表框中添加 仿真文件,如图 2.11 所示,点击【Open】即可。 图 2.11 选择仿真文件页面 然后单击【Add】 按钮添加到最下面的列表中如图 2.12 所示。 图 2.12 添加仿真文件页面 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 41 完成后我们单击【OK】按钮,便可看到如图 2.13 所示的“Test benches”窗口的列表中出 现了刚才添加的仿真文件相关信息,至此,我们仿真文件添加完成了,接着我们单击【OK】按 钮,返回我们的 Quartus II 软件界面。 图 2.13 仿真文件添加完成后的 Test Benches 窗口 2.3.5 开始功能仿真 万事俱备只欠东风,经过上面这么多的操作步骤,我们终于完成了所有设置,接下来我们就 可以进行仿真了,在开始仿真之前,我们这里有一点要需要注意,我们在 Quartus II 软件中实现 的功能是 LED 闪烁,它的间隔时间是 1s,如果我们想要仿真这个功能,那么我们仿真软件运行 时间最低就是 1s。这 1s 钟在我们看来是很短很短的,不过在仿真软件看来是很长很长的,我们 的仿真软件单位可是 ps。为了便于我们仿真,这里我们需要稍微改动一下 Verilog 代码,我们需 要将 parameter SET_TIME_1S = 27'd50_000_000;修改为 parameter SET_TIME_1S = 27'd50; 也就是将我们原来的 1s 钟修改成了 1us。 修改完毕后,我们在 Quartus II 软件界面中的菜单栏中找到【Tools】→【Run Simulation Tool】→【RTL Simulation】按钮并点击,则会出现如图 2.14 所示界面。 http://www.fpga.gs/ 42 软件工具篇 §2 图 2.14 ModelSim 仿真窗口界面 在该软件启动过程中,我们不需要任何操作,它会自动完成仿真,并给出我们所需要的波形, 当波形图出现之后,我们就可以查看波形来判断设计功能是否正常了。为了方便大家更容易观察 波形,我们这里将会对 ModelSim 软件中几个常用小工具进行简单的讲解,如图 2.15 所示。 图 2.15 查看波形常用工具 前面的几个放大镜模样的工具是放大、缩小等功能,鼠标放到图标上会显示出它们的快捷键, 中间的黄色图标是用来在波形图上做标记的,后面的则是用来运行仿真,暂停仿真、重新运行等 功能。如图 2.16 所示界面,就是我们利用上述工具制作出来的。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 43 图 2.16 分析仿真波形 在该页面中,我们就配合我们的代码给大家简单的分析一下这个波形,首先我们可以看到我 们在 0ns 时间处添加了一个黄色标记,为了不让黄色标记移动,我们将这个黄色标记给锁住了, 我们还可以在它的名字处修改成我们想要表示的名称,这里我们修改为 Start,也就是仿真开始。 我们在回顾一下我们的激励信号是怎么编写的,代码如代码 2.2 所示。 1 initial 2 begin 3 #0 CLK_50M = 1'b0; 4 #10000 RST_N = 1'b0; 5 #10000 RST_N = 1'b1; 6 #10000000 $stop; 7 end 8 9 always #10000 10 begin 11 CLK_50M = ~CLK_50M; 12 end 代码 2.2 激励信号 我们对照代码,对照仿真波形,我们可以看到,首先在 0ns 处,CLK_50M 信号我们赋值为 0,我们观察波形图,CLK_50M 信号确实为低电平,接下来,我们等待 10ns,我们又给 RST_N 赋值为 0,这时大家要注意了,由于等待了 10ns,always 模块也将会执行,所以 CLK_50M 这 时等于 1。我们观察波形,果然,RST_N=0,CLK_50M=1;依次类推,直至仿真结束,看完了 激励信号,我们在来看下我们的 LED1 信号是不是 1us 翻转一次呢,大家看图 2.17 所示。 http://www.fpga.gs/ 44 软件工具篇 §2 图 2.17 分析 LED1 仿真波形信号 我们标出 LED1 信号的第一个上升沿,大家可以看到第一个上升沿的时间是 1030ns,然后 我们又标记出 LED1 信号的下降沿,大家也同样可以看到是 1050ns,1050ns-1030ns=1020ns (也即使 1.02us),似乎并不精准,这仿真太也不靠谱了吧!其实并不是这么回事,大家可以考 虑考虑。下面就是见证奇迹的时候了:我们的时钟频率是 50MHz,周期也就是 20ns,我们设置 翻转 50 次,50*20ns 刚好就是我们的 1us,但是这里有一个 bug,什么 bug 呢,0-50 其实是 51 次,51*20ns=1020ns,也就是说我们的仿真没有错,是我们搞错了。我们只要将 Verilog 程 序中的 50 改成 49,即可修复这个 bug。这也就是我们为什么要仿真,明明感觉我们写的代码很 可靠,只要一仿真就会露出马脚。下面大家在来看看这个细节图,如图 2.18 所示。 图 2.18 LED1 仿真信号的细节图 从该图中我们可以看到,CLK 发生了变化,我们的 LED1 信号也跟着发生了变化,它们是 同时发生变化的,中间是没有任何延迟。这也就很好的说明了,为什么我们说功能仿真(即,前 仿真),它是不考虑延迟的。 这里我们需要注意的是:我们修改 Verilog 程序代码和仿真文件代码(前提是不修改端口信 号),我们是可以不需要重新编译工程的,我们只要关闭 ModelSim 仿真软件,再一次点击开始 仿真即可。如果我们修改了端口的输入和输出,那么这里最好重新全编译一次,并且我们需要重 新生成仿真模板文件进行修改。至此,我们就完成了功能仿真, 2.3.6 开始时序仿真 完成了功能仿真,接下来我们就来看看时序仿真是如何操作的,我们还是回到 Quartus II 软 件界面中,在 Quartus II 软件界面中,首先,我们需要全编译一下我们的工程,这时我们打开工 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 45 程下的 Simulation/modelsim 文件夹,如图 2.19 所示。 图 2.19 工程下 modelsim 文件夹内容页面 在该页面中我们可以看到很多文件,有我们功能仿真生成的文件,还有我们时序仿真要用到 的.vo 文件(网表文件)和.sdo 文件(时延文件),有了这些文件,我们才能进行时序仿真。(如果 打开并没有找到.vo 和.sdo 文件,那么你需要重新创建工程,在选择 EDA 工具时,选择 ModelsimAltera,Verilog,创建完成后重新编译工程)。接下来我们就可以回到 Quartus II 软件界面中,我 们在菜单栏中找到【Tools】→【Run Simulation Tool】→【Gate Level Simulation】按钮并点 击,出现如图 2.20 所示页面。 图 2.20 Timing model 选择页面 这里我们可以看到有三种模式,我们使用默认的即可,点击【Run】,则会出现如图 2.21 所 示页面。 http://www.fpga.gs/ 46 软件工具篇 §2 图 2.21 ModelSim 软件仿真页面 这时,大家在来看一看 LED1 和 CLK_50M 这两个信号,如图 2.22 所示。 图 2.22 LED1 仿真信号的细节图 我们很清楚的可以看到它们并不是同时发送变化,它们之间是有延迟的。至此,我们完成了 时序仿真。 §2.4 ModelSim工程实战之手动仿真 2.4.1 新建仿真工程 在开始动手仿真之前,首先,我们需要创建一个文件夹用来放置我们的 ModelSim 仿真工程 文 件 , 这 里 我 们 就 在 之 前 创 建 的 Quartus 工 程 目 录 下 的 simulation 文 件 夹 中 创 建 一 个 manual_modelsim 文件夹。manual_modelsim 文件夹创建好以后,我们还需要将已经编写好的 Verilog 仿真文件和 Testbench 仿真文件添加至我们的 manual_modelsim 文件夹中,这里我们 就将自动仿真时用到的 Verilog_First.v 文件和 Verilog_First.vt 文件复制到 manual_modelsim 文件夹。(Verilog_First.v 文件在我们的 Quartus II 工程目录下,Verilog_First.vt 文件在我们的 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 47 Quartus II 工程目录下 simulation 文件夹下的 modelsim 文件夹中。)完成以上准备工作之后,我 们就可以打开 ModelSim-Altera 10.1d (Quartus II 13.1)软件了,这里我们需要注意的是,我们打 开的 ModelSim 软件版本是 ModelSim-Altera Starter Edition 免费版本,如图 2.23 所示。 图 2.23 ModelSim 软件界面 打开软件之后,我们在 ModelSim 软件界面的菜单栏中找到【File】→【New】→【Project】 菜单并点击打开,弹出的对话框如图 2.24 所示。 图 2.24 创建新的仿真工程对话框 我们从对话框中可以看到,Project Name(工程名)就是用来设置我们的工程名,这里我们 http://www.fpga.gs/ 48 软件工具篇 §2 将它命名为 Verilog_First,这里的命名方式,我们建议大家最好根据我们仿真的文件来进行命名, 时间久了,当我们记不得这个仿真工程是用来仿真什么的时候,我们看到这个工程名,就能够知 道它是用来做什么的了。Project Location(工程路径),可以设置工程保存的文件夹,使用者可 以根据需要把工程保存到不同的位置。这里我们将路径设置在了 E:/Zircon_Verilog/Verilog_First/simulation/manual_modelsim 文件夹中。下面这两部分是用来 设置仿真库名称和路径的,这里我们使用默认即可。设置好工程名、工程位置,我们点击【OK】 按钮,弹出如图 2.25 所示界面。 图 2.25 在创建好的工程中添加工程文件 我们可以从该图中的选择窗口中看出,它共有四种操作:Create New File(创建新文件)、 Add Existing File(添加已有文件)、Create Simulation(创建仿真)和 Create New Folder(创 建新文件夹)。这里我们选择 Add Existing File(添加已有文件),如图 2.26 所示。 图 2.26 在创建好的工程中添加已有文件 在 该 页 面 中 我 们 可 以 看 到 , 我 们 将 我 们 之 前 准 备 的 好 两 个 文 件 Verilog_First.v 和 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 49 Verilog_First.vt 添加至我们的 ModelSim 仿真工程中。添加好以后,我们点击【OK】按钮,然 后我们再关闭【Add items to the Project】对话框,如图 2.27 所示。 图 2.27 成功添加 Verilog 文件 在该图中,我们可以看出,我们成功添加了 Verilog_First.v 文件和 Verilog_First.vt。 2.4.2 编译仿真文件 添加完文件以后,接下来我们就需要编译我们的仿真文件。编译的方式由两种:Compile Selected(编译所选)和 Compile All(编译全部)。编译所选功能需要先选中一个或几个文件, 执行该命令可以完成对选中文件的编译;编译全部功能不需要选中文件,该命令是按编译顺序对 工程中的所有文件进行编译。我们可以在菜单栏【Compile】中找到这两个命令,也可以在快捷 工具栏或者在工作区中的右键弹出的菜单中找到这两个命令。下面我们单击 Compile All(编译 全部),将会出现如图 2.28 所示。 http://www.fpga.gs/ 50 软件工具篇 §2 图 2.28 代码编译完成 文件编译后 Status 列可能会有三个不同状态。除了上述的用“√”显示的通过状态,还有 两个在设计中不希望出现的状态:编译错误和包含警告的编译通过。编译错误即 Modelsim 无法 完成文件的编译工作。通常这种情况是因为被编译文件中包含明显的语法错误,这是 Modelsim 会识别出这些语法错误并提示使用者,使用者可根据 Modelsim 的提示信息进行修改。编译错误 时会在 Status 列中显示红色的“×”。包含警告的编译通过是一种比较特殊的状态,表示被编译 的文件没有明显的语法错误,但是可能包含一些影响最终输出结果的因素。这种状态在实际使用 中也较少会出现,该状态在 Status 栏中也会显示“√”,但是在对号的后面会出现一个黄色的三 角符号,这类信息一般在功能仿真的时候不会带来明显的影响,不过可能会在后续的综合和时序 仿真中造成无法估计的错误,所以出现这种状态时推荐读者也要根据警告信息修改代码,确保后 续使用的安全性。 2.4.3 配置仿真环境 我们编译完成后,接下来我们就开始配置仿真环境,我们在 ModelSim 菜单栏中找到 【Simulate】→【Start Simulation...】菜单并点击,弹出如图 2.29 所示页面。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 51 图 2.29 配置仿真功能页面 从配置仿真功能页面中我们可以看出,该页面中含有 6 个标签,它们分别是:Design、VHDL、 Verilog、Libraries、SDF 和 Others。对于这 6 个标签,我们用的最多的就属 Design、Libraries 和 SDF,这三个标签了,下面我们就来简单的介绍一下这 3 个标签,其余的标签我们一般用不 到,这里我们就不再进行介绍了。 首先介绍 Design 标签,该标签内居中的部分是 Modelsim 中包含的全部库,可展开看到库 中包含的设计单元,这些库和单元是为了仿真提供选择的,使用者可以选择需要进行仿真的设计 单元开始仿真,被选中的仿真单元的名字就会出现在下方的 Design Unit(s)位置。Modelsim 支持同时对多个文件进行仿真,可以利用 Ctrl 和 Shift 键来选择多个文件,被选中的全部文件名 都会出现在 Design Unit(s)区域。在 Design Unit(s)区域的右侧是 Resolution 选项,这里 可以选择仿真的时间刻度。时间刻度的概念类似于长度度量单位的米,在 Modelsim 进行仿真的 时候,有一个最小的时间单位,这个单位是使用者可以指定的。如最小单位是 10ns,在仿真器 工作的时候都是按 10ns 为单位进行仿真,对 10ns 单位一下发生的信号变化不予考虑或不予显 示,当测试文档有类似于#1 a=1'b1;的句子时,Modelsim 就不会考虑句中延迟。这个选项一般都 是设置在默认的状态,这时会根据仿真器中指定的最小时间刻度来进行仿真,如果设计文件中没 有指定,则按 1ns 来进行仿真。最下方的区域是 Optimization 区域,可以再仿真开始的时候激 活优化,由于我们是免费版本,很多功能都受限制,所以我们可以看到这里我们不能使用。 第二个介绍的标签是 Libraries 标签,如图 2.30 所示。 http://www.fpga.gs/ 52 软件工具篇 §2 图 2.30 Libraries 标签页面 在该页面中,我们可以设置搜索库,可以指定一个库来搜索实例化的 VHDL 设计单元。 Search Libraries 和 Search Libraries First 的功能基本一致,唯一不同的是 Search Libraries First 中指定的库会被指定在用户库之前被搜索。 第三个介绍的标签是 SDF,其内容如图 2.31 所示。 图 2.31 SDF 标签页面 SDF 是 Standard Delay Format(标准延迟格式)的缩写,内部包含了各种延迟信息,也是 用于时序仿真的重要文件。SDF Files 区域用来添加 SDF 文件,选择 Add 进行添加,选择 Modify Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 53 进行修改,选择 Delete 删除添加的文件。SDF Options 设置 SDF 文件的 warning 和 error 信 息。第一个 Disable SDF warning 是禁用 SDF 警告,第二个 Reduce SDF errors to warnings 是把所有的 SDF 错误信息编程警告信息。Multi-Source delay 可以控制多个目标对同一端口的 驱动,如果有多个控制信号同时控制同一个端口或互连,且每个信号的延迟值不同,可以在此选 项统一延迟。下拉菜单中可供选择的有三个选项:latest、min 和 max。max 即选择所有信号中 延迟最大的值作为统一值,min 即选择所有信号中延迟最小的值作为统一值,latest 则是选择最 后的延迟作为统一值。 至此,这三个标签我们就介绍完了,接下来我们在 Design 标签页面中选择 work 库中的 Verilog_First_vlg_tst 模块,然后点击【OK】就可以开始进行功能仿真了,其余标签页面中的配 置我们使用默认就可以了。 2.4.4 开始功能仿真 在仿真前,Workspace 区域一般只有 Project 和 Library 两个标签。开始仿真后,在 Workspace 区域一般会增加 sim 标签、Files 标签和 Memory List 标签。除了 Workspace 区域 会增加标签,在 MDI 窗口也会新出现一个 Object 窗口等,在 Workspace 区域中的 sim 标签选 中一个设计单元,在 Object 窗口就会出现该单元包含的输入/输出端口,如图 2.32 所示。 图 2.32 ModelSim 波形仿真页面 接下来我们在 Object 窗口中选中我们需要仿真的信号,然后点击右键,在弹出的菜单栏中 找到【Add Wave】并单击,我们会发现,我们的信号添加到了 Wave 窗口中。这时,我们可以 按快捷键 F9,也可以在 ModelSim 的菜单栏中找到【Run】按钮,点击运行就会出现我们想要 的波形,这里我们需要注意的是,默认的运行时间一次运行的是 100ps,我们可以在菜单栏中进 http://www.fpga.gs/ 54 软件工具篇 §2 行修改,也可以直接在控制台中输入命令 run 100ns,直接运行 100ns,如图 2.33 所示。 图 2.33 波形仿真 100ns 到了这里,我们就完成了手动的功能仿真,后面的工作就是分析我们仿真出的波形,由于这 部分内容和我们在自动仿真中所讲的内容完全是一样的,所以我们这里就不再进一步重复讲解 了。下面我们再来看看手动如何进行时序仿真。 2.4.5 开始时序仿真 时序仿真与功能仿真的步骤大体相同,只不过中间需要添加仿真库、网表(.vo)文件和延 时(.sdo)文件。到了这里,问题来了,仿真库、网表(.vo)文件和延时(.sdo)文件怎么获得 呢?网表(.vo)文件和延时(.sdo)文件,其实我们在自动仿真的配置仿真功能中已经生成了, 当我们配置好仿真功能之后,我们在 Quartus 进行一次全编译,这时,我们打开 Quartus 工程 目录下 simulation/modelsim 中就能够看到 Verilog_First.vo 和 Verilog_First_v.sdo 这两个文件。 我们将这两个文件复制到我们的 manual_modelsim 文件夹下。仿真库,我们需要到我们 Altera 的安装目录下,也就是 C:\altera\13.1\modelsim_ase\altera\verilog 中找到 cycloneive 文件夹, 然后我们将 cycloneive 文件夹也复制到我们的 manual_modelsim 文件夹下。万事具备,接下来 我们就可以打开我们的 ModelSim 软件,如图 2.34 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 55 图 2.34 ModelSim 软件界面 通过该图,我们可以看出,这个工程是我们之前做功能仿真的工程,当我们关闭 ModelSim 之后,我们再次打开 ModelSim 这个软件,它会自动记录上一个我们使用的工程并打开。我们就 直接在这个工程上进行更改,首先我们右键在弹出的菜单栏中找到【Add to Project】→【Existing File...】按钮并点击打开,则弹出图 2.35 所示对话框。 图 2.35 添加 Verilog_first.vo 文件 在该对话框中我们点击【Browse】,在弹出的对话框中我们找到 manual_modelsim 文件夹 下的 Verilog_First.vo,然后将 Verilog_First.vo 添加至我们的 ModelSim 仿真工程中。接下来我 们进行代码全编译,编译完成后,我们在 ModelSim 的菜单栏中找到【Simulate】→【Start Simulation...】按钮并点击打开,我们打开 Libraries 标签,将仿真库添加至配置仿真环境中,如 图 2.36 所示。 http://www.fpga.gs/ 56 软件工具篇 §2 图 2.36 添加 cycloneive 仿真库 这里我们需要注意的是,只添加一个 cycloneive 仿真库是不够的,我们还需要将我们 ModeSim 仿真库中的 altera_ver 库添加进来,如图 2.37 所示。 图 2.37 添加 altera_ver 仿真库 如果不知道需要选择哪个库,我们可以先直接运行仿真,这时候 ModelSim 控制窗口中会提 示错误信息,我们根据错误信息便能够分析出我们需要的库名,然后我们再重复上述步骤添加完 了仿真库,接下来我们在 SDF 标签页面中添加 Verilog_First_v.sdo 文件,如图 2.38 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 57 图 2.38 添加 Verilog_First_v.sdo 文件 这里需要我们注意的是,因为的我们的实例化名是 i1,所以我们填写的是/i1。添加完成之后, 最后我们在返回 Design 标签页面中,找到 work 下的 Verilog_First_vlg_tst,如图 2.39 所示。 图 2.39 配置仿真环境页面 在该页面中,我们点击【OK】就可以开始进行时序仿真了,到了这里,后面的工作就和我 们的功能仿真是一样的了。至此,我们 ModelSim 软件的使用就讲解完了,按理说,我们下面应 该进入第三章节的 SignalTap II 软件的使用讲解,经过我们深思熟虑之后,我们决定下面将对 VWF 波形仿真进行讲解。 http://www.fpga.gs/ 58 软件工具篇 §2 §2.5 VWF波形仿真 下面我们就来介绍一下 VWF(Vector Waveform File)波形仿真,用过 Quartus II 9.0 版本 或者更早版本的朋友,也许都用过,那个时候大家都比较喜欢用 VWF 波形仿真。虽然 VWF 波 形仿真比较方便,但是它的功能不如 ModelSim 强大,VWF 波形仿真只适用于一些简单的项目, 对于一些复杂的项目,大家还是选择了 ModelSim,ModelSim 渐渐的被大家所接收,慢慢的流 行起来了。随着 ModelSim 的日益强大,VWF 曾一度被 Altera 给抛弃,不过现在不知道什么原 因,Altera 又将此功能添加了回来,下面我们就带大家一起来看一看 VWF 是怎么使用的。 首先,我们利用 Quartus II 软件打开我们之前创建的工程,如图 2.40 所示页面。 图 2.40 Quartus II 软件界面 我们在 Quartus II 软件菜单栏中找到【File】→【New】按钮并点击打开,如图 2.41 所示页 面。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 59 图 2.41 创建 VWF 仿真文件 在该页面中,我们选中“University Program VWF”,然后我们点击【OK】,出现如图 2.42 所示页面。 图 2.42 VWF 仿真页面 http://www.fpga.gs/ 60 软件工具篇 §2 在该页面中,我们在菜单栏中找到【Edit】→【Insert】→【Insert Node or Bus...】按钮并 点击,则会出现如图 2.43 所示页面。 图 2.43 添加仿真端口 在该页面中,我们可以将我们要仿真的输入和输出端口添加进来,这里我们以时钟信号为例, 将时钟信号添加至仿真页面中,首先,我们点击该页面中的【Node Finder...】,则会出现如图 2.44 所示页面。 图 2.44 添加时钟信号 完成上面的 4 步操作,我们点击【OK】,如图 2.45 页面。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 61 图 2.45 时钟信号添加完成的 VWF 仿真页面 在该页面中,我们可以看到 CLK_50M 时钟信号已经被我们添加进来了,接下来我们利用 同样的方法将 RST_N 和 LED1 信号也添加进来,这里要注意的是,在添加 LED1 信号的时候, 我们要记得将 LED1 信号类型改为输出,添加完成之后,如图 2.46 所示。 http://www.fpga.gs/ 62 软件工具篇 §2 图 2.46 所有信号都添加完成的 VWF 仿真页面 添加完了信号,接下来我们就需要设置一下仿真时间,在 VWF 中,仿真时间有两项可以设 置,第一个是网格之间的时间,第二个是仿真时间的总长度,默认的网格之间的时间是 10ns, 仿真时间的总长度是 1us,这里我们就将仿真时间的总长度设置为 10us。我们在 VWF 仿真页面 的菜单栏中找到【Edit】→【Set End Time...】按钮并点击,则会出现如图 2.47 所示页面。 图 2.47 设置仿真时间总长度的大小 在该页面中,我们将原来的 1us 改成 10us 即可,在这里我们需要注意的是,由于 VWF 功 能并不强大,所以它所能设置的时间是有限制的,它的时间范围被限制在 10ns~100us。设置好 了仿真时间,接下来我们就需要给我们的输入信号赋值,我们选中 CLK_50M 时钟,然后我们可 以在工具栏中选择 Overwrite Clock,也可以在菜单栏中找到【Edit】→【Value】→【Overwrite Clock】按钮并点击打开,则弹出如图 2.48 所示页面。 图 2.48 产生时钟信号页面 在该页面中我们设置了 50MHz 和占空比 50%的一个时钟信号,设置完成以后,我们点击 【OK】,这时,我们的 CLK_50M 信号便有了波形。然后我们在选中 RST_N 信号,利用同样的 方法将 RST_N 设置为高电平,如图 2.49 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §2 ModelSim 软件 63 图 2.49 完成输入信号赋值 接下来我们就可以进行仿真了,我们找到菜单栏中的【Simulation】→【Run Functional Simulation】按钮并点击,则弹出如图 2.50 所示页面, 图 2.50 保存 Waveform.vwf 文件对话框 在该对话框中,我们选择【Yes】按钮,在弹出的对话框中我们直接点击保存即可,这时, 程序开始进行仿真,仿真完成之后则弹出如图 2.51 所示页面。 http://www.fpga.gs/ 64 软件工具篇 §2 图 2.51 Waveform.vwf 仿真结果 至此,我们就完成了 VWF 波形仿真,后面的工作和 ModelSim 一样,根据波形图来分析我 们的代码功能。当然,我们还可以使用 VWF 波形进行时序仿真,我们只需要在菜单栏中找到 【Simulation】→【Run Timing Simulation】按钮打开即可自动实现时序仿真。至此,有关 ModelSim 软件的内容,我们就讲解完了,接下来我们讲解的是 SignalTap 系统调试软件。 Zircon Opto-Electronic Technology CO.,Ltd. SignalTap II 软件 第三章 SignalTap II 软件 §3.1 SignalTap II软件介绍 SignalTap II 全称 SignalTap II Logic Analyzer 是第二代系统级调试工具,SignalTap II 是 一款功能强大且极具实用性的 FPGA 片上 debug 工具软件,可以捕获和显示实时信号,观察在 系统设计中的硬件和软件之间的互相作用。SignalTap II 逻辑分析仪基本上模拟了外部逻辑分析 仪的很多功能。它再设定的采样时钟上升沿对片内内部信号数据进行采样,采集并存储。这样, 能够在系统正常工作时实施检测深埋在器件中的设计信号。Quartus II 软件可以选择要捕获的信 号、开始捕获的时间,以及要捕获多少数据样本。还可以选择时间数据从器件的存储器块通过 JTAG 端口传送至 SignalTap II,还是至 I/O 引脚以供外部逻辑分析仪或示波器使用。将实时数 据提供给工程师帮助 debug。 传统的 FPGA 板级调试流程,是由外接的逻辑分析仪连接到 FPGA 的控制管脚,然后将内 部信号拉到控制管脚上,进行板级调试,这种方法的缺点有很多,首先第一个就是你需要一个外 接的逻辑分析仪,逻辑分析仪相对来讲一般都比较昂贵,当你有了外接的逻辑分析仪以后,对于 简单的一些测试,只需要几个管脚的时候,我们还是游刃有余,但是对于一个复杂的测试,有着 几十的管脚的时候,我们使用外接的逻辑分析仪就比较繁琐了。 SignalTap II 逻辑分析仪克服了以上所有的缺点。SignalTap II 借用了传统逻辑分析仪的理 念以及大部分的功能,将这些功能植入到 FPGA 设计当中,编程后存放在电路板的目标器件当 中,它使用可用的 FPGA 资源来构成嵌入式逻辑分析仪,它不需要多余的 I/O 节点、也不需要 电路板走线或者探点,当然更不需要外部的逻辑分析仪的花费,它集成在 altera 公司提供的 FPGA 开发工具 Quartus II 中。 §3.2 SignalTap II使用流程 介绍完了 SignalTap II 软件,接下来我们再来介绍一下 SignalTap II 使用流程。SignalTap II 使用流程如图 3.1 所示。 68 软件工具篇 §3 FPGA 设计 加入 Signaltap II Instance(s) 器件编程 运行逻辑分析仪 配置 查看、分析 并使用数据 定义触发条件 否 发现问题 编译 (如果需要) 是 结束 图 3.1 SignalTap II 软件的使用流程 从 SignalTap II 软件的使用流程图中,我们可以看出,首先我们需要创建一个 SignalTap II 逻辑分析仪文件,创建好了逻辑分析仪文件以后,我们还需要在逻辑分析仪文件中完成以下三个 步骤: 第一步:我们要选择监测信号; 第二步:我们要配置采样属性; 第三步:我们要定义触发条件。 完成了这三步以后,我们就需要返回到 FPGA 工程中进行一次全编译。当编译好了以后, 我们就可以将生成的.sof 文件下载至我们的开发板,下载完成之后,我们就可以通过 SignalTap II 软件进行调试和分析了。这里需要我们注意的是,如果我们想要更换监测信号或者是重新设定 采样缓冲的属性,那么我们就要重新编译工程。如果我们想要更改触发条件,那么我们是不需要 重新编译工程就可以实现的。说完了 SignalTap II 软件的使用流程,接下来我们就一步步、手把 手带领大家学习使用 SignalTap II 软件。 §3.3 SignalTap II功能介绍 在开始进入 SignalTap II 工程实战之前,我们这里先来简单的介绍一下 SignalTap 的几个功 能,如图 3.2 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 69 图 3.2 SignaTap II 软件界面 从 SignaTap II 软件界面中我们可以看出,它主要有 7 个功能窗口分别是:例化管理、节点 列表、触发条件、信号配置、Jtag 配置、数据日志和分层显示。接下来我们就来对这 7 个功能 分别进行介绍。 3.3.1 例化管理 首先我们先来看看第一个例化管理器,例化管理器包括各种控制和指示器,用于单个或者多 个 SignalTap II 例化。如图 3.3 所示。 图 3.3 Instance Manager 窗口 在例化管理器高亮显示的例化或者上电触发器是正在工作的例化。改变 SignalTap 文件窗 口中其他区域的设置只影响正在工作的例化。切换到未工作的例化时,在例化管理器中双击例化, 或者使用 SignalTap 文件窗口最底部的 instance 标签。要迅速建立新例化时,在例化管理器中 右键点击任意区域,选择 create new instance。点击例化名称就可以重新命名例化。 对于每个 例化,例化管理器指示例化当前的状态,估算(或者实际计算)例化使用的资源。对于逻辑分析 器当前的设置,如果设计无法适配到目标器件中,资源使用列中会出现警告消息。逻辑分析器配 置过程中的状态将一直保持为不运行,一旦逻辑分析仪开始分析并采集数据后,这就会改变。例 化管理器顶部的健康检测器只指示所有 SignalTap II 例化的状态,确定在设计运行之前,是否需 http://www.fpga.gs/ 70 软件工具篇 §3 要重新编译,将更新后的 SignalTap 例化集成到设计中。最后,靠近健康监测器的分析控制按钮 控制每个例化怎样运行,观察触发条件。下面我们在来看下例化管理器窗口中的四个按钮,如图 3.4 所示。 运行分析 运行SignalTap II,直到出现触发事件, 或者逻辑分析器停止工作;同时运行 多个选择的例化。 停止分析 停止逻辑分析器;如果没有出现触发 事件,不会传送数据。 自动运行分析 运行SignalTap II,直到逻辑分析器 停止工作,忽略触发事件。 读数据 即使没有出现触发事件,向 文件发送当前存储在缓冲中的数据。 图 3.4 运行控制的四个按钮 Run Analysis 按钮启动逻辑分析仪的触发条件检测。如果有多个逻辑分析仪例化,按住 Shift 键,选择多个例化,单击 Run Analysis,同时运行所有选择的例化。Stop Analysis 按钮正如它 的名称一样:它停止逻辑分析仪继续寻找触发条件。如果没有发生触发事件,分析停止后,并不 向 SignalTap II 文件传送数据。Autorun Analysis 按钮和 Run Analysis 按钮基本上一样,只是 逻辑分析仪完全忽略了所有触发事件设置。这是建立强制触发的主要方式。最后,Read Data 按 钮将采集到的数据从器件缓冲传送到 SignalTap II 文件。如果处于某些原因,数据并没有自动传 送,或者没有触发时间发生时,逻辑分析仪被停止,则可以使用一方式。 最后我们再来看下例化管理器窗口的工作状态消息,为了让用户能够知道逻辑分析仪在任 意点是怎样工作的,在 SignalTap II 文件窗口的例化管理器中,健康监测器显示状态消息。逻辑 分析仪的操作通常会按照这里列出的顺序进行,从未连接、为编程的器件开始、到器件编程,装 备逻辑分析仪,采集并传送触发数据。如表 3.1 所示。 消息 表 3.1 工作状态消息表 含义 未运行 未建立 JTAG 连接,或者器件没有被配置 准备好进行采集 已经建立连接;等待启动分析器 等待触发 分析器已经启动;等待出现触发事件 采集前触发数据 在采集触发事件之前,等待填充整个缓冲 采集后触发数据 触发事件已经发生;缓冲填充完成 卸载采集到的数据 从器件向 SignalTap II 文件发生数据 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 71 3.3.2 节点列表 节点列表是用于选择、观察监测的信号,如图 3.5 所示。 图 3.5 节点列表和触发条件图 信号被加入到节点列表中后,使用节点列表中每一行的 Data Enable 和 Trigger Enable 复 选框来禁用相关信号的使用。如果禁用了 Data Enable,当逻辑分析仪运行时,不会监测或者采 集相应的信号。这有助于减少逻辑分析仪所需要的存储器缓冲容量,因为,对于禁用的信号,存 储采样数据不需要存储器。被禁用的信号仍然可以用作部分触发条件定义。如果禁止了 Trigger Enable,相应的信号不能用作部分触发条件定义。这有助于减少逻辑分析仪所使用的逻辑资源。 针对数据或者触发禁用了信号后,在例化管理器中更新资源使用估算器,以指示通过修改所节省 的逻辑和存储器资源。我们在可以展开加入到 Node 列表中的总线组,以改变组中每一信号的设 置。即使信号不是总线的组成部分,你也可以在 Node 列表中建立定制组。选择你希望分组的信 号,右键点击它们,选择 Group。 对逻辑分析仪的某些改动会要求重新编译,为防止无意出现这类改动,可以锁定 Setup 标 签。如图 3.6 所示。 图 3.6 Lock mode 图 allow trigger condition changes only(只允许触发条件的变化)、allow incremental route changes only(只允许增量路径的变化)锁定允许简单的改动,例如改变基本触发所需的信号状 http://www.fpga.gs/ 72 软件工具篇 §3 态,但是防止要求重新编译的改动,例如,在基本触发和高级触发之间进行切换等。锁定的设置 以灰色表示。有需要进行重新编译的设置改动时,随时可以禁用锁定功能。 说完了节点列表,接下来我们再来看下我们的信号是如何添加到节点列表中的。在 Node List (节点列表)中双击空白区域,打开 Node Finder(节点发现器)。如图 3.7 所示。 图 3.7 节点发现器图 Node Finder(节点发现器)里面会提供不同的 Filer(过滤器),Filer 里面有十多种不同的 选项,在做逻辑分析仪采样节点添加的过程中,推荐使用专用节点过滤器 SignalTap II:presynthesis(预综合)和 SignalTap II:post-fitting(后适配)。 SignalTap II:pre-synthesis(预综合)过滤器列出了工程分析和细化后的可用信号。分析 和细化是综合过程的第一步。它针对语句是否正确来分析你的设计文件,建立工程层次。采用与 综合过滤器选择要提取的信号,这与直接在设计文件中建立 SignalTap 链接相类似。分析和细化 的时间并不长,所以,这是从你的设计中提取信号较快的一种方式。SignalTap II 文件中加入的 任何与综合信号都可以用于基本和高级触发条件。当与综合信号被加入到 SignalTap II 节点列表 中时,它通常以黑色文本显示。 节点发现器中另一个特殊的过滤器是 SignalTap II:post-fitting(后适配)。后适配过滤器列 出了综合和适配完成并进行相关优化后的可用信号。存在可用布线通道时才能够实现从 SignalTap 到后适配节点的链接。很容易通过名称来找到后适配节点,它再节点列表中以蓝色文 本标出。 如果以前曾编译过含有逻辑分析仪的设计,由于已经修改了源代码或者进行了设计优化,有 可能无法再使用提取的信号。如果出现这种情况,将在节点列表中以红色文本显示信号名。在采 用 SignalTap II 成功编译工程之前,必须去掉以红色表示的信号或者替换它。 如前所述,建议使用节点发现器中特殊的 SignalTap II 过滤器或者技术映射查看器中的价差 探测功能。使用这些方法,可以确保能够提取所选择的节点,意味着节点是能够提取的。节点发 现器中的后适配过滤器只显示能够提取的节点,它包括寄存器端口和组合逻辑端口,以及这些逻 辑的布线资源。后适配网表中的某些节点是完全不能提取的。这包括输出引脚,构成承载链的信 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 73 号,JTAG 接口信号以及加密 IP 中的节点。你可能不认为输出引脚是不能提取的。但是,由于 没有从器件 I/O 单元连回器件的直接布线通道来连接 SignalTap,因此,输出引脚被认为是无法 提取的。仍然可以提取输出引脚,但是要找到驱动输出的输出信号。 3.3.3 触发条件 节点列表的最右侧是触发条件列。每一列表示一个触发条件。对于一个 SignalTap II 例化, 有 10 个不同的条件。基本触发器是最简单的触发类型,使用触发条件列来建立它。基本触发是 触发条件列中所有触发使能信号简单的布尔 AND。对于节点列表中的每一信号或者信号组,右 键点击列表中的一个单元,选择一个选项,设定触发出现时的状态或者转换方向。如图 3.8 所示。 图 3.8 基本触发条件 一次可以设置组中所有信号的条件或者直接点击进行数值修改,你可以按照任何需要的进 制来为信号输入一个数值,例如二进制或者十六进制。设置了一列中的数值后,当所有触发使能 信号在采样时钟的上升沿同时位于设定的设置时,将会出现触发。触发条件列中一个额外的特性 是,不需要重新编译就能够禁用任何触发条件。建立多个触发条件后,以后你可以在调试过程中 决定不使用逻辑分析仪来监测这一条件,这是因为,你的设计中不会出现这一条件,关掉触发条 件列顶部的复选框就可以禁止该条件触发。 通常需要简单地采集信号数据,而不需要等待触发时间发生。这称为强制触发,没有等待触 发时间发生而强制逻辑分析仪去采集数据。在某些外部测试设备上,有时会保留专门进行这一操 作的按钮。强制触发更适用于顺序触发流程,这是因为对这种流程的控制较少。你可以采用基本 状态的流程建立定制强制触发。SignalTap II 逻辑分析仪可以执行的强制触发的方法有两种。 (1) 第一种简单地运行逻辑分析仪,立即停止它,在这一点采集数据。对此,通过触发条件 列顶部的复选框,禁用所有触发条件,如图 3.9 所示。这是非常快的方法,它不用在所 有触发条件下设置所有的信号为 Don't Care。 (2) 第二种强制触发,就是在逻辑分析仪运行中,忽略所有触发条件,在需要的时候停止, http://www.fpga.gs/ 74 软件工具篇 §3 而不是立即停止。在这一点,采集缓冲,传送到 SignalTap II 文件窗口。对此,点击例 化管理器中的 Autorun Analysis,而不是 Run Analysis。手动停止逻辑分析仪之后, 传送缓冲中的当前数据。 图 3.9 强制触发 在使用触发条件列来建立的另一类触发是高级触发。使用高级触发,你可以建立复杂的逻辑 表达式,对触发时间定义进行更好的控制。利用每一触发条件列顶部的弹出菜单,在基本触发和 高级触发之间切换,如图 3.10 所示。 图 3.10 高级触发 切换到高级触发时,在 SignalTap II 窗口中加入了一个新标签。如图 3.11 所示, 图 3.11 高级触发管理器窗口 切换到新标签,打开高级触发条件编辑器,这是定义高级触发表达式的简单图形界面,在这 个编辑器中,可以放置来自节点列表中的信号,连接逻辑定义目标,形成一个触发表达式。当编 辑器顶部定义的表达式为 true 时,发生高级触发事件。 高级触发条件编辑器主窗口顶部的结果表达式以窗口中放置的目标来表示。可以从节点列 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 75 表中拖出信号或者信号组,放到主窗口中,来定义表达式。只列出了触发使能信号,可以从目标 库列表中拖出比较或者逻辑操作符等目标。双击目标,调整该目标的设置具有白色背景的操作符, 例如大于和小于等,可以在运行是调整其设置,而不需要重新编译 SignalTap II。 当目标互相靠近放置时,它们之间会自动链接。右键点击编辑器窗口中的空白区域,会给出 其他选项,例如,缩放编辑器,自动清除目标布局,以及将目标放在显示中心位置等。编辑器非 常灵活和直观,很容易建立复杂的表达式。具体的操作将在例程中给出,这里就不在赘述了。 3.3.4 信号配置 前面已经理解了在 SignalTap 文件中信号是怎样提取的,触发条件是怎样定义的,下面看一 下 特 定 的 调 试 环 境 下 , 怎 样 配 置 SignalTap 。 这 使 用 SignalTap II 文 件 窗 口 中 的 Signal Configuration 部分来完成。在信号配置面板中,可以设定采样时钟,设置所选例化存储器缓冲 的特性,配置触发器的使用。还可以在提取信号之前或者之后配置这些选项,建立触发条件。如 果以前使用了示波器或者逻辑分析仪等外部测试设备,应该比较熟悉这里讨论的一些设置。如果 没有,也不要害怕,下面将会一个一个详细进行讲解。如图 3.12 所示。 http://www.fpga.gs/ 76 软件工具篇 §3 图 3.12 信号配置页面 (1) Clock(采样时钟) 在 SignalTap 文件窗口的信号配置面板顶部,你可以为逻辑分析仪所选的例化选择采样时 钟。使用 SignalTap 时需要进行这一步。采样时钟与外部测试设备中由测试设备产生的触发时钟 相类似。但是,对于 SignalTap,你需要在设计中选择一路信号,用作时钟。一般而言,这是被 提取信号锁在时钟域的主时钟。但这不是必须的。设计中的任何信号都可以用作时钟。与分析时 提取信号相同的方式,使用节点发现器来选择时钟信号。在采样时钟的每一上升沿采样数据,因 此,较快的时钟能够提供更好的采样分辨率。 如果在你设计的文件中,并没有设定采样时钟,那么,将把名为 auto_stp_external_clock 的默认信号作为采样时钟。由于需要时钟,但是没有设定时钟,因此,这一信号必须连接至器件 的外部时钟引脚,以便 SignalTap 使用。这一信号将出现在 Quartus II 引脚规划期的 All Pins 列 表。设定好采样时钟之后,SignalTap 才能够成功编译。如图 3.13 所示。 图 3.13 时钟信号配置页面 (2) Data(采样深度和 RAM 类型) SignalTap 为建立某些例化的存储器缓冲提供了多种选项。采样深度设置确定针对每一提取 信号,应采集多少采样。如前所述,这一数值最大可以设置为 128K 个采样。但是,针对采样深 度设置较大的数值会很快消耗尽可用的存储器资源。在例化管理器中检查资源使用估算器,确定 不会出现这种情况。注意:128 和 128K 是有区别的。 通过 RAM 类型设置,你可以设置使用哪一类型的存储器模块资源来实现 SignalTap 存储器 缓冲。通过设定 RAM 类型,你可以保留所选择的存储器类型,以便 SignalTap 使用,防止 SignalTap 使用设计可能要用到的其他存储器。这一设置只适用于有多种存储器模块类型的器件, 对于不支持者一特性的器件,这一设置将被设为 Auto,显示为灰色。 (3) Buffering type(缓冲类型) Segmented 用于设置选择在存储器中怎样实现缓冲。Buffering Type(缓冲类型)是指我们 用户怎么管理用户已经分配好的 RAM,这个类型分为两种,一种是 Circulate(循环),另一种 是 Segmented(分段)。环形是默认的,关掉复选框来选择这一选项。那么,这两种缓冲类型有 什么不同呢? 循环缓冲类型像 FIFO 一样工作。新采样的数据被不断送入缓冲,向前移位。最早的数据在 缓冲最后被移走。出现了所有定义的触发条件后,逻辑分析仪继续采集数据,并按照预先定好的 后触发数据采样量进行存储,在停止分析之前,通常要填充缓冲的剩余部分。触发之前采集的数 据成为前触发数据,而触发后采集的数据被称为后触发数据。数据中的触发位置由用户设定。设 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 77 置前触发位置会存储较少的钱触发数据,存储较多的后触发数据。中间触发位置会存储等量的前 出发和后触发数据,而对于后触发位置,存储的触发发生之前的数据要多于触发发生之后的数据。 如图 3.14 所示。 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 图 3.14 循环缓冲类型工作原理图 另外一种缓冲是分段缓冲,全部采样深度被分成一定数量、容量相同的段。分段缓冲的每一 段都像更小的环形缓冲。只设置了一个触发条件,当出现触发时,只填充一个段,而不是整个缓 冲。当再次出现触发条件时,填充后续段。设置了多个触发条件后,当重复出现最后的触发条件 时,填充后续段。通过这种方式,分段缓冲非常适合循环触发事件的数据采集,支持采集循环事 件 2 相关的数据采样,更高效的使用分段的缓冲空间。分段缓冲类型工作原理,如图 3.15 所示。 图 3.15 分段缓冲类型工作原理图 (4) Storage qualifier(存储资格) Storage qualifier 窗口如图 3.16 所示,设置用于建立存储资格。利用存储资格功能,,你可 以根据一些定制的条件,选择那些采集到的采样能够存储到缓冲中。存储资格只使用于环形,非 分段式缓冲类型。 http://www.fpga.gs/ 78 软件工具篇 §3 图 3.16 存储资格页面 存储资格相当于一个过滤器,来选择符合资格的数据,是可以存储的,不符合的将会被过滤 掉,它也是用来节省空间的。如图 3.17 所示。 触发位置 0 0 1 0 1 0 0 1 0 1 1 触发位置 0 0 1 0 0 0 1 触发位置 0 0 1 0 0 0 1 触发位置 其它的采集采样 0 0 1 0 0 0 1 1 0 1 0 图 3.17 存储资格工作原理图 存储资格设置有六种不同类型的存储资格:  Continuous(连续):是默认的设置,等价于不进行任何存储资格设置,存储所有 的采样。  Input port(输入端口):利用输入端口资格类型,可以选择一路信号,内部的或者 输入引脚上的,将其用作缓冲写使能信号。如果所选信号在采样时钟的上升沿为 高电平,将采样存储到缓冲中。当节点列表中的所选信号从高电平转换到低电平 或者从低电平转换到高电平时,转换资格禁止存储。选择了这一类型后,具有复选 框的其他列出现在节点列表中,选择要观察的信号。  Transitional(转换):当所选择的信号转换跳变时,存储采样。 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 79  Conditional(条件):可以定义一个条件,当所选信号满足条件的时候,存储才会 采样。  Start/Stop(开始/停止):当开始条件为 True 时,连续存储数据,直到停止条件为 True。  State-based(基于状态):在基于状态的触发流中,选择性的开始和停止存储。 其他存储资格设置使你能够为输入端口资格类型选择输入端口,在波形查看器中进行标记, 其中由于存储资格功能导致数据不连续,运行时随时可以禁用存储资格功能。采用这一设置,分 析过程中,你可以立即关断资格功能,而不用重新编译逻辑分析仪。但是,改变存储资格类型总 是需要进行重新编译。 (5) Trigger(触发) Trigger 窗口如图 3.18 所示,下面我们详细介绍功能选项。 图 3.18 触发页面 Trigger flow control(触发流程控制):Sequential(顺序)触发流程控制和(State-based) 基于状态的触发流程控制。 Tirgger position(触发位置):如前所述,你可以从 3 个默认设置中进行选择,在环形缓冲 中或者在分段缓冲的每一段中放置触发位置。前(12%在触发前,88%在触发后)。中(50%在 触发前,50%在触发后)。 后(88%在触发前,12%在触发后) Trigger Conditons(触发条件):我们已经了解了怎样采用节点列表中的触发条件列来建立 触发条件。但是默认情况下,只能设置 1 个触发条件。你可以使用这里显示的触发条件弹出列表, 为每个 SignalTap 例化建立 10 个触发条件。改变设置,在节点列表中加入或者去掉触发条件。 Trigger in/out(触发输入/输出):SignalTap II 可以连接外部器件,还可以使用触发输入和 触发输出特性连接其他 SignalTap II 例化。采用触发输入,可以将送入器件引脚的外部信号或者 另一个 SignalTap II 例化的触发输出作为触发条件。信号中的触发行为与触发条件 0 相似,意味 http://www.fpga.gs/ 80 软件工具篇 §3 着,它又最高优先级,必须在任何其他触发条件之前出现。使能了触发之后,建立了默认信号名 auto_stp_trigger_in_n。与前面讨论的默认采样时钟名称相似,必须在引脚规划器中将这一信号 连接至器件引脚,或者设置为 SignalTap II 另一例化的触发输出。你可以通过同样的方式来设置 输入触发信号的码型,使用码型弹出列表,将其设为基本触发条件。当出现触发时,触发输出功 能向器件引脚或者 SignalTap 的另一例化发送高电平有效或者电平有效信号。触发输出的默认 名称是 auto_stp_trigger_out_n,也必须在引脚规划器中将这一信号连接至引脚,或者设置为 SignalTap II 另一例化的触发输入信号。延时区域指示在信号到达 SignalTap II 例化之前需要多 少时钟周期来产生触发输出信号。这包括通过 SignalTap II 例化的所有延时。 3.3.5 Jtag 配置 由于 Quartus II 编程器也使用 SignalTap II 的标准 JTAG 连接来控制器工作,因此,SignalTap II 文件窗口可以用于器件编程。SignalTap II 文件窗口中的 JTAG 链配置面板提供与 Quartus II 编程器相似的控制功能。如果链接了多个器件,建立硬件连接,扫描 JTAG 链上的器件,选择链 上的器件进行编程。一旦建立 JTAG 连接后,选择从工程编译中产生的 SOF 文件,对器件编程。 可以选择任何 SOF 文件。如图 3.19 所示 图 3.19 Jtag 配置页面 可以同时调试同一扫描链上的多个器件。要做到这一点,需要多个.stp 文件,JTAG 链上的 每个器件一个。使用 Quartus II 编程器或者每个 SignalTap II 文件窗口中的 JTAG 链配置面板对 每个器件进行编程。由于 SignalTap II 文件独立于设计,不需要为每个器件打开整个设计工程。 JTAG 链配置面板还有一些其他有用的特性。除了能够设置你的编程器件,扫描 JTAG 链, 还可以使用 SOF 管理器将多个 SOF 文件附加到 SignalTap II 文件上。然后,你可以从附加的 SOF 文件列表中选择文件,采用附加的 SOF 文件,但是,SOF 管理器会指示附加的文件是否 与当前 SignalTap II 例化的设置兼容。只有 SOF 文件编译后的 SignalTap II 配置与 SignalTap II 文件窗口中当前设置相匹配时,才认为 SOF 文件时兼容的。 3.3.6 数据日志 SignalTap II 文件窗口的数据日志,如图 3.20 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 81 图 3.20 数据日志页面 数据日志部分提供了一种简便的方法来组织和实现多个配置,它保存配置,支持你通过双击 在配置之间迅速进行切换。根据需要,配置好 SignalTap II 文件窗口后,点击数据日志中的 Save to Data Log 按钮,存储当前的设置和触发条件。如果对设置进行了修改,双击前面存储的信号 设置或者触发,恢复这些设置。通过使能 Data Log 复选框,数据日志还可以自动存储采集到的 数据,这些数据显示在 SignalTap II 文件窗口的 Data 标签中。采用这一选项,你可以通过双击, 在采集到的数据组之间迅速切换,而不用将数据组导出到单独的文件中。 3.3.7 分层显示 分层显示,用来显示我们的信号处在工程的哪一层。这个大家可以自己看下,就没有什么好 说的了。如图 3.21 所示 图 3.21 分成显示页面 §3.4 SignalTap II工程实战 3.4.1 创建分析文件 我们简单的介绍完了 SignalTap II 的软件功能,接下来我们就来开始分析我们工程。首先我 们需要一个 FPGA 工程,有了这个 FPGA 工程之后,我们才能对这个 FPGA 进行调试和分析。 http://www.fpga.gs/ 82 软件工具篇 §3 这里呢,我们就以之前的 Quartus II 工程为例进行调试和分析,我们使用 Quartus II 软件打开我 们之前的 FPGA 工程,如图 3.22 所示。 图 3.22 Quartus II 软件界面 在 Quartus II 软件界面的菜单栏中,我们找到【File】→【New...】菜单并点击打开,则弹 出如图 3.23 所示页面。 图 3.23 创建分析文件 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 83 在该图中,我们选中 SignalTap II Logic Analyzer File,然后点击【OK】,则会弹出,如图 3.24 所示页面。 图 3.24 SignalTap II 软件界面 3.4.2 选择监测信号 创建好了分析文件之后,接下来我们就需要使用节点发现器添加我们想要检测的信号,这里 我们在空白区域双击,这时弹出如图 3.25 所示页面, http://www.fpga.gs/ 84 软件工具篇 §3 图 3.25 节点发现器页面 我们在节点发现器中首先将 Filer 设置为 Design Entry(all names)之后,我们再点击【List】 按钮,然后 Nodes Found 就会出现我们工程代码中的信号,然后我们将 LED1、RST_N 和 time_cnt 选中添加到右侧,我们点击【OK】,完成信号的添加,如图 3.26 所示。 图 3.26 信号添加完成图 这里我们需要注意的是,如果我们发现我们添加的信号变成了红色,那么也就是说我们的信 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 85 号不能使用。这是因为什么呢?实际使用 SignalTap II 时,会发现有些 reg 与 wire 可以观察, 有些又无法观察,这是因为 reg 与 wire 被 Quartus II 优化掉不见了,导致无法使用 SignalTap II 观察,这里有两种方法解决这个问题,第一种就是将 reg 与 wire 信号改成输出端口接入到 top module 的方式来观察 wire 与 reg,虽然可行,但老实说并不是很好的方式。第二种方法就是在 待观察的 wire 信号旁边加上/*synthesis keep*/;对于 reg 信号则加/*synthesis noprune*/或者/* synthesis preserve */两者的不同之处在于: (1) /*synthesis noprune*/避免 Quartus II 优化掉没 output 的 reg。 (2) /*synthesis preserve*/避免 Quartus II 将 reg 优化为常数,或者合并重复的 reg。 如果不知道如何添加,可以参考下面的这段代码,如代码 3.1 所示。 代码 3.1 避免 Quartus II 优化的代码范例 1 wire led_reg/*synthesis keep*/; 2 reg led_reg/*synthesis noprune*/; 3.4.3 配置采样属性 添加信号之后,接下来我们在信号配置页面中,添加采样时钟和设置采样深度,如图 3.27 所示页面。 图 3.27 配置采样属性 从配置采样属性中我们可以看出,我们的采样时钟使用的是我们的工程中的系统时钟 50MHz,采样时钟决定了逻辑分析仪的最小采样分辨率,如果你需要的精度越高,就需要高速时 钟进行采样,反之,如果你需要观测较长的时间,那么最好用低速时钟采样。我们的采样深度设 置的为 2K。采样深度决定了采样的数据量,深度越深,耗费的 ram 越多,大家可以自己权衡。 3.4.4 定义触发条件 完成了配置采样属性的设置,我们接下来就可以定义触发条件了,如图 3.28 所示, http://www.fpga.gs/ 86 软件工具篇 §3 图 3.28 定义触发条件 从该图中我们可以看出,我们这里定义的触发体检是 LED1 下降沿触发,当然我们这里也可 以不定义触发条件,当我们完成工程编译,下载分析波形的时候,再来定义触发条件也是可以的。 3.4.5 重新编译工程 完成了触发条件的定义,接下来我们就可以保存我们的分析文件,进行工程编译了,这里 我们可以在 Quartus 中进行直接全编译,也可以利用 SignalTap II 软件来进行编译,下面我们就 以 SignalTap II 软件来进行编译为例进行讲解说明,首先我们连接好下载器,然后打开 A4 开发 板的电源,我们在 Jtag 配置窗口中点击【Setup】找到我们的 USB-Blaster[USB-0],这时我们 在点击【Scan Chain】则会出现如图 3.29 所示页面。 图 3.29 Jtag 配置页面 从该图中我们可以看出,我们的下载器和开发板都已经识别,这时我们就可以点击例化管理 器窗口中的第一个按钮【Run Analysis】,则会提示如图 3.30 所示页面, 图 3.30 提示设计改变是否重新编译再进行运行 SignalTap II 软件 这时我们点击【Yes】,则会弹出如图 3.31 所示页面, 图 3.31 提示是否保存 stp1.stp 文件 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 87 同样我们也是点击【Yes】,然后在弹出的对话框中,我们选择好路径,这里我们选择的是 Quartus II 工程的根目录,我们使用默认的 stp1.stp 名称,然后点击【保存】则会弹出如图 3.32 所示页面。 图 3.32 提示是否将 stp1.stp 添加到我们的 Quartus II 工程中 我们还是点击【Yes】,这时 Quartus II 工程就会自动进行全编译,不需要我们任何操作,我 们只需要等待编译完成。 3.4.6 下载分析波形 工程编译完成后,我们可以在 Quartus 中进行.sof 文件的下载,我们也可以在 SignalTap 进 行.sof 文件的下载,这里我们就以在 SignalTap 中为例进行讲解如何下载.sof,我们返回到 SignalTap II 软件界面,在 Jtag 配置页面中找到 SOF Manager,然后我们点击【...】按钮,在 output_files 文件夹下找到我们的 Verilog_First.sof 文件,如图 3.33 所示。 图 3.33 下载 Verilog_First.sof 至 A4 开发板中 在该图中,我们已经找到了 Verilog_First.sof 文件,然后们点击第一个下载按钮,程序会自 动下载至我们的 A4 开发板中。当文件下载完成后,我们的 SignalTap II 软件界面消息提示窗口 会由红色变成灰色,这时我们就可以点击第一个按钮进行调试。当我们点击运行调试的时候,这 时 SignalTap II 消息提示窗口会变绿,紧接着则会出现如图 3.34 所示页面。 http://www.fpga.gs/ 88 软件工具篇 §3 图 3.34 SignalTap II 软件采样波形 从该图中我们可以看到,当 LED1 由高电平变成了低电平的时候我们触发了 SignalTap II 软 件,然后 SignalTap II 软件进行采样并给出波形。然后我们再来分析一下 time_cnt 等于十六进 制的 32 时,下一个时钟 LED1 就等于 0,然后我们返回到代码中进行查看可以发现,代码确实 是这么写的。接下来我们再来将触发条件更改为 RST_N 为下降沿的时候才会触发,然后我们进 行调试运行。如图 3.35 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 89 图 3.35 SignalTap II 软件等待复位按键触发 这时我们可以看到,由于 SignalTap II 软件一直等不到复位按键按下,所以它也一直不能触 发,直到我们按下复位按键之后,它便能采样到下降沿,从而进行触发。这里我们按下复位按键, 如图 3.36 所示。 图 3.36 SignalTap II 复位按键触发采样波形 http://www.fpga.gs/ 90 软件工具篇 §3 这时我们可以看到,我们的 SignalTap II 软件进行了触发,然后我们分析波形可以看到,当 复位以后,time_cnt 和 LED1 都会变成低电平,这和我们的代码是一致的。这里我们需要说明的 是,在调试结果中,我们可以更改显示的类型,比如默认显示的是十六进制,我们可以更改为十 进制、二进制等,我们还可以放大、缩小进行分析波形等,功能有很多,这里我们就不再一一进 行介绍了,后面的操作需要读者自动挖掘与体验。SignalTap 支持的基本触发条件除了由具体值 来触发,也可以由电平,边缘等等触发,大家可以试一试。如果两个或者以上的信号都设置了触 发条件,那么最终仅仅当这些条件同时满足时,采样才执行。他们之间默认是相与的关系。 前面我们已经介绍了采用 SignalTap 进行基本触发的设置方法,但我们知道这种触发条件 有很多局限性,如多信号触发默认仅能够相与,只能够选择给定的数值触发,不能将条件设置为 “如果不出现某某的时候触发”等等,所以当需要这样的特殊触发时,我们可以设置 SignalTap II 高级触发条件来满足我们的要求。下面我们将 Basic 改为 Advanced,则会弹出高级触发设置 页面,在高级触发设置页面中,我们可以在左下角的 Object Library 中看到有许多运算符、输入 和输出等。大家可以自行尝试一下。 本例中只是作为一个简单的示意,设置为当信号 time=20 时开始触发(当然,不使用高级 触发,使用基本的触发也是可以实现 time=20 时触发。)。首先,我们从“Node List”中拖入 time 信号,在“Object Library”下“Comparison Operator”中加入 equality,最后加入“Input Objects” 下的“Bus Value”,设置 Setting 为 20,这里我们使用的是默认十进制,当然我们也可以改成十 六进制。设置完成以后得到,如图 3.37 所示的触发条件。 图 3.37 高级触发条件设置页面 设置完成以后,接下来我们点击调试运行按钮,则会出现设计更改是否保存重新编译提示窗 口,我们一路点击【YES】,最后进入 Quartus II 软件自动全编译,这里我们可以在 SignalTap II Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 91 软件的右下角看到编译进度。当完成了编译,接下来我们需要在 Jtag 配置窗口进行程序的下载, 下载完成后我们点击调试运行按钮,则会出现如图 3.38 所示页面。 图 3.38 高级触发条件触发完成 我们放大波形,并且将 time_cnt 的值更改为十进制,我们可以看到,确实是在 time_cnt 等 于 20 的时候触发了。我们可以发现 SignalTap 是不是很强大,同时我们是不是感觉 SignalTap 没有想象中的那么难,它使用起来还是很简单的。至此,我们就完成了 SignalTap 的讲解。在结 束 SignalTap II 软件的讲解之前,我们有必要还要说明一点就是 SignalTap II 上电触发功能。 §3.5 SignalTap II上电触发 目前为止,我们讨论的所有触发都是运行时触发,这是因为在 FPGA 设计正常工作时,逻 辑分析仪运行并采集数据。但是,运行时触发的局限在于,不能采集器件编程之后,而在点击逻 辑分析仪 Run Analysis 按钮之前出现的事件的数据。我们是指在这期间出现的事件作为上电触 发。在这段时间中你希望采集的事件的一个例子是,Nios II 处理器或者设计中其他复位逻辑复位 时的信号活动。上电触发支持你采集这类事件。这是一个显示上电触发必要性的图形流程如图 3.39 所示。 可能错过的 触发事件 在这里监测运行 时触发事件 编译 对器件编程 手动运行 分析器 图 3.39 上电触发工作流程图 http://www.fpga.gs/ 查看、分析 并使用数据 92 软件工具篇 §3 编译了设计并对器件编程后,你可以手动运行逻辑分析仪,采集这里发生的触发事件。但是, 在器件编程后,手动运行 SignalTap II 之前,这里很有可能出现重要的触发事件。这是关键事件 周期,器件会出现对系统正常工作非常重要的事件。上电触发特性实现了这一时间段内的触发。 支持上电触发的 SignalTap II 逻辑分析仪的工作使得调试流程稍微有变化。如图 3.40 所示。 这里可能出现 上电触发 对器件编程 手动运行 分析器 手动停止 或强制触发 否 发生触发? 是 (上电或者 运行时) 查看、分析 并使用数据 结束 上电触发后的运行时触发 图 3.40 上电触发调试流程图 对器件编程后,可能会出现以前建立的上电触发条件。来自上电触发的采样数据被自动存储 到器件的存储器缓冲中。编程后,一旦可以使用 JTAG 控制,第一次手动运行逻辑分析仪。在这 一点,如果使能了上电触发,但是还没有发生,SignalTap II 将不断寻找上电触发。如果没有使 能上电触发,首次手动运行逻辑分析仪将等待支持的运行时触发条件。如果任何一种类型的触发 都没有发生,可以在这一点手动停止逻辑分析仪,如果发生了上电触发或者运行时触发,采集到 的数据被自动从器件存储器缓冲中传送出去,可以从 SignalTap II 文件的 Data 标签中查看采集 到的数据。如果哪种触发都没有发生,可以手动将缓冲中的当前数据传送到 SignalTap II 文件中, 进行分析,与前面介绍强制触发相似。如果采集到了需要的数据,那么工作过程完成。但是,使 能上电触发后,第二次运行逻辑分析仪会让 SignalTap II 等待正常的运行时触发条件。没有上电 触发时,第二次运行逻辑分析仪,只是寻找相同的运行时触发条件。基本上,采用上电触发,需 要两次运行逻辑分析仪,第一次采集上电数据,然后采集运行时数据。 实现上电触发与实现运行时触发非常相似。首先,在例化管理器中,针对 SignalTap II 例化 使能上电触发,右键点击例化名称,选择【Enable Power-Up Trigger】。不同的上电触发会与 SignalTap II 逻辑分析仪的每个例化相关。上电触发会出现在例化管理器中,作为相关的 SignalTap II 例化的子例化。如图 3.41 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §3 SignalTap II 软件 93 图 3.41 使能上电触发图 在例化管理器中使能了上电触发后,可以针对于运行时触发分开的上电触发来调整 SignalTap II 文件窗口中 Setup 标签的设置。可以同时配置 SignalTap 某一例化的上电触发和 运行时触发条件。在设置之间进行切换时,双击 SignalTap ii 例化的名称,或者双击例化管理器 中上电触发的名称。很容易找到编辑了运行时触发还是上电触发。在设置和基于状态的触发流程 标签中,运行时触发配置区为通常的白色,而上电触发配置区为浅蓝色。如图 3.42 所示。 图 3.42 上电触发配置图 配置上电触发时,与相关的运行时触发相比,你的配置选项有一些限制。这是因为上电触发 设置修改只能是那些不需要进行重新编译的设置。这包括建立和调整基本触发和高级触发条件, 以及使能或者禁止触发条件列。你还可以修改缓冲中的触发位置。所有其他设置显示为灰色,这 是因为上电触发必须使用与运行时触发相同的设置。不支持通常需要全面编译的选项,例如,从 节点列表中添加或者删除信号,在基本触发和高级触发之间切换,在环形和分段缓冲之间进行切 换等。切换回运行时触发会导致这类改动。而且,上电触发及其相关运行时触发的触发条件数必 须匹配。通过每个触发条件列顶部的复选框,可以禁用彼此之间不需要的触发条件。但是,无论 对上电触发设置进行怎样的调整,必须重新编译逻辑分析仪,以使能上电触发。当必须修改上电 触发设置时,建议使用渐进式编译,以缩短重新编译时间。 如前所述,如果使能了上电触发,SignalTap II 的工作过程会有稍有不同。器件编程后,上 电触发数据可能已经被采集到器件存储器缓冲中。要将这些数据传送到 SignalTap II 文件,点击 Run Analysis 按钮。如果发生了上电触发事件,逻辑分析仪启动并立即停止,把上电触发数据传 送给 SignalTap II 文件。如果没有发生上电触发事件,逻辑分析仪将继续运行。你可以等待一段 时间,知道上电触发发生,或者点击 Stop Analysis 按钮,如果需要,可以在这一点按钮下 Read http://www.fpga.gs/ 94 软件工具篇 §3 Data 按钮,将当前缓冲的数据传送给 SignalTap II 文件,作为强制触发。当第二次运行逻辑分 析仪时,无论是否发生上电触发时间,运行时触发都会持续工作。第一次实现上电触发特性时会 有些复杂,但是它采集到的触发时间对设计复位期间的调试问题特别有帮助。 Zircon Opto-Electronic Technology CO.,Ltd. IP 核之 PLL 第四章 IP 核之 PLL §4.1 IP核之PLL的介绍 锁相环路是一种反馈控制电路,简称锁相环(Phase Locked Loop,即 PLL)。锁相环的特 点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信 号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中, 当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出 电压与输入电压的相位被锁住,这就是锁相环名称的由来。 Altera 提供了用于实现 PLL 功能的 IP 核 ALTPLL,在这里我们需要说明的是,有关 ALTPLL 的工作原理和 ALTPLL 的组成结构,我们就不在进一步进行讲解了,我们主要讲解的是如何使 用 ALTPLL 这个 IP 核,对 ALTPLL 的工作原理和 ALTPLL 的组成结构感兴趣的朋友,可以参 考 Altera 提供的 ALTPLL IP 核的用户手册。 §4.2 IP核之PLL的配置 介绍完了 ALTPLL IP 核,接下来我们再来看一下 ALTPLL IP 核是如何进行配置的。大家 看,如图 4.1 所示是 ALTPLL IP 核的配置页面。 图 4.1 ALTPLL IP 核的配置页面 从 ALTPLL 的配置页面中,我们可以看出,想要配置一个 ALTPLL IP 核,我们需要完成以 下 5 步操作: 1、Parameter Settings(参数设置); 98 软件工具篇 §4 2、PLL Reconfiguartion(PLL 的重配置); 3、Output Clocks(输出时钟); 4、EDA(电子设计自动化); 5、Summary(总结); 4.2.1 参数设置(Parameter Settings) 首先我们先来介绍一下 Parameter Settings(参数设置),在 Parameter Settings(参数设 置)配置中,我们可以看到 4 个标签,它们分别是 General/Modes、Inputs/Lock、Bandwidth/SS 和 Clock switchover。 1、General/Modes 在图 4.1 所示的页面中,我们可以设置的有三项: 第一项 General:我们可以设置器件的速度等级,还可以设置我们的输入频率。对于器件的 速度等级,我们这里一般使用默认的就可以了,对于输入频率,由于我们的 A4 开发板使用的是 50MHz 时钟频率,所以我们这里一般设置的是 50MHz。 第二项 PLL Type:我们可以设置 PLL 的类型,在这里我们需要注意的是,不同系列的 FPGA 支持的 PLL 类型不同,一般支持一种或两种 PLL 类型,例如,Stratix 系列 FPGA 支持两种类型 的 PLL,Cyclone 系列 FPGA 仅支持一种类型的 PLL。所以我们可以看到有一些灰掉的选项是 不可以设置的,对于灰色的选项这里我们就直接忽略不在进行介绍。 第三项 Operation Mode:我们可以设置 PLL 的操作模式,ALTPLL 支持 5 种不同的时钟反 馈模式,每种模式都允许时钟乘除、相位偏移和占空比设置。  In normal mode(正常模式):PLL 反馈路径源是全局或局域时钟网络,可以最小化时 钟类型和指定 PLL 寄存器的时钟延时,还可以指定补偿的 PLL 输出。  In source-synchronous compensation Mode(源同步模式):数据和时钟信号同时到 达输入引脚。从引脚到 I/O 输入寄存器之间的时钟延时与从引脚到 I/O 输入寄存器之间 的数据延时匹配,信号可以确保在任何输入/输出使能寄存器的时钟和数据端口有相同 的相位关系。  In zero delay buffer mode(零延时缓存模式):PLL 反馈路径限制在专用 PLL 外部输 出引脚上。片外驱动的 PLL 反馈路径与时钟输入是相位对齐的,且时钟输入和外部时 钟输出之间的延时最小。  Witch no compensation(外部反馈模式):PLL 补偿到 PLL 的反馈输入,这样可以最 小化输入时钟和反馈时钟引脚之间的延时。 2、Inputs/Lock 说完了 General/Modes,接下来我们再来看下 Inputs/Lock 页面,大家看,如图 4.2 所示是 Inputs/Lock 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 99 图 4.2 Inputs/Lock 配置页面 在 Inputs/Lock 配置页面中,我们可以看到,同 General/Modes 页面一样,它也有三个设 置项: 第一项 Optional Inputs:我们可以通过这两个选项来给我们的 PLL 添加两个输入信号 areset 信号和 pfdena 信号。  areset 信号:该信号可以复位每个 PLL,芯片输入引脚或内部逻辑可以驱动该信号。 该信号为高电平时,PLL 中的所有计数器,包括门级锁定计数器都复位到初始值,清除 PLL 输出且 PLL 处于失锁状态。该信号为低电平时,PLL 重同步其输入并尝试锁定。  pfdena 信号:该信号使能或禁止 PFD 电路,禁止 PFD 时,PLL 不管输入时钟如何都 连续工作。由于 PLL 输出时钟频率不会在某时刻改变,因此可以在某可靠的输入时钟 不再可用时用该端口信号实现关闭和清除功能。默认情况下,该信号内部连接到 Vcc, PFD 电路是使能的。 第二项 Lock Output:我们可以通过下面的选项来给我们的 PLL 添加一个输出信号 locked 信号。locked 信号用于标识 PLL 相位锁定状态。在 PLL 锁定后该信号保持为高电平,失锁时该 信号保持为低电平。如果我们选择了 Enable self-reset on loss lock 选项,那么在 PLL 失锁时, 将自动复位 PLL。 第三项 Advanced Parameters:该选项用于提供 ATLPLL 高级参数生成输出文件,该选项 主要给那些知道 PLL 配置细节的用户或者非常理解高级参数,而且知道如何优化参数的高级用 户使用的。ATLPLL MegaWizard 接口不能重用生成的文件,这是因为 ATLPLL 模块的输出文 件是用高级参数定义的。Quartus II 编辑器不能改变这些文件。因此,用户设计不能从改进算法 中获得更好的设置或者改变那些 ALT PLL MegaWizard 接口在用户设计中发现的不合理设置。 3、Bandwidth/SS 说完了 Inputs/Lock,接下来我们再来看下 Bandwidth/SS 页面,大家看,如图 4.3 所示是 Bandwidth/SS 配置页面。 http://www.fpga.gs/ 100 软件工具篇 §4 图 4.3 Bandwidth/SS 配置页面 由于该页面中我们大多数选项都不可以使用,并且我们在应用中也使用不到该页面,所以我 们这里就简单的介绍一下这个页面。第一项 Spread Spectrum(扩展频谱时钟):用于减少系统 中的电磁干扰。第二项 Bandwidth(带宽可编程):用于配置 PLL 环路滤波器的属性。 4、Clock switchover 说完了 Bandwidth/SS,接下来我们再来看下 Clock switchover 页面,大家看,如图 4.4 所 示是 Clock switchover 配置页面。 图 4.4 Clock switchover 配置页面 Clock Switchove(r 时钟切换):时钟切换属性允许 PLL 在两个输入参考时钟之间进行切换。 该属性可以用于在不同频率的时钟输入之间进行切换,广泛应用于通信、存储和服务器中。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 101 ALTPLL IP 核支持两种时钟切换模式:  手动切换:用 clkswitch 信号控制时钟切换;  自动切换:PLL 监视当前使用的时钟信号,如果它停止工作或失锁,PLL 自动切换到 另外一个时钟信号(inclk0 或 inclk1)。 4.2.2 PLL 重配置(PLL Reconfiguartion) 介绍完了 Parameter Settings(参数设置)标签,接下来我们接着继续介绍第二个 PLL Reconfiguartion(PLL 重配置)标签,如图 4.5 所示是 PLL 重配置页面。 图 4.5 PLL Reconfiguartionlock 配置页面 所谓 PLL 重配置就是通过对其参数进行重新设定,实时地重新配置 PLL,使其在新的输入 时钟或者输出时钟下可以正常锁定和工作。动态配置的方式有两种: (1) 使用重配置控制器,通过更新 Mif 文件,完成重配置; (2) 使用重配置控制器,直接更改 PLL 相关参数,完成重配置。 显而易见,无论使用上面的哪种方式,都需要借助重配置控制器来实现,这个重配置控制器 是由 Altera 免费提供,我们可以在 IP 核列表中搜索 ALTPLL_RECONFIG 来找到它。这里需要 我们注意的是,对于一些比较复杂的系统,有着某些特定功能的项目应用,我们才能用到 PLL 重 配置功能。由于我们初学者基本上用不到 PLL 重配置功能,所以这部分内容,我们将在后面为 大家专门进行讲解。 4.2.3 输出时钟(Output Clocks) 介绍完了 PLL Reconfiguartionlock(PLL 重配置)标签,接下来我们接着继续介绍第三个 http://www.fpga.gs/ 102 软件工具篇 §4 Output Clocks(输出时钟)标签,如图 4.6 所示是 Output Clocks 配置页面。 图 4.6 Output Clocks 配置页面 从该页面中,我们可以看出,它主要是用于设置我们的输出时钟信号的,在该页面中,我们 可以设置 0-4,也就是 5 个输出时钟信号,每个时钟信号都可以设置时钟的频率、相位偏移和占 空比等参数。我们还可以通过两种方式进行设置时钟的频率: (1) 直接输入你想要得到的输出时钟频率; (2) 根据设置不同的乘、除参数来得到输出时钟频率; 4.2.4 电子设计自动化(EDA) 介绍完了 Output Clocks(输出信号)标签,接下来我们接着继续介绍第四个 EDA(电子设 计自动化)标签,如图 4.7 所示是 EDA 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 103 图 4.7 EDA 配置页面 从该页面中,我们可以看出,如果我们想要仿真 ALTPLL IP 核,那么我们就需要用到 altera_mf 这个仿真库。如果我们想要将此 ALTPLL IP 核用在其他的 EDA 工具上,我们可以通 过选择 Generate netlist 这个选项来生成 IP_syn.v 文件,用于其他的 EDA 工具中。这里需要注 意的是,并不是所有的第三方 EDA 工具都支持。 4.2.5 总结(Summary) 介绍完了 EDA(电子设计自动化)标签,最后,我们再来看下 Summary(总结)标签,如 图 4.8 所示是 Summary 配置页面。 图 4.8 Summary 配置页面 在该页面中,我们可以看到,该 IP 核能生成的所有文件都在该页面中,在这么多的文件中, 我们经常用到的要属 PLL_inst.v 文件了。PLL_inst.v 是我们 PLL 初始化模板。我们只要将 http://www.fpga.gs/ 104 软件工具篇 §4 PLL_inst.v 中的代码复制到我们的工程代码中,然后更改替换其中的信号,我们就可以使用该 IP 核了。至此,关于 ALTPLL IP 核的配置就讲解完了。接下来我们就来手把手带领大家创建一个 IP 核。 §4.3 IP核之PLL的应用 4.3.1 使用 Quartus II 软件创建 PLL IP 核 通过我们第一章节 Quartus II 软件的学习,现在我们使用 Quartus II 软件创建一个工程想必 已经是不在话下了。在这里呢,我们就不再给出 Quartus II 软件创建工程的详细过程,我们只给 出一些比较重要的部分。如果对 Quartus II 软件创建工程还不熟悉的朋友,可以回到我们的第一 章节再一次进行学习。 首先我们在 E 盘的 Zircon_Verilog 文件夹下创建一个用于存放我们 PLL 的工程文件夹,这 里我们起名叫 Verilog_Ip_PLL。然后我们打开 Quartus II 软件,新建一个工程,我们将工程路径 设置在 Verilog_Ip_PLL 中,然后我们给工程命名为 Verilog_Ip_PLL,接下来我们选择好器件, 设置好仿真工具,完成 Quartus II 工程的创建。 创建好了工程以后,接下来我们就来创建 PLL IP 核。我们在 Quartus II 软件的菜单栏中找 到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,弹出如图 4.9 所示页面。 图 4.9 创建 IP 核的向导页面 在该页面中,我们可以看到有三个选项,第一个是创建一个 IP 核,第二个是编辑一个已经 创建好的 IP 核,第三个是复制一个已经创建好的 IP 核。这里我们选择第一个选项,然后点击 【Next>】,进入如图 4.10 所示页面。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 105 图 4.10 选择 PLL IP 核页面 在该页面中,我们可以在 I/O 下找到 ALTPLL IP 核,也可以直接在搜索框中直接搜索 ALTPLL IP 核,我们找到 ALTPLL IP 核以后,我们选择它,然后我们还需要给 ALTPLL IP 核起一个名 称,这里我们命名为 PLL 并且选择创建的 IP 核代码为 Verilog HDL。完成这些设置以后,我们 点击【Next>】,进入如图 4.11 所示页面。 图 4.11 PLL IP 核的配置页面 看到该页面,大家有没有感觉碰到了多年不见的老朋友。通过我们之前对 PLL IP 核配置讲 解,想必大家对这个页面并不陌生。这里我们将输入时钟设置为 50MHz,然后我们直接点击 【Next>】,进入如图 4.12 所示页面。 http://www.fpga.gs/ 106 软件工具篇 §4 图 4.12 Inputs/Lock 的配置页面 为了让大家更易理解,这里呢,我们就尽可能的将 PLL IP 核配置的简单一些。在该页面中, 我们可以看到,我们去掉了 areset 和 locked 两个信号,在左侧的框图中,只剩下了一个输入时 钟 inclk0 和一个输出时钟 c0,够不够简单!完成了设置以后,我们一路狂点【Next>】,直接来 到我们的 Output Clocks 页面为止。当然,我们也可以直接点击 Output Clocks 标签,直接跳到 该页面。如图 4.13 所示。 图 4.13 Output Clocks 的配置页面 在该页面中,我们指定 c0 输出时钟为 10MHz。相位偏移为 0,占空比为 50%,完成了 c0 设置,接下来我们点击【Next>】进入 c1 页面,如图 4.14 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 107 图 4.14 clk c1 的配置页面 在该页面中,我们使能 c1 时钟信号,然后将 c1 时钟设置为 20MHz,相位偏移为 0,占空 比 50%。完成了 c1 时钟信号的设置,然后我们点击【Finish】进入最后的总结页面,如图 4.15 所示。 图 4.15 Summary 的配置页面 在该页面中,我们勾选上 PLL_inst.v 文件,然后我们点击【Finish】完成整个 IP 核的创建, 其余的页面我们使用默认设置就可以了。 创建好 IP 核以后,我们在 Quartus II 软件中创建一个 Verilog 文件,然后我们打开 Verilog_Ip_PLL 文件夹中的 PLL_inst.v 文件,将 PLL_inst.v 中的代码复制到我们的 Verilog 文 件中,经过我们代码编写,最终如图 4.16 所示页面。 http://www.fpga.gs/ 108 软件工具篇 §4 图 4.16 在 Quartus II 软件中例化 PLL 模块 从该图中我们可以看到,代码很简单,其中我们声明了二个输入信号:时钟和复位,两个输 出信号 LED1 和 LED2,我们将时钟信号赋值到 inclk0 中,我们将 LED1 赋值给 c0,将 LED2 赋 值给了 c1。接下来我们就可以编译工程、配置工程,给信号分配管脚,最后下载到 A4 开发板中 进行验证。下载完成之后,我们可以看到 A4 开发板上的 D1 和 D2 亮了起来,我们可以清楚的 看到,D1 和 D2 是常亮,并没有闪烁,奇怪了,按照我们的思考,我们输出的两个时钟它是有 高电平和低电平,为什么低电平的时候不灭呢?难道输出两个时钟都只有高电平?为了验证我 们的想法,接下来我们将使用 ModelSim 软件对该 PLL 工程进行一个仿真,来看下我们的程序 究竟是对还是错。 4.3.2 使用 ModelSim 软件仿真 PLL IP 核 通过第二章节 ModelSim 软件的学习,想必大家对 ModelSim 仿真的步骤都已经比较熟悉 了,在这里,我们就使用 ModelSim 的自动仿真,来对我们的 PLL 工程进行仿真,同 Quartus II 软件工程一样,这里呢我们也将省略掉大量的繁琐复杂的过程步骤,如果有不熟悉 ModelSim 软 件的朋友,可以回到我们的第二章节再一次进行学习。首先我们利用 Quartus II 软件生成 Testbench 模板代码,然后我们在 Testbench 模板代码的基础上进行修改代码,代码修改如图 4.17 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 109 图 4.17 Testbench 激励代码编写 从图中我们可以看到,代码很简单,首先我们将 CLK_50M 赋值为 0,然后我们让 CLK_50M 每 10ns 翻转一次,也就是说一个周期 20ns 刚好 50MHz,最后我们让仿真程序运行 1000ns 后 停止仿真。修改好 Testbench 激励代码,接下来我们将 Testbench 代码添加至 Quartus II 软件 工程的仿真配置中,如图 4.18 所示。 http://www.fpga.gs/ 110 软件工具篇 §4 图 4.18 将 Verilog_Ip_PLL.vt 文件添加至 Simulation 配置中 配置好以后,我们就可以点击 Quartus II 软件菜单栏中的找到【Tools】→【Run Simulation Tool】→【RTL Simulation】点击打开,弹出如图 4.19 所示页面。 图 4.19 ModelSim 仿真波形图 经过我们的修改和加工,我们可以很清楚的看到我们的 LED1 信号确实输出的是周期为 100ns,时钟频率为 10MHz,LED2 信号输出是周期为 50ns,时钟频率为 20MHz,也就是说, 我们的 PLL IP 核工作是正常的,既然 PLL IP 核工作是正常的,那为什么 LED 灯会常亮呢?难 道是下载到我们的 A4 开发板中就不正常了?为了验证我们的想法,接下来我们就来使用 SignalTap II 软件来进行在线调试。 4.3.3 使用 SignalTap II 软件调试 PLL IP 核 通过第三章节 SignalTap II 软件的学习,想必大家对 SignalTap II 软件的调试步骤也已经很 熟悉了,在这里,同 ModelSim 软件工程一样,这里呢我们也将省略掉大量的繁琐复杂的过程步 骤,如果有不熟悉 SignalTap II 软件的朋友,可以回到我们的第三章节再一次进行学习。首先我 们在 Quartus II 软件中创建一个 SignalTap II 调试文件,在 SignalTap II 调试文件中,我们利用 节点发现器将 LED1 和 LED2 两个信号添加至节点列表中,将 LED1 设置为上升沿触发,然后我 们配置采样时钟为 CLK_50M,将采样深度设置为 2K,如图 4.20 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §4 IP 核之 PLL 111 图 4.20 SignalTap II 软件调试界面 设置好了之后,我们重新编译工程,通过 SignalTap II 页面,我们将.sof 文件下载至开发板, 然后我们点击 SignalTap II 页面中的开始调试按钮,等待程序触发,弹出如图 4.21 所示页面。 图 4.21 LED1 和 LED2 信号在 50MHz 时钟下的采用波形图 http://www.fpga.gs/ 112 软件工具篇 §4 从该图中我们可以看出,LED1 和 LED2 信号明显是有问题的,和我们仿真出来的波形是不 一样的,我们这里怀疑有可能是 50MHz 的采样频率不够造成的,我们利用 PLL IP 核的 c3 端口 输出一个时钟频率为 300MHz 的时钟信号,然后我们又声明了一个 LED3,我们将 LED3 赋值 给我们的 c3 端口,这时我们编译一下工程,我们在 SignalTap II 软件界面中将 CLK_50M 信号 更换为 LED3,然后我们再一次进行编译,编译完成以后,我们进行调试,弹出如图 4.22 所示 页面。 图 4.22 LED1 和 LED2 信号在 300MHz 下的采用波形图 我们从图中可以看到,LED1 和 LED2 的输出波形是完美的。现在再回到我们的 LED1 和 LED2 常亮的问题,其实之所以常亮,是因为我们的时钟频率太快了。到了这里,有关我们 PLL IP 核的内容我们就讲完了,接下来我们再来看看 ROM IP 核是如何配置与应用的。 Zircon Opto-Electronic Technology CO.,Ltd. IP 核之 ROM 第五章 IP 核之 ROM §5.1 IP核之ROM的介绍 只读存储器(Read Only Memory,即 ROM),看过我们《数字电路篇》的朋友,我想大家 都不会陌生,我们在《数字电路篇》的第六章节中对 ROM 进行了详细的讲解。在这里呢,我们 就不在进一步讲解了,想要进一步了解的朋友可以回到我们的《数字电路篇》的第六章节中再一 次进行学习,下面我们简单的回顾一下,ROM 是一种存放固定信息的半导体件,ROM 中存储 的信息是制造时由生产厂家一次写入的。这种器件在正常工作时只能读出信息,而不能写入信息, 即使切断电源,器件中的信息也不会丢失。所以,ROM 通常用来存储那些不经常改变的信息。 在 FPGA 中,ROM 常用于存放系统程序、数据表、字符代码等不易变化的数据。在使用时,必 须要对 ROM 进行初始化,也就是说,要先将数据写入到 ROM 内部的存储单元中,然后系统正 常工作时,读出其中存储的数据。 同 PLL IP 核一样,Altera 也提供了用于实现 ROM 功能的 IP 核,Altera 不仅提供了单端口 的 ROM IP 核,还提供了双端口的 ROM IP 核,这里我们就以单端口 ROM IP 核为例进行讲解。 §5.2 IP核之ROM的配置 介绍完了 ROM IP 核,接下来我们来看一下 ROM IP 核是如何进行配置的。大家看,如图 5.1 所示是 ROM IP 核的配置页面。 图 5.1 ROM IP 核的配置页面 从该图中我们可以看出,想要配置一个 ROM IP 核,我们只需要完成以下三个步骤: 116 软件工具篇 §5 1、Parameter Settings(参数设置); 2、EDA(电子设计自动化); 3、Summary(总结); 5.2.1 参数设置(Parameter Settings) 首先我们先来介绍一下 Parameter Settings(参数设置),在 Parameter Settings(参数设 置)配置中,我们可以看到 3 个标签,它们分别是 General、Regs/Clken/Aclrs 和 Mem Init。 1、General 在图 5.1 所示的页面中,我们可以看出该页面主要是用于设置 ROM 的大小和类型的,下面 我们就对该页面中的每个选项一一进行介绍。  How wide should the ‘q’ output bus be?:用于指定输出端口的位宽,默认值为 8;  How many 8-bit words of memory?:用于指定存储器的数据宽度,默认值为 256;  What should the memory block type be?:用于指定实现存储器使用的存储块类型, 具体可选值与使用的 FPGA 芯片有关,默认为 Auto,我们一般使用默认值就可以了。  Set the maximum block depth to auto words:用于指定存储器的存储深度,可选值有 32、64、128 等,默认值为 Auto,同样我们一般使用默认值。  What clocking method would you like to use?:用于指定使用的时钟模式,可选择单 时钟和双时钟,选择单时钟时用一个时钟和一个时钟使能信号控制存储块的所有寄存 器,选择双时钟时输入时钟控制地址寄存器,输出时钟控制数据输出寄存器。ROM 模 式没有写使能、字节使能和数据输入寄存器。默认一般为单时钟。 2、Regs/Clken/Aclrs 说完了 General 页面,接下来我们再来看下 Regs/Clken/Aclrs 页面,大家看,如图 5.2 所 示是 Regs/Clken/Aclrs 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §5 IP 核之 ROM 117 图 5.2 Regs/Clken/Aclrs 的配置页面 下面我们就对 Regs/Clken/Aclrs 配置页面进行一个详细的介绍。  q output port:用于选择是否寄存输出端口 q,默认值为选择。  Create one clock enable signal for each clock signal.Note: All registered ports are controlled by the enable signal(s):用于选择是否为时钟信号创建相应的使能信号。  Use clock enable for port A input registers:用于指定端口 A 的输入寄存器是否使用 时钟使能,默认值为不选择;  Use clock enable for port A output registers:用于指定端口 A 的输出寄存器是否使用 时钟使能,默认值为不选择  Create an addressstall_a input port:用于指定是否创建 addressstall_a 输入端口。默 认值为不创建,该端口可以作为地址寄存器的低电平有效时钟使能输入。  Create an aclr asynchronous clear for the registered ports:用于指定是否为寄存器 的 data、wren、address、q 和 byteena_a 端口创建一个异步复位端口,默认值为不 创建。  address port:用于指定端口 address 是否由 aclr 端口信号异步复位。默认值为不指 定。  q port:用于指定端口 q 是否由 aclr 端口信号异步复位,默认值为不指定。  Create a rden read enable signal:用于指定是否创建读使能信号,默认值为不创建。 3、Mem Init 说完了 Regs/Clken/Aclrs 页面,接下来我们再来看下 Mem Init 页面,大家看,如图 5.3 所 示是 Mem Init 配置页面。 图 5.3 Mem Init 的配置页面 下面我们就对 Mem Init 配置页面进行一个详细的介绍。 http://www.fpga.gs/ 118 软件工具篇 §5  Do you want to specify the initial content of the memory?:用于指定存储器的初始存 储数据内容,我们需要为存储器提供存储器初始化文件(.mif)或者 Inter 格式的 16 进 制文件(.hex)。  Allow In-System Memory Content Editor to capture and update content independently of the system clock:用于指定是否允许系统内存储器内容编辑器在系 统时钟无关的情况下捕获和更新存储器的内容,默认值为否。  The Instance ID of this ROM is:用于指定 ROM ID,默认值为 None。 5.2.2 电子设计自动化(EDA) 介绍完了 Parameter Settings(参数设置)标签,接下来我们接着继续介绍第二个 EDA(电 子设计自动化)标签,如图 5.4 所示是 EDA 的配置页面。 图 5.4 EDA 的配置页面 从该页面中,我们可以看出,如果我们想要仿真 ROM IP 核,那么我们就需要用到 altera_mf 这个仿真库。如果我们想要将此 ROM IP 核用在其他的 EDA 工具上,我们可以通过选择 Generate netlist 这个选项来生成 IP_syn.v 文件,用于其他的 EDA 工具中。这里需要注意的是,并不是所 有的第三方 EDA 工具都支持。 5.2.3 总结(Summary) 介绍完了 EDA(电子设计自动化)标签,最后,我们再来看下 Summary(总结)标签,如 图 5.5 所示是 Summary 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §5 IP 核之 ROM 119 图 5.5 Summary 的配置页面 在该页面中,我们可以看到,该 IP 核能生成的所有文件都在该页面中,在这么多的文件中, 我们经常用到的要属 ROM_inst.v 文件了。ROM_inst.v 是我们 ROM 初始化模板。我们只要将 ROM_inst.v 中的代码复制到我们的工程代码中,然后更改替换其中的信号,我们就可以使用该 IP 核了。至此,关于 ROM IP 核的配置就讲解完了。接下来我们就来手把手带领大家创建一个 ROM IP 核。 §5.3 IP核之ROM的应用 5.3.1 Mif 文件的创建方法 在开始创建工程之前,我们先来介绍一下 mif 文件的创建方法,mif 文件就是存储器初始化 文件,即 Memory Initialization File,它是用来配置 RAM 或 ROM 中的数据,我们可以使用下面 二种方法来建立.mif 格式文件: 1、利用 Quartus II 软件自带的 mif 编辑器生成 mif 文件:对于小容量的 ROM,我们可以快 速方便的完成 mif 文件的编辑工作,对于大容量的 ROM,我们使用该方法一个一个的手工输入 会使人崩溃。 2、利用 C 语言、Matlab 或者一些实用的软件工具生成 mif 文件:使用该方法可以很好的解 决上述一个一个手工输入数据的问题,该方法主要是通过软件直接生成,我们只要告诉软件寻址 的存储单元数和存储单元宽度,然后再告诉软件我们想要生成的波形,该软件就会自动生成我们 想要的波形 mif 文件。 由于我们下面的工程应用,用到的 mif 文件数据量比较小,所以我们这里就以第一种方法为 主进行讲解,对于第二种方法,读者可以在网上找到很多相关类似的软件,而且这种软件也简单 易用,所以我们就不再进一步进行讲解了。首先,我们在 Quartus II 软件的菜单栏中找到【File】 http://www.fpga.gs/ 120 软件工具篇 §5 →【new】,在弹出的对话框中,我们选择【Memory Initialization file】点击打开,如图 5.6 所示 页面。 图 5.6 利用 Quartus II 软件自带的 mif 编辑器生成.mif 文件 在该页面中,我们可以看到 Number of words 是可寻址的存储单元数(即字数),我们这里 设置的是 32,word size 是存储单元宽度(即位数),我们这里使用的默认值。在这里我们需要 注意的是,我们 ROM IP 核设置多大的存储容量,这里的 mif 文件就要设置多大的数据量。设置 完了大小以后,我们点击【OK】,如图 5.7 所示。 图 5.7 mif 文件的编辑页面 在该页面中,我们就可以修改 mif 文件中的内容,从图片中我们可以看出,我们在 0 地址修 改的数据是 0,在 1 地址修改的数据是 1,依次类推,我们将整个 mif 文件进行了设置,这里我 们需要注意的是,我们可以在地址栏中右键,然后在弹出的窗口中来修改地址和数据的不同进制。 数据填充完毕后,我们就可以将它用在 ROM IP 核中。 5.3.2 使用 Quartus II 软件创建 ROM IP 核 创建好了 mif 文件,接下来我们就来创建 ROM IP 核。首先,我们在 E 盘的 Zircon_Verilog 文件夹下创建一个用于存放我们 ROM 的工程文件夹,这里我们起名叫 Verilog_Ip_ROM。然后 我们打开 Quartus II 软件,新建一个工程,我们将工程路径设置在 Verilog_Ip_ROM 中,然后我 们给工程命名为 Verilog_Ip_ROM,接下来我们选择好器件,设置好仿真工具,完成 Quartus II 工程的创建。创建好了工程以后,我们在 Quartus II 软件的菜单栏中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,在弹出的页面中,我们直接点击【Next>】进入 IP 核选择 页面,如图 5.8 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §5 IP 核之 ROM 121 图 5.8 选择 ROM IP 核页面 在该页面中,我们可以在 Memory Compiler 下找到 ROM IP 核,也可以直接在搜索框中直 接搜索 ROM,我们找到 ROM IP 核以后,我们选择它,然后我们在右侧的窗口中给 ROM IP 核 命名,这里我们命名为 ROM,并且选择创建的 IP 核代码为 Verilog HDL。完成这些设置以后, 我们点击【Next>】,进入如图 5.9 所示页面。 图 5.9 ROM IP 核的配置页面 在该页面中,我们可以看到,我们将可寻址的存储单元数据,也就是我们说的字数设置成了 32,这里和我们的 mif 文件是一样的。其余的设置我们将使用默认设置,保持不变。设置好了 General 页面,接下来我们就直接进入 Mem Init 页面,如图 5.10 所示。 http://www.fpga.gs/ 122 软件工具篇 §5 图 5.10 Mem Init 的配置页面 在该页面中,我们可以看到,我们将 Verilog_Ip_ROM.mif 文件用在了我们的 ROM IP 核中, 也就是说,我们 ROM IP 核中储存的就是我们 Verilog_Ip_ROM.mif 中的数据,我们读取 ROM 中的数据,也就相当于读取的是 Verilog_Ip_ROM.mif 中的数据。完成了 mif 文件的配置,接下 来我们点击【Finish】进入最后一个总结页面,在总结页面中我们要记得将 ROM 模板文件勾选 项,接下来我们只需要点击【Finish】即可完成 ROM IP 核的创建。 创建好了 ROM IP 核之后,我们需要在顶层模块中实例化我们的 ROM IP 核,代码如图 5.11 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §5 IP 核之 ROM 123 图 5.11 在 Quartus II 软件中例化 ROM 模块 从该图中我们可以看到,代码很简单,我们声明了 1 个时钟输入信号、1 个复位输入信号、 5 个地址输入信号和 8 个数据输出信号,接下来我们就可以编译工程,配置工程,给信号分配管 脚,这里我们将按键的管脚用在地址信号上,将 LED 的管脚用在数据信号上。最后下载到 A4 开 发板中进行验证。下载完成之后,我们可以依次按下 A4 开发板中的 KEY1 至 KEY5 这五个按 键,每次按下我们都可以看到 LED 发生变化。到了这里,我们可以确定,我们的 ROM IP 核工 程是工作起来,具体工作的正常不正常,我们需要使用 ModeSim 软件来进行仿真查看了。 5.3.3 使用 ModelSim 软件仿真 ROM IP 核 完成了 Quartus II 软件工程的建立,接下来我们就需要使用 ModelSim 软件对 ROM IP 核 进行仿真,首先我们利用 Quartus II 软件生成 Testbench 模板代码,然后我们在 Testbench 模 板代码的基础上进行修改,代码修改如图 5.12 所示。 图 5.12 Testbench 激励代码编写 从该图中,我们可以看到,该 ROM IP 核的激励代码要比 PLL IP 核的激励代码复杂一些, 在这里我们就来简单的介绍一下这个激励代码。首先我们将 CLK_50M 和 RST_N 两个信号赋 值为 0,也就是让系统进入复位状态,经过 10ps 以后,我们就给 RST_N 赋值为 1,让系统进入 正常工作状态,接下来我们就可以看到第 57 行,该语句主要是实现一个周期为 20ns,时钟频 率为 50MHz 的一个时钟信号。我们继续接着往下看,我们来到 59 至 65 行,该段代码主要是一 个时序电路,用来给 address 赋值的,67 至 73 行,该段代码主要是一个组合电路,用来实现 一个递增的计数器。该计数器能够从 0 计数到 31,主要是用来实现 ROM IP 核的地址信号,计 数 0 时就是 0 地址,计数 1 时就是 1 地址,依次类推。直到我们的仿真运行到 1us,我们才回停 http://www.fpga.gs/ 124 软件工具篇 §5 止仿真。 修改好了代码,我们还需要将 Testbench 添加至我们的 Quartus II 软件的仿真设置中,添 加好以后,我们就可以点击 Quartus II 软件菜单栏中的找到【Tools】→【Run Simulation Tool】 →【RTL Simulation】点击打开,弹出如图 5.13 所示页面。 图 5.13 ModelSim 仿真波形图 从该图中我们可以看出,在 10ns 的时候,我们的 ROM IP 核读取了 0 地址,然后紧接着在 30ns,也就是一个时钟以后,我们的 ROM IP 核就输出了 00 数据,在输出 00 数据的同时,我 们的 ROM IP 核又读取了 1 地址,然后紧着在一个时钟之后,也就是 50ns 的时候输出了 01 数 据,依次类推直至全部输出。这里我们需要说明的是,之所以我们这里会延迟一个时钟输出,是 因为我们在 Regs/Clken/Aclrs 配置页面设置了 q output port,如图 5.14 所示页面。 图 5.14 Regs/Clken/Aclrs 的配置页面 下面我们就将这个端口给去掉,然后重新仿真一次,如图 5.15 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §5 IP 核之 ROM 125 图 5.15 ModelSim 仿真波形图 从该图中我们可以看出,在 10ns 的时候读取了 0 地址,紧接着就在后面就输出了 00 数据, 在 30ns 的时候读取了 1 地址,紧接着就在后面就输出了 01 数据,在 50ns 的时候读取了 2 地 址,紧接着在后面就输出了 02 数据,我们可以看到这就是 ModelSIm 的强大之处,我们只要对 ROM IP 核设置上不理解的地方,我们都可以通过 ModelSim 仿真来看明白。至此,我们的 ModelSim 仿真环节就结束了,接下来我们就来使用 SignalTap II 软件来进行在线调试。 5.3.4 使用 SignalTap II 软件调试 ROM IP 核 完成了 ModelSim 软件仿真 ROM IP 核,接下来我们就需要使用 SignalTap II 软件对 ROM IP 核进行调试,首先我们在 Quartus II 软件中创建一个 SignalTap II 调试文件,在 SignalTap II 调试文件中,我们利用节点发现器将 address 和 readdata 两个信号添加至节点列表中,添加完 成后,我们再将 address 设置为 08h 触发,触发条件设置好了之后,我们将采样时钟设置为 CLK_50M,将采样深度设置为 2K,如图 5.16 所示。 http://www.fpga.gs/ 126 软件工具篇 §5 图 5.16 SignalTap II 软件调试界面 设置好了之后,我们重新编译工程,通过 SignalTap II 页面,我们将.sof 文件下载至开发板, 然后我们点击 SignalTap II 页面中的开始调试按钮,等待程序触发,弹出如图 5.17 所示页面。 图 5.17 address 地址信号等待触发 08h Zircon Opto-Electronic Technology CO.,Ltd. §5 IP 核之 ROM 127 从该图中我们可以看出,我们的 SignalTap II 软件已经正常工作,由于我们采样不到 address 为 08h,所以我们的程序一直等待触发,我们在前面说过,我们将按键管脚定义给了地址信号, 08h 换算成二进制就是 00001000,也就是说我们只要按下第四个按钮,SignalTap 就会触发, 这时 ROM IP 核就会读取 08h 这个地址,然后将 08h 地址中的内容赋值给我们的 LED 进行显 示,大家看好了,我们按下了 A4 开发板上的第四个按钮,如图 5.18 所示。 图 5.18 按下了 A4 开发板上的第四个按键 从该图中我们可以看出,address 显示 08h,同时我们还可以看到 readdata 也显示 08h, 我们再回去看看我们之前的 mif 文件,我们可以看到 08 地址上对应的就是我们 08h 数据。由此 我们可以看出,我们的 ROM IP 核工作正常。为了证明程序的稳定性,我们再来测试一次,这里 我们测试第五按键,我们更改触发条件,将 08h 改成 10h,我们开始进行调试,然后按下第五个 按键,这时,我们可以看到开发板上 D5 LED 灯熄灭了,下面我们再来看看 SignalTap 采样到 的波形图,如图 5.19 所示。 http://www.fpga.gs/ 128 软件工具篇 §5 图 5.19 按下了 A4 开发板上的第五个按键 从该图中我们可以看到,我们采样到的 readdata 值为 10h,我们的程序执行的是正确。至 此,我们的 ROM IP 核的内容就讲解完了,接下来我们要讲解的是 RAM IP 核,它和我们的 ROM IP 核还是有很多相似的地方。 Zircon Opto-Electronic Technology CO.,Ltd. IP 核之 RAM 第六章 IP 核之 RAM §6.1 IP核之RAM的介绍 随机存取存储器(Random Access Memory,即 RAM),它可以随时从任一指定地址读出 数据,也可以随时把数据写入任何指定的存储单元,且读写的速度与存储单元在存储芯片中的位 置无关。RAM 主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。RAM 按照存 储单元的工作原理可分为静态 RAM 和动态 RAM,也就是我们常说的 SRAM 和 DRAM,SRAM 速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使 用,比如 CPU 的一级缓冲,二级缓冲。DRAM 不同于 SRAM,DRAM 保留数据的时间很短, 速度也比 SRAM 慢,但是从价格上来说 DRAM 相比 SRAM 要便宜很多,比如计算机内存就是 DRAM 的。这里我们需要说明的是,DRAM 与 SRAM 相比较速度慢,但是它与 ROM 相比较速 度还是很快的。 RAM IP 核同 ROM IP 核一样,Altera 也提供了两种:一种是但端口的 RAM IP 核,另一种 是双端口的 RAM IP 核。双端口只是在单端口的基础上多出了一个接口,它们的操作都是一样 的,我们只要学会了单端口的使用,那么学起双端口来也是轻而易举。下面我们就以单端口 RAM IP 核为例进行讲解。 §6.2 IP核之RAM的配置 介绍完了 RAM IP 核,接下来我们来看一下 RAM IP 核是如何进行配置的。大家看,如图 6.1 所示是 RAM IP 核的配置页面。 图 6.1 RAM IP 核的配置页面 132 软件工具篇 §6 从该图中我们可以看出,RAM IP 核的配置和我们的 ROM IP 核基本上是差不多的,我们想 要配置一个 RAM IP 核,也同样只需要完成以下三个步骤: 1、Parameter Settings(参数设置); 2、EDA(电子设计自动化); 3、Summary(总结); 6.2.1 参数设置(Parameter Settings) 首先我们先来介绍一下 Parameter Settings(参数设置),在 Parameter Settings(参数设 置)配置中,我们可以看到它有 4 个标签,比我们的 ROM IP 核多了 1 个标签,这 4 个标签分 别是 Widths/Blk Type/Clks、Regs/Clken/Byte Enable/Aclrs、Read During Write Option 和 Mem Init。 1、Widths/Blk Type/Clks 从图 6.1 所示的页面中,我们可以看出,虽然标签名和我们的 ROM IP 核不同,但是里面的 内容基本一致,下面我们就对该页面中的每个选项一一进行讲解:  How wide should the ‘q’ output bus be?:用于指定输出端口的位宽,默认值为 8;  How many 8-bit words of memory?:用于指定存储器的数据宽度,默认值为 256;  What should the memory block type be?:用于指定实现存储器使用的存储块类型, 具体可选值与使用的 FPGA 芯片有关,默认为 Auto,我们一般使用默认值就可以了。  Set the maximum block depth to auto words:用于指定存储器的存储深度,可选值有 32、64、128 等,默认值为 Auto,同样我们一般使用默认值。  What clocking method would you like to use?:用于指定使用的时钟模式,可选择单 时钟和双时钟,选择单时钟时用一个时钟和一个时钟使能信号控制存储块的所有寄存 器,选择双时钟时输入和输出时钟分别控制存储块的数据输入和输出相关寄存器,包括 数据、地址、字节使能、读使能和写使能。默认一般为单时钟。 2、Regs/Clken/Byte Enable/Aclrs 说完了 Widths/Blk Type/Clks 页面,接下来我们再来看下 Regs/Clken/Byte Enable/Aclrs 页 面,大家看,如图 6.2 所示是 Regs/Clken/Byte Enable/Aclrs 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 133 图 6.2 Regs/Clken/Byte Enable/Aclrs 的配置页面 下面我们就对 Regs/Clken/Byte Enable/Aclrs 配置页面进行一个详细的介绍:  q output port:用于选择是否寄存输出端口 q,默认值为选择。  Create one clock enable signal for each clock signal.Note: All registered ports are controlled by the enable signal(s):用于选择是否为时钟信号创建相应的使能信号。  Use clock enable for port A input registers:用于指定端口 A 的输入寄存器是否使用 时钟使能,默认值为不选择;  Use clock enable for port A output registers:用于指定端口 A 的输出寄存器是否使用 时钟使能,默认值为不选择  Create an addressstall_a input port:用于指定是否创建 addressstall_a 输入端口。默 认值为不创建,该端口可以作为地址寄存器的低电平有效时钟使能输入。  Create an aclr asynchronous clear for the registered ports:用于指定是否为寄存器 的 data、wren、address、q 和 byteena_a 端口创建一个异步复位端口,默认值为不 创建。  q port:用于指定端口 q 是否由 aclr 端口信号异步复位,默认值为不指定。  Create a rden read enable signal:用于指定是否创建读使能信号,默认值为不创建。 3、Read During Write Option 说完了 Regs/Clken/Byte Enable/Aclrs 页面,接下来我们再来看下 Read During Write Option 页面,大家看,如图 6.3 所示是 Read During Write Option 配置页面。 http://www.fpga.gs/ 134 软件工具篇 §6 图 6.3 Read During Write Option 的配置页面 下面我们就对 Read During Write Option 配置页面进行一个详细的介绍。  What should the q output be when reading from a memory location being written to?: 指定写期间读(read-during-write)操作的输出,可选项包括新数据(New Data)和 不关心(Don’t Care),默认选项为 New Data,也即在写数据的同一个时钟周期的上 升沿新数据可用;如果选择 Don’t Care,存储器输出不确定。  Get x’s for write masked bytes instead of old data when byte enable is used:我们 可以看到,默认值是勾选的,此时在被屏蔽的字节位置获得 X 值。  用于指定是否允许系统内存储器内容编辑器在系统时钟无关的情况下捕获和更新存储 器的内容,默认值为否。  The Instance ID of this ROM is:用于指定 ROM ID,默认值为 None。 4、Mem Init 说完了 Read During Write Option 页面,接下来我们再来看下 Mem Init 页面,大家看,如 图 6.4 所示是 Mem Init 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 135 图 6.4 Mem Init 的配置页面 从该页面中,我们可以看出,该页面就是对 RAM IP 核的初始化页面,这里我们和 ROM IP 核不同的是,ROM IP 核不能设置为 No,只能设置 Yes,而我们的 RAM IP 核,我们可以设置 为空,也可以进行初始化。下面我们就对 Mem Init 配置页面进行一个详细的介绍。  Do you want to specify the initial content of the memory?:用于指定存储器的初始存 储数据内容,可选值包括 No,leave it blank(保持为空)或 Yes,use this file for the memory content data(使用数据文件加载),默认选项为 No。选择 No 时,存储器初 始化全为 0;选择 Yes 时,我们需要为存储器提供存储器初始化文件(.mif)或者 Inter 格式的 16 进制文件(.hex)。  Allow In-System Memory Content Editor to capture and update content independently of the system clock:用于指定是否允许系统内存储器内容编辑器在系 统时钟无关的情况下捕获和更新存储器的内容,默认值为否。  The Instance ID of this RAM is:用于指定 RAM ID,默认值为 None。 6.2.2 电子设计自动化(EDA) 介绍完了 Parameter Settings(参数设置)标签,接下来我们接着继续介绍第二个 EDA(电 子设计自动化)标签,如图 6.5 所示是 EDA 的配置页面。 http://www.fpga.gs/ 136 软件工具篇 §6 图 6.5 EDA 的配置页面 从该页面中,我们可以看出,如果我们想要仿真 RAM IP 核,那么我们就需要用到 altera_mf 这个仿真库。如果我们想要将此 RAM IP 核用在其他的 EDA 工具上,我们可以通过选择 Generate netlist 这个选项来生成 IP_syn.v 文件,用于其他的 EDA 工具中。这里需要注意的是,并不是所 有的第三方 EDA 工具都支持。 6.2.3 总结(Summary) 介绍完了 EDA(电子设计自动化)标签,最后,我们再来看下 Summary(总结)标签,如 图 6.6 所示是 Summary 配置页面。 图 6.6 Summary 的配置页面 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 137 在该页面中,我们可以看到,该 IP 核能生成的所有文件都在该页面中,在这么多的文件中, 我们只要选择 RAM_inst.v 文件就可以了。至此,关于 RAM IP 核的配置就讲解完了。接下来我 们就来手把手带领大家创建一个 RAM IP 核。 §6.3 IP核之RAM的应用 6.3.1 使用 Quartus II 软件创建 RAM IP 核 说完了 RAM IP 核的配置,接下来我们就来创建 RAM IP 核。首先,我们在 E 盘的 Zircon_Verilog 文 件 夹 下 创 建 一 个 用 于 存 放 我 们 RAM 的 工 程 文 件 夹 , 这 里 我 们 起 名 叫 Verilog_Ip_RAM。然后我们打开 Quartus II 软件,新建一个工程,我们将工程路径设置在 Verilog_Ip_RAM 中,然后我们给工程命名为 Verilog_Ip_RAM,接下来我们选择好器件,设置 好仿真工具,完成 Quartus II 工程的创建。创建好了工程以后,我们在 Quartus II 软件的菜单栏 中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,在弹出的页面中,我们 直接点击【Next>】进入 IP 核选择页面,如图 6.7 所示。 图 6.7 选择 RAM IP 核页面 在该页面中,我们可以在 Memory Compiler 下找到 RAM IP 核,也可以直接在搜索框中直 接搜索 RAM,我们找到 RAM IP 核以后,我们选择它,然后我们在右侧的窗口中给 RAM IP 核 命名,这里我们命名为 RAM,并且选择创建的 IP 核代码为 Verilog HDL。完成这些设置以后, 我们点击【Next>】,进入如图 6.8 所示页面。 http://www.fpga.gs/ 138 软件工具篇 §6 图 6.8 RAM IP 核的配置页面 在该页面中,我们可以看到,我们将可寻址的存储单元数据,也就是我们说的字数设置成了 32,这里和我们的 ROM IP 核配置的一样。其余的设置我们将使用默认设置,保持不变。设置 好了 Widths/Blk Type/Clks 页面,接下来我们就直接进入 Regs/Clken/Byte Enable/Aclrs 页面, 如图 6.9 所示。 图 6.9 Regs/Clken/Byte Enable/Aclrs 的配置页面 在该页面中,我们可以看到,我们添加了一个 rden 读使能信号,也就是说,当该信号为高 电平时,我们才可以读取 RAM IP 核中的数据。该信号配置好以后,我们就可以点击【Finish】 按钮来完成 RAM IP 核的定制,其余的页面我们使用默认设置即可。这里需要提醒大家的是,不 要忘记勾选 RAM_inst.v 初始化模版文件。创建好了 RAM IP 核之后,我们需要在顶层模块中实 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 139 例化我们的 RAM IP 核,代码如图 6.10 所示。 图 6.10 在 Quartus II 软件中例化 ROM 模块 从该图中我们可以看到,与 ROM IP 核相比较,我们的 RAM IP 核多出了很多代码,这些代 码看起来很多很复杂,其实很简单,下面我们就给大家简单的介绍一下这些代码,代码如代码 6.1 所示。 代码 6.1 Verilog_Ip_RAM.v 源代码 1 module Verilog_Ip_RAM 2( 3 CLK_50M,RST_N,address,wrdata,rddata,wren,rden,time_cnt 4 ); 5 6 input CLK_50M; 7 input RST_N; 8 9 output reg [5:0] time_cnt; 10 output reg [4:0] address; 11 output reg [7:0] wrdata; 12 output [7:0] rddata; 13 output wren; 14 output rden; 15 16 reg [5:0] time_cnt_n; 17 reg [4:0] address_n; http://www.fpga.gs/ 140 软件工具篇 §6 18 reg [7:0] wrdata_n; 19 20 always @ (posedge CLK_50M or negedge RST_N) 21 begin 22 if(!RST_N) 23 time_cnt <= 1'b0; 24 else 25 time_cnt <= time_cnt_n; 26 end 27 28 always @ (*) 29 begin 30 if(time_cnt == 6'd63) 31 time_cnt_n = 1'b0; 32 else 33 time_cnt_n = time_cnt + 1'b1; 34 end 35 36 always @ (negedge CLK_50M or negedge RST_N) 37 begin 38 if(!RST_N) 39 address <= 1'b0; 40 else 41 address <= address_n; 42 end 43 44 always @ (*) 45 begin 46 if(address == 5'd31) 47 address_n = 1'b0; 48 else 49 address_n = address + 1'b1; 50 end 51 52 assign wren = (time_cnt >= 1'b0 && time_cnt <= 5'd31) ? 1'b1 : 1'b0; 53 54 always @ (negedge CLK_50M or negedge RST_N) 55 begin 56 if(!RST_N) 57 wrdata <= 1'b0; 58 else 59 wrdata <= wrdata_n; 60 end 61 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 141 62 always @ (*) 63 begin 64 if(time_cnt >= 1'b0 && time_cnt <= 5'd31) 65 wrdata_n = time_cnt; 66 else 67 wrdata_n = wrdata; 68 end 69 70 assign rden = (time_cnt >= 6'd32 && time_cnt <= 6'd63) ? 1'b1 : 1'b0; 71 72 RAM RAM_inst 73 ( 74 .address (address ), 75 .clock (CLK_50M ), 76 .data (wrdata ), 77 .rden (rden ), 78 .wren (wren ), 79 .q (rddata ) 80 ); 81 82 endmodule 代码的前 19 行代码主要是声明端口和定义端口类型,这里我们就不在多说了,我们直接从 第 20 行开始讲起,我们先来看第 20 行至第 35 行,这里面包含两个 always 模块,一个 always 模块是用于时序电路,一个 always 模块是用于组合电路,这个时序电路和组合电路构成了一个 计数器,该计数器从 0 计数到 63,当计数器等于 63 时,计数器就会清零,从 0 开始继续计数。 依次循环。下面我们再来看第 36 至 51 行,这两个 always 模块主要是生成 RAM 的地址信号, 我们很容易的可以看出,该地址从 0 一直计数到 31,然后清零重新开始计数。第 52 行,这个 assign 是用来生成写使能信号。第 54 至 68 行,这两个 always 模块用来生成我们写入到 RAM IP 核中的数据。第 70 行,这个 assign 主要是用来生成读使能信号。最后 72 行至 80 行是用来 例化 RAM IP 核的。介绍完了代码,下面我们再来总结一下该代码主要实现了什么功能,该代码 主要实现了先往 RAM IP 核中的 0~31 地址写入 0~31 数据,每个地址对应一个数据,比如 0 地 址对应 0 数据,1 地址对应 1 数据,依次类推。写完了 32 个数据之后,我们在将 RAM IP 核中 0~31 地址中的数据读出。这里需要注意的是,当写数据时,我们需要将写使能信号拉高,当读 数据时,我们需要将读使能拉高。说完了代码,接下来我们就可以编译工程,配置工程了,当然 我们也可以为它分配管脚,下载至开发板上,但是这样做没有任何意义,因为我们通过开发板是 看不出它的实验效果。 6.3.2 使用 ModelSim 软件仿真 RAM IP 核 完成了 Quartus II 软件工程的建立,下面我们就来使用 ModelSim 软件仿真我们的 RAM IP 核,首先我们利用 Quartus II 软件生成 Testbench 模板代码,然后我们在 Testbench 模板代码 http://www.fpga.gs/ 142 软件工具篇 §6 的基础上进行修改,代码修改如图 6.11 所示。 图 6.11 Testbench 激励代码编写 从该图中我们可以看出,我们的激励代码很简单,同样也很少,这是因为,我们把代码写在 了顶层模块中,当然我们同样也可以将代码写在 Testbench 中。修改好了代码,我们还需要将 Testbench 添加至我们的 Quartus II 软件的仿真设置中,添加好以后,我们就可以点击 Quartus II 软件菜单栏中的找到【Tools】→【Run Simulation Tool】→【RTL Simulation】点击打开,弹 出如图 6.12 所示页面。 图 6.12 RAM IP 核写操作仿真波形图 从图中我们可以看出,写使能 wren 为高,读使能 rden 为低,也就是说,该操作是往 RAM IP 核中写数据,在 Cursor1 时,当地址 address 为 0 时,写数据 wrdata 也为 0;在 Cursor2 时,当地址 address 为 1 时,写数据 wrdata 也为 1,依次类推,我们总共往 RAM IP 核中写 32 个数据,即 0-31。如图 6.13 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 143 图 6.13 RAM IP 核读操作仿真波形图 从图中我们可以看出,在 Cursor1 时,当地址 address 为 30 时,写数据 wrdata 也为 30, 在 Cursor2 时,当地址 address 为 31 时,写数据 wrdata 也为 31。此时由于 32 个数据已经写 完,我们可以看到写使能 wren 由高变低,读使能 rden 由低变高,也就是说,接下来将是从 RAM IP 核中读取数据;在 Cursor3 时,当 address 为 0 时,读数据 rddata 也就为 0,同理,在 Cursor4 时也是如此,依次类推,我们将写入的 32 个数据再读出。 6.3.3 使用 SignalTap II 软件调试 RAM IP 核 完成了 ModelSim 软件仿真 RAM IP 核,接下来我们就需要使用 SignalTap II 软件对 RAM IP 核进行调试,首先我们在 Quartus II 软件中创建一个 SignalTap II 调试文件,在 SignalTap II 调试文件中,我们利用节点发现器将 time_cnt、address、wren、wrdata、rden 和 rddata 这六 个信号添加至节点列表中,添加完成后,我们再将 wren 设置为上升沿触发,触发条件设置好了 之后,我们将采样时钟设置为 CLK_50M,将采样深度设置为 2K,如图 6.14 所示。 http://www.fpga.gs/ 144 软件工具篇 §6 图 6.14 SignalTap II 软件调试界面 设置好了之后,我们重新编译工程,通过 SignalTap II 页面,我们将.sof 文件下载至开发板, 然后我们点击 SignalTap II 页面中的开始调试按钮,SignalTap II 软件触发并弹出如图 6.15 所示 页面。 图 6.15 wren 写使能信号触发采样的波形图 从该图中我们可以看出,当 wren 为上升沿的时候,我们的 wrdata 依次往 RAM 中写入了 32 个数据,这和我们的 ModelSim 仿真是一致的。下面我们再来看一下读操作,如图 6.16 所示。 Zircon Opto-Electronic Technology CO.,Ltd. §6 IP 核之 RAM 145 图 6.16 rden 读使能信号触发采样的波形图 从该图中我们可以看出,当我们 rden 为上升沿的时候,我们的 rddata 从 RAM 中依次读出 0~31 数据,同样也是和我们仿真看到的波形是一致的,至此,我们的 RAM IP 核的内容就讲解 完了,接下来我们要讲解的是 FIFO IP 核。 http://www.fpga.gs/ IP 核之 FIFO 第七章 IP 核之 FIFO §7.1 IP核之FIFO的介绍 FIFO(First Input First Output),即先进先出队列,在计算机中,先进先出队列是一种传统 的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。就好比我们在超市购物, 买好了东西之后,我们便会推着我们满满的购物车来到收银台排在结账队伍的最后面等待结账, 前面先来排队的客户先得到结账,然后一个一个的结完帐离开,后面后来的客户需要等到前面的 客户结完帐之后才能进行结账。这就是一种先进先出的机制,相信大家还是很容易就能理解的。 FIFO 一般用于不同时钟域之间的数据传输,比如 FIFO 的一端是采样速率比较慢的一个接 口,另一端是采样速度比较快的一个接口,假设采样慢的接口速度为 1Mhz,而采样快的接口速 度为 100Mhz,如果我们直接将这两个接口相连接,那么将会出现各种问题,如何解决呢,我们 可以在这两个不同的时钟域间采用 FIFO 来作为数据缓冲。另外对于不同宽度的数据接口也可以 用 FIFO,比如一端的接口输出数据是 8 位的,而另一端输出数据可能是 16 位的,我们就可以 在这两个不同宽度的数据接口中使用 FIFO 来达到数据匹配的。 同我们之前讲的 PLL、ROM 和 RAM IP 核一样,Altera 也提供了 FIFO IP 核,用于实现 FIFO 存储器。 §7.2 IP核之FIFO的配置 介绍完了 FIFO IP 核,接下来我们来看一下 FIFO IP 核是如何进行配置的。大家看,如图 7.1 所示是 FIFO IP 核的配置页面。 图 7.1 FIFO IP 核的配置页面 150 软件工具篇 §7 从该图中我们可以看出,FIFO IP 核的配置也是很简单的,我们想要配置一个 FIFO IP 核, 也同 ROM 和 RAM IP 核一样,只需要完成以下三个步骤: 1、Parameter Settings(参数设置); 2、EDA(电子设计自动化); 3、Summary(总结); 7.2.1 参数设置(Parameter Settings) 首先我们先来介绍一下 Parameter Settings(参数设置),在 Parameter Settings(参数设 置)配置中,我们可以看到它有 4 个标签,这 4 个标签分别是 Width,Clks,Synchronization、 SCFIFO Options、Rdreq Option,Blk Type 和 Optimization,Circuitry Protection。这里我们需要 说明的是,它不止 4 个标签,它是有 6 个标签的,其中 DCFIFO1、DCFIFO2 两个标签页面隐 藏了起来,我们需要通过选项来将这两个页面打开。下面我们将会进行介绍。 1、Width,Clks,Synchronization 从图 7.1 所示的页面中,我们可以看出,我们的 FIFO IP 核也是需要设置其存储大小的,下 面我们就对该页面中的每个选项一一进行讲解:  How wide should the FIFO be?:用于 FIFO 输入和输出的位宽,默认值为 8;  Use a different output width and set to:用于指定不同的输入和输出数据位宽。  How deep should the FIFO be?:用于指定 FIFO 的数据深度,默认值为 256;  DO you want a common clock for reading and writing the FIFO?:该选项有两个选 择值,分别是 Yse 和 No,默认值是 Yes,如果选择 Yes,此时的 FIFO 就是一个单时 钟 FIFO,简称(SCFIFO),SCFIFO 的读信号和写信号与同一个时钟同步,如果选择 No,此时的 FIFO 就是一个双时钟 FIFO,简称(DCFIFO),DCFIFO 的读信号和写信 号分别与 rdclk 和 wrclk 同步。这里需要我们注意的是,当我们选择 No 的时候,上面 的 Use a different output width and set to 便可以开启并使用,同时在我们的标签中我 们可以看到,之前的 SCFIFO Options 变成了 DCFIFO1 和 DCFIFO2。首先我们先来 介绍的是 SCFIFO,介绍完 SCFIFO 标签,之后我们再来介绍 DCFIFO1 和 DCFIFO2 标签。 2、SCFIFO Options 说完了 Width,Clks,Synchronization 页面,接下来我们再来看下 SCFIFO Options 页面,大 家看,如图 7.2 所示是 SCFIFO Options 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 151 图 7.2 SCFIFO Options 的配置页面 下面我们就对 SCFIFO Options 配置页面进行一个详细的介绍:  full:FIFO 满的标记信号,为高电平时表示 FIFO 已满,不能再进行写操作。  empty:FIFO 空的标记信号,为高电平时表示 FIFO 已空,不能在进行读操作。  usedw[](number of words in the FIFO):显示存储在 FIFO 中数据个数的信号,Note: (可以使用最高位作为 FIFO 的半满指示信号。)  almost full:接近满信号,当 usedw 信号的值大于或等与我们设置的 almost full 的值 时,该信号置为高电平,是 full 信号的提前提示信号。  almost empty:接近空信号,当 usedw 信号的值小于我们设置的 almost empty 的值 时,该信号置为高电平,是 empty 信号的提前提示信号。  Asynchronous clear:异步复位信号,用于复位所有输出状态端口。  Synchronous clear(flush the FIFO):同步复位信号,用于复位所有输出状态端口。 3、DCFIFO1 说完了 SCFIFO Options 页面,接下来我们再来看下 DCFIFO1 页面,大家看,如图 7.3 所 示是 DCFIFO1 配置页面。 http://www.fpga.gs/ 152 软件工具篇 §7 图 7.3 DCFIFO1 的配置页面 从该页面中,我们可以看出,该页面主要是用于对我们的 DCFIFO 进行优化的,下面我们 就来简单的介绍一下这三种优化类型:  Lowest latency but requires synchronized clocks(最低延迟,但要求同步时钟):此 选项使用一个同步阶段,没有亚稳态保护。它是最小尺寸,提供良好的 Fmax。  Minimal setting for unsynchronized clocks(不同步的时钟设置为最小):这个选项使 用两个同步阶段,具有良好的亚稳态保护。它是中等尺寸,提供良好的 Fmax。  Best metastability protection, best fmax and unsynchronized clocks(最好的亚稳态 的保护,最好的 Fmax,时钟不同步):这个选项使用三个或更多的同步阶段,具有最 好的亚稳态保护。它是最大尺寸,给出了最好的 Fmax。 在使用过程中,通常我们选择的是默认的中等优化,具体的优化主要还是看你的工程的要 求,假如你的工程对速度和稳定性要求很高,但同时资源又很多,那么你就可以使用第三个选项, 加入你的工程资源很紧张,那么你只能选择使用第一个资源少的优化。 4、DCFIFO2 说完了 DCFIFO1 页面,接下来我们再来看下 DCFIFO2 页面,大家看,如图 7.4 所示是 DCFIFO2 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 153 图 7.4 DCFIFO2 的配置页面 从该页面中,我们可以看到,该页面和我们的 SCFIFO Options 页面还是很相似的,无非是 把之前的一个 full,一个 empty 和一个 usedw[]分成了 rdfull 和 wrfull,rdempty 和 wrempty,以 及 rdusedw[]和 wrusedw[]。下面我们就来简单的介绍一下:  rdfull 和 wrfull:FIFO 满的标记信号,为高电平时表示 FIFO 已满,不能再进行写操作。  rdempty 和 wrempty:FIFO 空的标记信号,为高电平时表示 FIFO 已空,不能在进行 读操作。  rdusedw[]和 wrusedw[]:显示存储在 FIFO 中数据个数的信号。  Add an extra MSB to usedw ports:将 rdusedw 和 wrusedw 数据位宽增加 1 位,用 于保护 FIFO 在写满时不会翻转到 0。  Asynchronous clear:异步复位信号,用于复位所有输出状态端口。 5、Rdreq Option,Blk Type 说完了 DCFIFO2 页面,接下来我们再来看下 Rdreq Option,Blk Type 页面,大家看,如图 7.5 所示是 Rdreq Option,Blk Type 配置页面。 http://www.fpga.gs/ 154 软件工具篇 §7 图 7.5 Rdreq Option,Blk Type 的配置页面 下面我们就对 Rdreq Option,Blk Type 配置页面进行一个详细的介绍。  Which kind of read access do you want with the rdreq signal?:指定 FIFO 是正常模 式,还是前显模式,对于正常模式,FIFO 将端口 rdreq 看做正常的读请求并在该端口 信号为高电平进行读操作。对于前显模式,FIFO 将端口 rdreq 看做读确认并自动输出 FIFO 中有效数据的第 1 个数据字(前提是 empty 或 rdempty 为低电平),而步需要将 rdreq 信号置为高电平,将 rdreq 信号置为高电平将输出 FIFO 中的下一个数据字(如 果存在)。如果使用前显模式,将会使设计性能下降。  What should the memory block type be?:用于指定实现存储器使用的存储块类型, 具体可选值与使用的 FPGA 芯片有关,默认为 Auto,我们一般使用默认值就可以了。  Set the maximum block depth to auto words:用于指定存储器的存储深度,可选值有 32、64、128 等,默认值为 Auto,同样我们一般使用默认值。 5、Optimization,Circuitry Protection 说完了 Read During Write Option 页面,接下来我们再来看下 Optimization,Circuitry Protection 页面,大家看,如图 7.6 所示是 Optimization,Circuitry Protection 配置页面。 Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 155 图 7.6 Optimization,Circuitry Protection 的配置页面 下面我们就对 Optimization,Circuitry Protection 配置页面进行一个详细的介绍:  Woud you like to register the output to maxmize performance but use more area?: 其实该选项和我们之前的 DCFIFO1 标签页面有点类似,我们在这里也需要做出一个速 度与面积的一个权衡,这里默认的设置是最小面积,当然你也可以设置成最快速度。这 个主要还是根据你的工程决定。  Would you like to disable any circuitry protection?:如果你不需要上溢检测和下溢检 测保护电路,那么你可以通过下面的选项来禁止它们,以此来提高我们的 FIFO 性能。 上溢检测保护电路主要是用于在 FIFO 满时禁止 wrreq 端口,下溢检测保护电路主要 是用于在 FIFO 空时,禁止 rdreq 端口。它们默认的状态是打开的。  Implement FIFO storage with logic cells only, even if the device contains memory blocks?:使用逻辑单元实现我们的 FIFO 存储器。 7.2.2 电子设计自动化(EDA) 介绍完了 Parameter Settings(参数设置)标签,接下来我们接着继续介绍第二个 EDA(电 子设计自动化)标签,如图 6.5 所示是 EDA 的配置页面。 http://www.fpga.gs/ 156 软件工具篇 §7 图 7.7 EDA 的配置页面 从该页面中,我们可以看出,如果我们想要仿真 FIFO IP 核,那么我们就需要用到 altera_mf 这个仿真库。如果我们想要将此 FIFO IP 核用在其他的 EDA 工具上,我们可以通过选择 Generate netlist 这个选项来生成 IP_syn.v 文件,用于其他的 EDA 工具中。这里需要注意的是,并不是所 有的第三方 EDA 工具都支持。 7.2.3 总结(Summary) 介绍完了 EDA(电子设计自动化)标签,最后,我们再来看下 Summary(总结)标签,如 图 7.8 所示是 Summary 配置页面。 图 7.8 Summary 的配置页面 在该页面中,我们可以看到,该 IP 核能生成的所有文件都在该页面中,在这么多的文件中, 我们只要选择 FIFO_inst.v 文件就可以了。至此,关于 FIFO IP 核的配置就讲解完了。接下来我 Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 157 们就来手把手带领大家创建一个 FIFO IP 核。 §7.3 IP核之FIFO的应用 7.3.1 使用 Quartus II 软件创建 FIFO IP 核 说完了 FIFO IP 核的配置,接下来我们就来创建 FIFO IP 核。首先,我们在 E 盘的 Zircon_Verilog 文 件 夹 下 创 建 一 个 用 于 存 放 我 们 FIFO 的 工 程 文 件 夹 , 这 里 我 们 起 名 叫 Verilog_Ip_FIFO。然后我们打开 Quartus II 软件,新建一个工程,我们将工程路径设置在 Verilog_Ip_FIFO 中,然后我们给工程命名为 Verilog_Ip_FIFO,接下来我们选择好器件,设置 好仿真工具,完成 Quartus II 工程的创建。创建好了工程以后,我们在 Quartus II 软件的菜单栏 中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,在弹出的页面中,我们 直接点击【Next>】进入 IP 核选择页面,如图 7.9 所示。 图 7.9 选择 FIFO IP 核页面 在该页面中,我们可以在 Memory Compiler 下找到 FIFO IP 核,也可以直接在搜索框中直 接搜索 FIFO,我们找到 FIFO IP 核以后,我们选择它,然后我们在右侧的窗口中给 FIFO IP 核 命名,这里我们命名为 FIFO,并且选择创建的 IP 核代码为 Verilog HDL。完成这些设置以后, 我们点击【Next>】,进入如图 7.10 所示页面。 http://www.fpga.gs/ 158 软件工具篇 §7 图 7.10 FIFO IP 核的配置页面 在该页面中,我们可以看到,我们将 FIFO 的深度设置成了 32,这个大小和我们之前 RAM IP 核中的大小是一致的。这里我们需要注意的是,我们可以看到,我们使用的是单时钟 FIFO, 也就是 SCFIFO。设置好了以后,接下来我们就直接进入 SCFIFO 页面,如图 7.11 所示。 图 7.11 SCFIFO 的配置页面 在该页面中,我们可以看到,我们这里使用的是默认配置,默认配置是带有 full、empty 和 usedw[]三个信号的,接下来我们就可以点击【Finish】按钮来完成 FIFO IP 核的定制,其余的页 面我们使用默认设置即可。这里需要提醒大家的是,不要忘记勾选 FIFO_inst.v 初始化模版文件。 创建好了 FIFO IP 核之后,我们需要在顶层模块中实例化我们的 FIFO IP 核,代码如图 7.12 所 示。 Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 159 图 7.12 在 Quartus II 软件中例化 FIFO 模块 从该图中我们可以看到,其实 FIFO IP 核和我们的 RAM IP 核使用方法是差不多的,在 RAM IP 核中我们需要写使能、写数据、读使能、读数据以及时钟和地址,在我们的 FIFO IP 核中,我 们则需要写使能、写数据、读使能、读数据,时钟,空标识、满标识,以及使用量。如果我们去 掉空标识、满标识和使用量这三个信号,我们可以看到我们的 FIFO IP 核剩下的信号是和 RAM IP 核一样的,唯一不同的是我们的 RAM IP 核读写操作需要地址,我们的 FIFO IP 核就不需要 使用地址,只要使能信号打开,时钟到来,数据就可以读出和写入,比我们的 RAM IP 核使用起 来简单。下面我们来看下 FIFO IP 核中的代码如代码 7.1 所示。 代码 7.1 Verilog_Ip_FIFO.v 源代码 1 module Verilog_Ip_FIFO 2( 3 CLK_50M,RST_N, 4 wrdata,rddata,wren,rden,time_cnt,usedw,full,empty 5 ); 6 7 input CLK_50M; 8 input RST_N; 9 output reg [5:0] time_cnt; 10 output reg [7:0] wrdata; 11 output [7:0] rddata; 12 output wren; 13 output rden; 14 output [4:0] usedw; http://www.fpga.gs/ 160 软件工具篇 §7 15 output full; 16 output empty; 17 reg [5:0] time_cnt_n; 18 reg [7:0] wrdata_n; 19 20 always @ (posedge CLK_50M or negedge RST_N) 21 begin 22 if(!RST_N) 23 time_cnt <= 1'b0; 24 else 25 time_cnt <= time_cnt_n; 26 end 27 28 always @ (*) 29 begin 30 if(time_cnt == 6'd63) 31 time_cnt_n = 1'b0; 32 else 33 time_cnt_n = time_cnt + 1'b1; 34 end 35 36 assign wren = (time_cnt >= 1'b0 && time_cnt <= 5'd31) ? 1'b1 : 1'b0; 37 38 always @ (negedge CLK_50M or negedge RST_N) 39 begin 40 if(!RST_N) 41 wrdata <= 1'b0; 42 else 43 wrdata <= wrdata_n; 44 end 45 46 always @ (*) 47 begin 48 if(time_cnt >= 1'b0 && time_cnt <= 5'd31) 49 wrdata_n = time_cnt; 50 else 51 wrdata_n = wrdata; 52 end 53 54 assign rden = (time_cnt >= 6'd32 && time_cnt <= 6'd63) ? 1'b1 : 1'b0; 55 56 FIFO FIFO_inst 57 ( 58 .clock (CLK_50M ), Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 161 59 .wrreq (wren ), 60 .data (wrdata ), 61 .rdreq (rden ), 62 .q (rddata ), 63 .empty (empty ), 64 .full (full ), 65 .usedw (usedw ) 66 ); 67 68 endmodule 从代码中我们可以看到,其实 FIFO IP 核的代码和 RAM IP 核的代码差不多的,我们只是在 RAM IP 核代码的基础上去掉了地址信号,然后添加了空标识、满标识和使用量这三个信号,该 代码实现的功能其实和我们的 RAM IP 核的代码是一样的,下面我们就来简单的给大家分析一 下:代码的前 19 行代码主要是声明端口和定义端口类型。第 20 行至第 35 行,这里面包含两个 always 模块,一个 always 模块是用于时序电路,一个 always 模块是用于组合电路,这个时序 电路和组合电路构成了一个计数器,该计数器从 0 计数到 63,当计数器等于 63 时,计数器就 会清零,从 0 开始继续计数。依次循环。下面我们再来看第 36 行,这个 assign 主要是用来生 成写使能信号 wren;第 38 至 52 行,这两个 always 模块用来生成我们写入到 FIFO IP 核中的 数据。第 54 行,这个 assign 主要是用来生成读使能信号,最后 56 至 66 行是用来例化 FIFO IP 核的。介绍完了代码,下面我们再来总结一下该代码主要实现了什么功能,该代码主要实现了先 往 FIFO IP 核中写入 32 数据,即 0~31;写完了 32 个数据之后,我们在将写入的 32 个数据读 出。说完了代码,接下来我们就可以编译工程,配置工程了,这里我们需要说明的是,FIFO IP 核通过开发板也是看不出它的实验效果的。 7.3.2 使用 ModelSim 软件仿真 FIFO IP 核 完成了 Quartus II 软件工程的建立,下面我们就来使用 ModelSim 软件仿真我们的 FIFO IP 核,首先我们利用 Quartus II 软件生成 Testbench 模板代码,然后我们在 Testbench 模板代码 的基础上进行修改,代码修改如图 7.13 所示。 http://www.fpga.gs/ 162 软件工具篇 §7 图 7.13 Testbench 激励代码编写 从该图中我们可以看出,我们这里的 Testbench 和 RAM IP 核中的 Testbench 是一样的, 由于我们,我们把代码写在了顶层模块中,所以我们的 Testbench 才不需要编写这么多代码。 修改好了代码,我们还需要将 Testbench 添加至我们的 Quartus II 软件的仿真设置中,添加好 以后,我们就可以点击 Quartus II 软件菜单栏中的找到【Tools】→【Run Simulation Tool】→ 【RTL Simulation】点击打开,弹出如图 7.14 所示页面。 图 7.14 FIFO IP 核写操作仿真波形图 从图中我们可以看出,写使能 wren 为高,读使能 rden 为低,也就是说,该操作是往 FIFO IP 核中写数据,由于 FIFO IP 核并没有地址信号,所以只要在写使能 wren 为高时,写数据 wrdata 就可以将数据写入到 FIFO 中。大家看 Cursor1 这条线,当 0 数据写入到了 FIFO 中后,这时, 空标识 empty 就由高变低,这意味着 FIFO 中有数据了,同时使用量 usedw 信号也将变为 1, Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 163 表示该 FIFO IP 核中存有一个数据。大家再来看 Cursor2 这条线,此时,写数据 wrdata 为 1, 使用量 usedw 信号为 2,表示该 FIFO IP 核中存有两个数据。Cursor3 也是如此,依次类推我 们将 0~31,也就是 32 个数据依次写入。如图 7.15 所示。 图 7.15 FIFO IP 核读操作仿真波形图 从图中我们可以看出,在 Cursor1 线时,我们往 FIFO IP 核中写入了数据 30,在 Cursor2 时,我们往 FIFO IP 核中写入了数据 31,此时由于 32 个数据已经写完,我们可以看到写使能 wren 由高变低,满标识 full 由低变高,使用量 usedw 变成了 0,写使能和满标识相信大家都能 够理解,但是使用量也许就有的朋友不理解了,为什么此时变成了 0,而不是 32 呢?这是因为 我们声明的 usedw 只有 5 位,也就是最大只能存入 31,当 usedw 为 32 时便有一位溢出,因此 为 0。写数据完成之后,我们接下来就开始读数据,此时,rden 将由低变高。在 Cursor3 时, 我们就可以看到,此时 rddata 为 0,由于 rddata 前面我们一直都是 0 所以有点不容易分辨,不 过我们可以从满标识 full 和使用量 usedw 的变化来看出确实从 FIFO IP 核中读出了数据。下面 我们再来看下 Cursor4,在 Cursor4 这条线上,我们可以清楚的看到,我们将 FIFO IP 核中的数 据读了出来,rddata 由 0 变为了 1,后面的数据依次类推也是如此,我们就不进一步说明了。 7.3.3 使用 SignalTap II 软件调试 FIFO IP 核 完成了 ModelSim 软件仿真 FIFO IP 核,接下来我们就需要使用 SignalTap II 软件对 FIFO IP 核进行调试,首先我们在 Quartus II 软件中创建一个 SignalTap II 调试文件,在 SignalTap II 调试文件中,我们利用节点发现器将 time_cnt、wren、wrdata、rden、rddata、full、empty 和 usedw 这八个信号添加至节点列表中,添加完成后,我们再将 wren 设置为上升沿触发,触发条 件设置好了之后,我们将采样时钟设置为 CLK_50M,将采样深度设置为 2K,如图 7.16 图 6.14 所示。 http://www.fpga.gs/ 164 软件工具篇 §7 图 7.16 SignalTap II 软件调试界面 设置好了之后,我们重新编译工程,通过 SignalTap II 页面,我们将.sof 文件下载至开发板, 然后我们点击 SignalTap II 页面中的开始调试按钮,SignalTap II 软件触发并弹出如图 6.15 所示 页面。 Zircon Opto-Electronic Technology CO.,Ltd. §7 IP 核之 FIFO 165 图 7.17 wren 写使能信号触发采样的波形图 从该图中我们可以看出,当 wren 为上升沿的时候,我们的 wrdata 依次往 FIFO 中写入了 32 个数据,这和我们的 ModelSim 仿真是一致的,这里我们就不再进一步进行说明了。下面我 们再来看一下读操作,如图 6.16 所示。 图 7.18 rden 读使能信号触发采样的波形图 http://www.fpga.gs/ 166 软件工具篇 §7 从该图中我们可以看出,当我们 rden 为上升沿的时候,我们的 rddata 从 FIFO 中依次读出 0~31 数据,同样也是和我们仿真看到的波形是一致的,至此,我们的 FIFO IP 核的内容就讲解 完了。 到了这里,我们的《软件工具篇》章节中的所有内容我们就讲解完了,在该篇中我们不仅讲 解了如何使用 Quartus II 软件、ModelSim 和 SignalTap II 软件,我们还讲解了 PLL、ROM、 RAM 和 FIFO IP 核的使用。这里我们只讲解了比较常用的几个 IP 核,在后续的教程中我们会讲 解更多 IP 核的使用教程。 Zircon Opto-Electronic Technology CO.,Ltd. 版权声明 (1) 南京锆石光电科技有限公司对其发行的或与合作公司共同发行的包括但不限于产品或 服务的全部内容拥有版权等知识产权,受法律保护。 (2) 所有产品及资料内容仅供用户学习使用。 (3) 未经本公司书面许可,任何单位及个人不得以任何方式或理由对上述产品、服务、信息、 材料的任何部分进行复制、修改、抄录或与其它产品捆绑使用、销售。 (4) 凡侵犯本公司版权等知识产权的,本公司必依法追究其法律责任。 声明单位:南京锆石光电科技有限公司

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。