Quartus FPGA设计流程

实验目的

  1. 熟悉FPGA设计流程;

  2. 熟悉Quartus设计软件的使用;

  3. 掌握Verilog HDL的模块、端口和持续赋值语句。

准备工作

安装FPGA设计软件

Quartus Prime的下载和安装见安装软件

下载实验材料、创建工程文件夹

实验材料的下载方法见下载实验材料

后文提到的实验材料名称均为适用于远程实验板或口袋实验板的实验材料,DE2-115开发板对应的实验材料名称如表 1,在后面也会以提示的形式给出。

表 1. 实验材料名称对照表
实验板 远程或口袋实验板 DE2-115开发板

文件夹

LabProject

LabPrj_DE2-115

顶层模块

LabBoard_TOP.v

DE2_115_TOP.v

时序约束

RemotePocket.sdc

DE2-115.sdc

工程配置脚本

RemotePocket.tcl

DE2-115.tcl

创建工程脚本

create_project_pocket.tcl

create_project_de2-115.tcl

新建一个文件夹作为工程文件夹,并将实验材料中的LabProject文件夹的内容复制到工程文件夹。同样要注意,工程文件夹的名称和路径均不能包含空格和汉字;也不建议把工程文件夹建在桌面上。学校实验室计算机通常安装硬盘保护系统,不要在被保护的硬盘分区创建工程文件夹,一般盘符靠后的如E盘是开放的。

Quartus软件安装路径不要有汉字和空格。

工程文件夹的名称和路径均不能包含汉字和空格。

实验步骤

新建工程

运行Quartus软件。点击菜单项File ➤ New Project Wizard…,出现introduction对话框。单击Next,进入Directory,name,Top-Level Entity设置对话框,选择前面创建的工程文件存放路径,输入工程名称和顶层模块名称。点击Next,进入Project Type对话框,选择Empty project。

点击Finish,完成工程创建。完成后,Quartus界面如图 1所示。

image
图 1. Quartus Prime界面

配置工程

导入设计文件

点击菜单项Project ➤ ADD/Remove Files in Project…,出现category Files对话框。该对话框用来将已存在的设计文件加入到工程中。点击 …​ 浏览按钮,选择已经拷贝到工程文件夹内的Design Files(LabBoard_TOP.vGlobalCLK.vpll.vWatchChain.svJutagScanChain.qxp),添加到工程中。这些文件是虚拟实验系统所需要的基础文件,用户不应该去修改它们,通常也无需理解其中的代码。

设置顶层模块

下拉Project Navigator右边的列表框,选择Files,如图 2(a),可以看到已添加到工程中的文件。右键点击LabBoard_TOP.v,在弹出菜单中选择Set as Top-Level Entity,将该文件设置为顶层模块,设置完成后的Hierarchy如图 2(b)。

image
图 2. 设置顶层模块
适用于DE2-115开发板的顶层模块文件名为DE2_115_TOP.v

设置输出路径

虽然设置输出路径不是必须,但可以使得工程文件夹的文件组织便于管理。点击菜单Assignments ➤ Settings或工具栏相应按钮,在打开的对话框Category栏选择Compillation Process Settings,在右边的设置项中勾选Save project output files in specified directory,在Directory name编辑框内输入“./output”。

选择硬件描述语言版本

接着在settings对话框Category栏的Compiler Settings下选择Verilog HDL Input,默认的Verilog版本是Verilog-2001,这里改为SystemVerilog。如果选择Verilog-2001,编译器将根据文件后缀名来决定使用的语言,“.v”是Verilog,“.sv”是SystemVerilog。

设置器件和引脚选项

点击菜单项Assignments ➤ Device…,出现Device对话框,根据使用的实验板在Device Family列表和Available devices列表中找到所用的FPGA器件。 远程实验板和口袋实验板的FPGA型号是Cyclone IV E系列的EP4CE6E22C8,DE2-115开发板的FPGA型号为EP4CE115F29C7。

在Device对话框中点击“Device and Pin Options …”按钮出现Device and Pin Options对话框,在对话框左侧Category列表中选择以下设置。

  • 选中“Programming Files”,勾选Raw Binary File (.rbf)。远程实验板及口袋实验板需要rbf文件作为FPGA编程文件。DE2-115实验板使用JTAG方式编程,无需勾选生成rbf文件。

  • 选中“Unused Pins”,设置为“As input tri-stated with weak pull-up”。

  • 选中“Dual-Purpose Pins”,将“nCEO”设置为“Use as regular I/O”。

设置约束条件

约束引脚是将顶层模块(LabBoard_TOP)的输入输出端口指定到FPGA器件的实际引脚。约束引脚有手工约束和导入约束文件两种方法。

为了节省时间,本实验采用运行tcl脚本文件的方法导入约束条件,实验材料的LabProject文件夹中提供了RemotePocket.tcl文件,将该文件拷贝到工程文件夹。点击 View ➤ Tcl Console 菜单项打开 “Tcl Console” 子窗口。点击Tools ➤ Tcl Scripts菜单项,在弹出的Tcl Scripts窗口中选择RemotePocket.tcl。 点击<Run>按钮执行该脚本文件,之后会弹出一个信息框提示“Tcl Script File …​ executed”。 但是,这并不代表执行成功了,如果出错,会在 “Tcl Console” 子窗口显示红色的错误信息,这也是要打开“Tcl Console” 子窗口的原因。常见的错误原因是工程路径中包含了空格或汉字。也可以手工检查是否执行成功,执行菜单Assignment ➤ Assignment Editor或者Assignment ➤ Pin Planner,打开的窗口内容如果是空的,说明没有执行成功。顺便说明,Assignment Editor和Pin Planner窗口也可以用于手工约束引脚。

  1. 实验材料中还包含了另一个tcl文件create_project_pocket.tcl,这里不要选择该文件。

  2. 只能运行工程文件夹下的tcl文件,如果Tcl Scripts窗口中没有出现RemotePocket.tcl,请检查该文件是否事先复制到了工程文件夹内。

  3. 适用于DE2-115开发板的脚本文件为DE2-115.tcl

实际上RemotePocket.tcl脚本文件不仅有引脚定义信息,还包含了前面通过图形界面所做的一些设置。此外,还有一种导入引脚约束的方法是用菜单Assignments ➤ Import Assignments导入qsf或csv等文件,本实验不做练习。

需要说明的是,本书的实验采用虚拟实验方式,同学们的设计并不直接使用顶层端口,但是仍然需要进行引脚约束,否则使用虚拟实验调试系统的时候会出现问题。

保存工程

至此新的工程框架才算真正建立完成,从上面的过程可以看出,工程的配置比较繁琐,需要花费一定的时间,而且稍有差错就会导致实验失败。所以要把本实验所建的工程保存好,以便后面的实验继续使用。执行菜单File ➤ Save Project和File ➤ Close Project保存工程后关闭工程。

如果自己创建的工程在后面的实验中出现问题,可以参阅“用脚本创建Quartus工程”,自动地创建工程。

打开工程

使用菜单项File ➤ Open Project重新打开前面创建的工程。

编译错误信息

点击Processing ➤ Start ➤ Start Analysis & Synthesis菜单项或工具栏相应按钮,使用Quartus软件内嵌的分析综合工具Analysis & Synthesis对设计进行逻辑综合。如果综合通过,任务流程区中Analysis & Synthesis步骤前面会显示绿色的勾;如果有语法错误,会显示红色的叉,同时在信息显示区会显示错误信息。

查找错误时,应从第一个错误信息看起,因为后面的错误有可能是由前面的错误引起的。应点击Error标签(红叉),翻到第一个错误信息,如图 3

image
图 3. Messages窗口的错误提示信息

“Error (12006): Node instance "Lab_inst" instantiates undefined entity "VirtualBoard". ”这个错误信息是说编译器没找到“VirtualBoard”这个模块。

很多初学者不习惯阅读错误信息,实际上学会读懂错误信息是很有用的。可以点鼠标右键将错误信息复制下来,百度看看过来人怎么说,慢慢地就能读懂了。或参阅本项目的常见编译错误

添加模块

添加已有的模块

用菜单项Project ➤ Add/Remove Files in Project… 打开添加文件对话框,点击 …​ 浏览按钮,将实验材料中的VirtualBoard.sv添加到工程。

如果希望用VHDL,实验材料也提供了VirtualBoard.vhd

再次Start Analysis & Synthesis,此时综合应该没有报错了。

新建模块

在以后的实验中,我们还会需要新建模块,这里一起介绍。点击菜单项File ➤ new…,出现新建源文件对话框,可以新建一个SystemVerilog HDL File或者Verilog HDL File等类型的设计文件。

设计输入

输入HDL设计代码

前面的综合虽然没有报错,但实际上VirtualBoard模块并没有设计内容。在编辑器中打开VirtualBoard.sv文件,如例 1所示,可以看到该模块只有端口定义。

例 1. 虚拟实验板模块
`default_nettype none 
module VirtualBoard (
    input  wire   CLOCK,      // 10 MHz Input Clock 
    input  wire  [19:0] PB,   // 20 Push Buttons, logical 1 when pressed
    input  wire  [35:0] S,    // 36 Switches
    output logic [35:0] L,    // 36 LEDs, drive logical 1 to light up
    output logic  [7:0] SD7,  // 8 common anode Seven-segment Display
    output logic  [7:0] SD6,
    output logic  [7:0] SD5,
    output logic  [7:0] SD4,
    output logic  [7:0] SD3,
    output logic  [7:0] SD2,
    output logic  [7:0] SD1,
    output logic  [7:0] SD0
); 

endmodule
例 1的VHDL版本(点击此行展开)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY  VirtualBoard IS
PORT (   
   CLOCK:in std_logic;                     -- 10MHz Input Clock 
   PB: in  std_logic_vector(19 downto 0);  -- 20 Push buttons, logical 1 when pressed
   S:  in  std_logic_vector(35 downto 0);  -- 36 Switches
   L:  out std_logic_vector(35 downto 0);  -- 36 LEDs, drive logical 1 to light up
   SD7:out std_logic_vector(7 downto 0);   -- 8 common anode Seven-segment Display
   SD6:out std_logic_vector(7 downto 0);
   SD5:out std_logic_vector(7 downto 0);
   SD4:out std_logic_vector(7 downto 0);
   SD3:out std_logic_vector(7 downto 0);
   SD2:out std_logic_vector(7 downto 0);
   SD1:out std_logic_vector(7 downto 0);
   SD0:out std_logic_vector(7 downto 0)); 
END VirtualBoard;

ARCHITECTURE  behav_VB OF  VirtualBoard IS

BEGIN


END behav_VB;

这个VirtualBoard模块可以想象成一个实验板,有1个时钟输入CLOCK, 20个按键PB,36个拨动开关S,36个指示灯L,8个七段数码管SD0~SD7。该模块命名为“VirtualBoard”的含义是“虚拟实验板”,在后面验证时我们会看到,“虚拟实验板”模块与实验调试软件的“虚拟面板”是相互对应的。

下面给VirtualBoard模块添加设计代码。首先用8个拨动开关S7~S0直接驱动七段数码管SD0的8个段,将下面的代码添加到例 1endmodule 之前。

例 2. 需添加的代码
   //开关7~0直接驱动数码管SD0的各个段
   assign SD0 = S[7:0];

   //开关11~8驱动指示灯L11~8的亮灭
   (1)

   //按键PB0驱动指示灯L18
   assign L[18] = PB[0];
1 在这里添加Verilog HDL的assign赋值语句,实现S11~S8控制L11~L8的亮灭。
例 2的VHDL版本(点击此行展开)
   --开关7~0直接驱动数码管SD0的各个段
   SD0 <= S(7 downto 0);

   --开关11~8驱动指示灯L11~8的亮灭
   (1)

   --按键PB0驱动指示灯L18
   L(18) <= PB(0);
1 在这里添加VHDL的赋值语句,实现S11~S8控制L11~L8的亮灭。

在以后的实验中,自己的设计也都是写在VirtualBoard模块中;前面使用LabProject中的LabBoard_TOP等文件建立的工程框架不需要修改。

编译整个工程

点击Processing ➤ Start Compilation菜单项或工具栏相应按钮,对设计进行全编译。编译成功后,Tasks任务流程区的各个步骤前显示绿色的勾,Project Navigator工程导航区中显示出模块间的层次结构,如图 4

image
图 4. 编译通过

output文件夹下找到生成的“xxx.rbf”文件,其中xxx是在建立工程时输入的工程名称;这个文件在验证时要用。

有的时候Analysis & Synthesis和Fitter都通过了,但是Assembler或Timing Analysis没有通过,此时只要在任务流程区双击该步骤重做一次,一般都能成功。

存档整个工程

点击Projec ➤ Archive Projectt菜单项,将整个工程存档,存档文件的扩展名为.qar。以后可以用Projec ➤ Restore Archived Project菜单项恢复存档的工程。当然,也可以用文件压缩工具将工程文件夹打包保存。使用Archive Project的好处是不会遗漏任何源文件,而且存档文件尺寸较小。

验证

通过这个实验熟悉了FPGA设计流程和Quartus设计软件的使用。设计完成后需要验证自己的设计是否正确,实验验证首先要将上面编译生成的编程文件下载到FPGA,然后对实验电路施加输入激励,并读回输出响应进行分析判断。传统实验验证方式使用实验板上的开关等元件施加输入,通过实验板上的指示灯、数码管等观察实验现象;本书使用虚拟实验调试软件进行实验验证,有本地实验和远程实验两种版本的实验软件,对应使用的实验电路板的不同(远程实验使用远程实验板,本地实验使用口袋实验板等),FPGA电路的加载方法也有所不同。请根据所使用的实验板和实验调试软件,阅读后面的实验验证流程。