当前位置:   article > 正文

简易CPU设计入门——使用Quartus II 13.1建立工程

quartus ii 13.1

在本节,我来演示一下,使用Quartus软件建立一个工程的步骤。想要建立一个工程,运行一个工程,不仅仅是需要Quartus软件,还需要配套的仿真软件ModelSim软件。所以,本节的内容,可能会比较长一些。

一.  建立工程文件夹

本步骤,大家可以跟我一起来操作。并且,我也比较建议大家和我一起来操作着。

首先呢,在你的电脑上,找到一个路径,在某某文件夹下面,新建一个文件夹。在这里,我将这个文件夹,命名为【me01】。注意,所选择的路径,和你所创建的文件夹的名字,不要有中文,空格,也不要有特殊字符。这个【me01】文件夹,它是作为我们的整个项目的存放路径。

第2步,在【me01】文件夹里面,新建四个文件夹,名字分别为【doc】,【project】,【rtl】和【sim】。在【doc】文件夹里面,可以存放着一个项目的各种文档,比如项目的波形图文档,项目的说明文档,各种需要引用的图片,word文件等等的文档。【project】文件夹,用于存放工程文件。使用Quartus软件建立项目,会形成一个后缀为【.qpf】的文件,这个文件,就是工程文件。我们要将工程文件存放在【project】里面。【rtl】文件夹,用于存放我们所编写的设计文件。【sim】文件夹,用于存放仿真文件。

一般地,我们去编写Verilog代码文件时,我们会将代码文件分为两种。一个叫做设计模块,另外一个叫做激励模块或者仿真模块。所谓的设计模块,就是我们的代码文件的正式的代码。这个代码,若是用于FPGA开发的话,可以将其写入FPGA开发板上面。若是用于写可以交付流片的代码,则设计模块是可以被制作出来的芯片所采用的逻辑代码。而激励模块或者仿真模块,则用于对设计模块的代码进行仿真模块。可以对设计模块中的某一个模块进行单独仿真,也可以对设计模块的顶层模块进行总体仿真。

为啥设计模块的代码,要存放在【rtl】文件夹里面,而不是将这个文件夹命名为【design】呢?

rtl的大写形式为RTL,英文全名为Register Transfer Level,翻译为寄存器传输级。在Verilog HDL硬件语言里面,一共有四种层次的代码抽象层级。由高到低,分别为行为级,数据流级,门极,开关级。其中,行为级也叫做算法级。

在四个抽象等级里面,开关级较少使用。门极,按照我的理解,可以使用它来优化一些个关键代码。但是,在真正的项目里面,是如何来使用门极代码的,我并不清楚。只是,按照我的理解,可以用门极代码,优化一些个关键代码。我的理解未必正确。

在平常使用Verilog HDL的时候,人们多是将行为级和数据流级结合在一起来使用。所以,人们就将行为级与数据流级结合起来使用的代码,起了一个名字,这个名字就叫做寄存器传输级,英文简写为RTL。所以,我们的项目里,以及许多的国内的FPGA开发板卖家的配套教程里面,都将设计模块的代码所在的文件夹,取名为【rtl】。

【sim】这个名字,其实就是ModelSim的简写而已,这个文件夹里面存放着ModelSim仿真文件。

建立好的文件夹结构如下图所示。

二.   编写设计模块的代码

在正点原子,野火等等的国内FPGA开发板销售厂家那里,常常会在其教程里面去讲波形图,流程图的绘制。在我这里,我目前并不擅长画图。并且,我自己在学习Verilog与FPGA的时候,我基本上是把Verilog当作是一种特殊的编程语言。同时,我也将FPGA的设计,芯片的设计,当作是一种编程活动,而不是将其当作是一门硬件课程。

之所以是这么来学习与看待Verilog与FPGA,那是因为,在学习Verilog与FPGA之前,我学习编程的时间比较久,经验更多一些。所以,对于FPGA与Verilog,我是将其当做一个编程语言来学习的。

正点原子,野火等等的厂家的教程里面,会去绘制波形图啥的。而我自己在学习相关的教程的时候,通常地,我看不懂里面的波形图。在学习和理解里面的代码逻辑的时候,我主要地,还是通过学习编程时候的方法,来理解代码逻辑。对于流程图,这个东西时很有用的。但是,在这里,我就暂时不去画了。因为我确实不咋会画。

关于设计模块,我只编写一个代码文件,文件名为【me01.v】。代码内容如下。

  1. module me01
  2. (
  3. input wire [9:0] num01,
  4. input wire [9:0] num02,
  5. output wire [9:0] sum
  6. );
  7. assign sum = num01 + num02;
  8. endmodule

在大家那里,请大家先打开自己电脑上的Notepad++软件。打开以后,首先来设置好代码格式。

第1步,依次点击【设置】,【首选项】菜单项,打开【首选项】对话框,如下图所示。

图1
图2

第2步,在图2的左侧一栏,有一个【新建】字样的东西,点击这个【新建】选项。结果如下图所示。

图3

在图3的右侧,是【新建文档】选项组的内容。也许大家那里的选项和我这里的不同。请大家和我的选项设置保持一致。为此,我再讲【新建文档】选项组里面的【格式(行尾)】和【编码】两个选项组分别专门截图,来更清晰地展示。

图4
图5

进行到了这里,我们的设置文档编码格式的工作就完成了。接下来呢,大家点击对话框下方的【关闭】按钮,关闭【首选项】对话框。

然后呢,大家依次点击【文件】,【新建】菜单项,新建一个文档,并将本小节上面的代码块的内容,输入到这个新建立的代码文档里面。当然了,为了省事一些,你也可以直接将本小节的代码块的内容,拷贝到新建的Notepad++文档里面。

接下来,大家依次点击【文件】,【另存为】菜单项,弹出【另存为】对话框,如下图所示。

图6

打开【另存为】对话框以后,首先呢,请大家在这个对话框里面,浏览到【me01】文件夹里面的【rtl】文件夹,进入【rtl】文件夹里面,如下图所示。

图7

在我这里,我是将整个的me01项目,设置在了【D:\doc\QuartusII-91\simple_teach\】路径下面。

我们还是来看【另存为】对话框。在另存为对话框下面,有一个【保存类型】字样。在它的右边,是一个可以选择东西的框框。如下图所示。

图8

在图8的红色框线所示的位置,是保存类型一栏与这一栏右边的选择框。这一栏,是用来设置保存文件的类型的。我们点击【保存类型】字样右边的选择框,弹出来一个列表,如下图所示。

图9

在弹出来图9这个列表的时候,我们将鼠标滚轮往上滚动,会显示出【All types】字样的列表选项。点击这个列表项,如下图所示。

图10
图11

在图11的红色框线的上方,是【文件名】一栏。此时,我们在【文件名】一栏的右边的输入框里面,将默认的文档名,修改为【me01.v】,结果如下图所示。

图12

检查一下我们之前所设置的保存路径与文件名,保存类型啥的,如果确认无误,则点击【另存为】对话框右下方的保存按钮,如下图所示。

图13

到了这里,设计模块,我们就算是完成了。

三.  编写激励模块的代码

编写激励模块代码,也需要设置编码格式,新建文档,保存文档之类的操作。设置编码格式,新建,编辑,保存的方法,本篇文章的第二节已经是讲过了,大家可以参照第二节的方法来进行相关操作。其中,对于设置编码格式,如果你在第二节已经设置好了编码格式,并且,此后,你也并未修改过Notepad++的编码格式,那么,在进行本步骤的时候,你也不需要单独地来设置编码格式。

在这里,我们的重点,是将激励模块的代码给贴出来。内容如下。

  1. module tb_me01();
  2. reg [9:0] num01;
  3. reg [9:0] num02;
  4. wire [9:0] sum;
  5. initial
  6. begin
  7. num01 = 100;
  8. num02 = 200;
  9. end
  10. me01 inst
  11. (
  12. .num01(num01),
  13. .num02(num02),
  14. .sum(sum)
  15. );
  16. endmodule

接下来,请大家自己将其拷贝到你自己的Notepad++文档里面,将代码文件命名为【tb_me01.v】,保存的路径,为【me01】项目文件夹的【sim】文件夹下面。

保存好了代码以后,我们可以关闭Notepad++了。

在这里,我们是先进行的是编写和保存代码文件。接下来,我们要去进行的,是在Quartus软件里面,建立工程,并将我们已经编写好的代码文件给导入Quartus软件当中。

四.   在Quartus软件里建立工程和导入代码文件

到了这里,请大家打开Quartus II 13软件。我这里的软件版本是13.1,你那里,你使用13.0也可以。软件的安装,不会的话,可以到淘宝网里面找店家来帮你安装。

打开了Quartus软件以后,接下来,我们一起来建立工程,将我们前面所写的几个代码,都给添加到我们的项目里面。

第1步,依次点击【File】,【New】菜单项,如下图所示。

图14

接下来,软件会弹出一个对话框,如下图所示。

图15

第2步,在图15里面,最上方的项目为【New Quartus II Project】,鼠标单击选中这一项,然后点击下方的【OK】按钮,弹出新建项目的向导对话框,结果如下图所示。

图16

第3步,如图16所示,这是【新建项目向导】对话框,也就是【New Project Wizard】对话框的第1个界面。在这个界面里,我们点击【Next】按钮。结果如下图所示。

图17

第4步,图17是【New Project Wizard】对话框的第2个界面。在这里,我们需要设置项目的存放位置,项目名。在图17里面,有三个输入框。其中,我们只需要设置上面和中间的输入框。最下面的输入框,我们一般不需要自己去手动设置。因为,我们设置第2个输入框的时候,第3个输入框会自动跟随着第2个输入框的内容。

在这个界面里,上面的输入框,是用来设置项目的存放路径的。中间的输入框,是用来设置项目名称的。

在英文里面项目和工程都叫做【project】,所以,我无论是说项目,还是说工程,其实说的都是一个意思。无论你是在学习着编程,学习设计FPGA,还是学习PhotoShop,3ds max等等,一般地,项目或工程,都是一个意思,都是对应着英文中的【project】。

在这里呢,我们首先来点击上面的输入框右边的【...】小方块按钮,打开【选择文件夹】对话框。如下图所示。

图18

在图18所示的【选择文件夹】对话框里面,我们需要浏览到【me01】文件夹里面的【project】文件夹,如下图所示。

图19

要注意哦,如图19里面的红色框线所示,我们需要浏览到的位置,是【me01】文件夹里面的【project】文件夹,而不是说浏览到【me01】文件夹。请大家注意这一点。确认了浏览的位置正确以后,点击图19下方的【选择文件夹】按钮,结果如下图所示。

图20

如红色框线所示,当我们在前面的【选择文件夹】对话框中,设置好了位置以后,在图20所示的界面里,上面的输入框也就会出现我们刚刚所设置的项目路径了。

接下来,我们可以直接在中间的输入框中输入项目名。我们的项目名是【me01】,所以呢,直接在中间的输入框里面输入【me01】,结果如下图所示。

标题

输入项目名的过程中,我们发现,中间的输入框和下面的输入框是同时变化的。

接下来,我们点击下方的【Next】按钮。结果如下图所示。

图22

第5步,图22所示的界面,它是允许我们在这个界面,直接导入已经写好的代码。在这里,我们暂时不去添加代码。点击下方的【Next】按钮,结果如下图所示。

图23

第6步,图23所示的界面,它是让我们选择FPGA芯片的型号。在这里,我们所设计的CPU,仅仅是运行在ModelSim仿真软件中,不需要将CPU代码写入FPGA芯片中,所以,这个界面,我们保持默认就可以了。

我本人,目前是学习过淘宝店家【小月电子】的一个开发板,兼容野火的。大家如果还没有学习过某一款FPGA开发板的话,我比较建议大家先去学习一下某一个开发板。如果你此时已经是具备了某一款开发板的配套教程的基础的话,那是最好不过了。

接下来,我们在图23上面,保持默认,点击【Next】按钮。结果如下图所示。

图24

第7步,图24所示的界面,我们保持默认即可,点击【Next】按钮,结果如下图所示。

图25

第8步,在图25界面里,它是列举了我们在新建项目向导对话框里面所选择的各个步骤的情况,是一个选择清单。在这里,我们点击【Finish】按钮,回到软件主界面。

第9步,我们找到软件左上方的一个区域,如下图所示。

图26

在图26里面,在下方的红色框线位置附近,显示了三个选项卡,有【Hierarchy】选项卡,【Files】选项卡和【Design Units】选项卡。我们还可以点击右侧的左右三角号,以导航各个选项卡。在这里,我们点击红色框线所示的【Files】选项卡,结果如下图所示。

图27

第10步,在图27所示的【Files】选项卡界面的上方,红色框线所示的【Files】字样下面,没有任何文件。这是因为,此时,我们刚刚建立好工程,且没有往工程里添加任何文件。所以,此时,红色框线所示的【Files】的下面是空的。接下来,我们首先用鼠标左键点击一下红色框线所示的【Files】字样,以选中它,然后呢,点击鼠标右键,结果如下图所示。

图28

第11步,在图28里面,弹出了一个只有单条菜单项的鼠标右键快捷菜单,我们点击它,结果如下图所示。

图29

第12步,图29所示的对话框,为【Settings】对话框。这个对话框很有用。如果大家是跟着教程操作到这里的,那么,你应该和我一样,在这个对话框的左侧的侧边栏,选中的是【Files】选项。

如果在你那里,右侧上方的蓝色高亮显示的长条里面的白色的文字,是【Files】,则证明我们的选择是正确的。

在这个【Files】选项界面里,有一个输入框,它的左侧的标签名为【File name】,我们点击这个输入框右侧的【...】小方框按钮,弹出【Select File】对话框,结果如下图所示。

图30

第13步,在图30所示的选择文件对话框里面,我们要浏览到我们之前所写的【me01.v】代码文件。这个文件的位置是在【me01】文件夹里面的【rtl】文件夹里面,浏览到【me01】里面的【rtl】文件夹,结果如下图所示。

图31

在图31所示的对话框里面,我们已经是看到了me01.v了。鼠标左键点击【me01.v】这个代码文件,然后点击下方的【打开】按钮,结果如下图所示。

图32

我们刚刚浏览的me01.v文件的路径,出现在了【File name】输入框里面。为了将这个我们刚刚浏览到的【me01.v】代码文件添加到项目里面,我们点击图32的输入框右边的【Add】按钮,结果如下图所示。

图33

在图33里面,我们看到,输入框右边的文件路径名不见了,而是转到了下面的框框里面。

接下来呢,我们点击下方的【Ok】按钮,这样的话,这个【me01.v】文件,我们就添加好了。

第14步,我们还是来看一看界面左上方的【Files】选项卡里面的内容,如下图所示。

图34

在图34中,我们看到,红色框线的下方,出现了【me01.v】的文件路径。证明说,我们确实是已经在项目里面添加了【me01.v】代码文件。

接下来呢,我们还需要把【tb_me01.v】也给添加进来。添加的步骤,跟添加【me01.v】的步骤差不多,只不过,tb_me01.v,位于【me01】文件夹的【sim】文件夹里面。请大家自己去添加【tb_me01.v】文件。添加好了以后,结果如下图所示。

图35

第14步并不难。当然了,你如果没有看懂,你可以 联系我,我可以远程帮你看看。我相信,你应该是可以独立完成这一步的。

经过了以上的步骤,建立项目,添加文件的步骤,就算是完事了。接下来,我们来进行下一个环节。

五.   设置测试平台

在这里,我来说一说测试平台的概念。我们在编写Verilog代码的时候,我们一般是将整个的项目分为两大块,一个是设计快,另外一个是激励块。激励块也叫做测试块。

这个测试平台,英文表述为test bench。

我们之前给项目文件取名的时候,我们将设计快的文件命名为【me01.v】。而对于测试块文件,我们将其命名为【tb_me01.v】。【tb】就是【test bench】的首字母的缩写,然后呢,跟着一个下划线,再然后就是【me01.v】了。

测试块代码文件我们算是编写好了。然而,我们还需要去设置测试平台,需要对代码进行编译,最后是运行仿真。

接下来,我们就开始去设置测试平台。

第1步,依次点击【Assignments】,【Settings】菜单项,如下图所示。

图36
图37

第2步,如图37所示,我们又见到了【Settings】对话框。接下来,我们点击左侧的侧边栏的【Simulation】选项,结果如下图所示。

图38

第3步,点击红色框线位置的输入框,弹出一个列表。结果如下图所示。

图39

第4步,图39中的列表框中的各个选项,是用来设置仿真平台的。在这里,我们用鼠标左键点击选择【ModelSim】一项,结果如下图所示。

图40

第5步,在图40里面,我们点击红色框线所示的单选按钮【Compile test bench】,然后点击右侧的【Test Benches】按钮,结果如下图所示。

图41

第6步,在图41所示的对话框里面,我们可以添加,修改,删除测试设置项目。此处,我们需要添加我们的第1个,也是唯一的一个测试项目。

点击右侧的【New】按钮,结果如下图所示。

图42

第7步,在图42所示的【New Test Bench Settings】对话框里面,我们首先要去设置上面的两个输入框。上面的两个输入框,一般地,我们只需要去设置其中一个就好了。

在上面的两个输入框里面,第一个输入框,用于指定测试设置项目的名字,第二个输入框,用于指定测试平台的顶层模块名称。一般地我们在第一个输入框里面,直接输入测试平台的顶层模块名就好了。第一个输入框设置好了以后,第二个输入框,会同步设置与第一个输入框相同的内容的。

在这里,我们的测试平台的顶层模块名为【tb_me01】,所以,输入它就可以了,结果如图所示。

图43

第8步,在图43里面,我们在下面的红色框线所示的单选按钮上,点击一下鼠标右键,激活这一选项,结果如下图所示。

图44

第9步,在图44里面,在红色框线所示的位置里面,首先在左侧的输入框里面,输入【100】,然后点击一下右边的框,弹出的列表里面选择【ns】,结果如下图所示。

图45

第10步,在图45里面,上面的红色框线显示了上一步的操作结果。接下来,我们点击下面的红色框线所示的【...】小方块按钮,弹出一个对话框,在弹出的对话框里面,我们浏览到【me01】文件夹的【sim】文件夹里面的【tb_me01.v】代码文件,并且要点击选中它,结果如图所示。

图46

第11步,在图46里面,点击右下角的【Open】按钮,结果如下图所示。

图47

第12步,在图47里面,在红色框线的位置,我们看到,【tb_me01.v】文件所对应的路径,已经是显示在这个输入框里面了。接下来,我们点击右侧的【Add】按钮,输入框里的路径,就会被添加到下方的框框里面。然后呢,我们点击【OK】按钮,过程如下图所示。

图48
图49

第13步,在图49里面,我们继续点击【OK】按钮。结果如下图所示。

图50

第14步,继续点击【OK】按钮。完成测试平台的设置工作。

六.   编译代码

接下来,我们编译代码。

我们找一找软件界面的左侧中间的位置,如下图所示。

图51

在图51里面,我们先用鼠标左键点击一下红色框线所示的位置,以选中【Analysis & Synthesis】选项,然后,点击鼠标右键,弹出一个鼠标右键菜单,选择这个右键菜单中的【Start】选项,过程如下图所示。

图52
图53

如果设计快的代码没有错误,则图53中的【Analysis & Synthesis】和【Analysis & Elaboration】两行的左边,会显示有绿色的对号标记。除此之外,也会在整个软件的下面,显示着类似于下图所示的信息。

图54

在图54里面,重点关注着红色框线所示的位置,显示有多少条警告和多少条错误。如果有错误,则需要去根据提示,来修改错误,知道错误的条数为零。而对于警告的数目,很多时候,我们可以忽略警告信息。

我们当前的这个【me01】项目,我已经是调试好了,所以,代码没有问题。在图53里面,我们也没有收到错误信息。那么,编译的步骤,我们就讲完了。

接下来,我们来看最后的一个步骤,运行仿真。

七.运行仿真

接下来,我们就需要去运行仿真了。这个仿真步骤,我们是在Quartus里面,点击了仿真命令以后,启动第三方软件ModelSim软件,在ModelSim里面,观察仿真结果的。

为了能够做到说,我们点击了仿真命令以后,软件能够启动第三方软件【ModelSim】,我们需要首先设置好【ModelSim】软件与【Quartus】软件的关联。关联的方法,我在本专栏的其他文章里面,已有讲解。就是如下链接所指示的文章。

https://blog.csdn.net/2401_82825368/article/details/140002077?spm=1001.2014.3001.5501

如果你已经了解了设置两款软件相互关联的方法,那么,链接中所指示的内容,你就不必去看了。如果还不会的话,那么,我建议你去看一看。

设置好了【Quartus】与【ModelSim】的关联以后,我们开展仿真操作。

第1步,依次点击【Tools】,【Run Simulation Tool】,【RTL Simulation】菜单项,过程如下图所示。

图55
图56

第2步,图56,是我这里的ModelSim软件稳定下来的画面。接下来,我们需要来看一看下方的几个选项卡,如下图所示。

图57

如图57所示,有好几个选项卡。其中呢,我们重点要去关注的,是【Wave】选项卡。我这里,确实是能够看到这个选项卡。你那里,也许有这个选项卡,也许没有。如果没有的话,你的【ModelSim】软件稳定下来以后的界面可能如下所示。

图58

在图58的右上方,有一个如下图所示的界面。

图59

在图59里面,我们点击一下红色框线所示的【+】图标,结果如下图所示。

图60

在图60里面,在下方,又出现了那几个选项卡,且白色高亮选中的选项卡为【Wave】选项卡。

如果,你的ModelSim稳定下来以后,停在了图57所示的界面,且下方的选项卡里面,白色高亮选中的不是【Wave】,那么,你就需要手动地点击选中【Wave】选项卡了。

最终呢,我们需要令软件停在图60所示的界面上。

在这里,我不知道你的电脑上的显示结果是怎样的。如果,这一步,你没有看懂,那么,你可以联系我,我来帮你看一看。如果,你的操作很顺利,那么,我们就接着往下进行。

第3步,我们在图60所示界面的基础上,找到下图所示的区域。

图61

在上图中,最左边一栏里,有三行,它们分别对应着test bench代码文件中的三个变量,它们分别是num01,num02和sum。在这里,num01和num02都是加数,sum是两个加数的和。

接下来,我们来看一看结果是否正确。

第4步,我们来看一看下图中的红色框线的位置。

图62

在图62里面,红色框线里面所示的三个数,都是16进制数,有点不方便观察,我们将其改为10进制数。

我们点击下图所示的红色框线的位置,如下图所示。

图63

在图63里面,其实我们是点击了num01变量的位置。点击选中以后,点击鼠标右键,弹出一个右键菜单,如下图所示。

图64

在图64所示的右键菜单里面,我们依次点击【Radix】,【Decimal】菜单项,如下图所示。

图65
图66

如图66所示,红色框线的位置,显示为十进制数【100】了。

其实,十六进制数16'h064所对应的十进制数,正是100。

接下来,请大家自己将num02,sum,分别将它们的进制,由16进制更改为十进制。这个操作难度不高。如果不会,你可以来联系我。

结果如下。

图67

在图67里面,请大家看一下红色框线所示的三行数。第1行是100,它是num01的值。第2行是200,它是num02的值。第3行是300,它是sum的值。

结果正确。

这样子一来,本节就算是结束了。

结束语

本节的内容不少。请大家耐心地学完。有不懂的,可以问我。祝大家学习愉快,再见。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/998067
推荐阅读
相关标签
  

闽ICP备14008679号