手把手教你如何使用Multisim对Digilent FPGA开发板进行编程

作者:阿Q 来源:Digilent中文技术社区

FPGA正在逐渐成为EECS专业的同学们在校期间学习掌握的一项必备技能。无论是在课程实验、竞赛作品、科研项目还是未来求职过程中,拥有FPGA技能包对每一名电类工科生而言都会是一项不小的加分项。

对于想要学习着手开始学习FPGA的童鞋们,我们有一则坏消息和一则好消息。先说坏消息:现今每家FPGA厂商都有其专属的开发工具链,这也意味着要想对不同的FPGA开发板进行编程,你首先得熟悉掌握不同的开发工具链,而这往往并不简单。接下来的好消息你一定会眼前一亮:现在,你可以使用Multisim这一在电路实验中无处不在并广受欢迎的电路搭建与仿真工具来对多款Digilent FPGA开发板进行编程了!是的,你没有听错哦。只需要一些基本的设置,你所熟悉的Multisim就将成为助你探索FPGA奇妙世界的一项利器。

在今天分享的教程中,我们就将手把手一步步教你如何使用Multisim对Digilent FPGA开发板进行编程。如果你有兴趣,赶紧跟着我们一起来操作吧!

1.获取正确的工具
想要使用Multisim来对Digilent FPGA开发板进行编程,你首先得安装一些必要的软件:
● LabVIEW 2014或更新版本
● Multisim 14.0或更新版本
● Vivado 2014.4或更新版本

第一步记得先安装LabVIEW,这是由于Multisim的一些文件需要在装好LabVIEW的基础上才能实现交互运作。当上述每一个软件装好之后,记得重启电脑以使其生效。

在这里,我所安装的是LabVIEW 2016版,默认安装路径为:“C:\Program Files\National Instruments”而非“C:\Program Files (x86)\National Instruments”。由于Multisim会与LabVIEW产生交互,故而我选择将LabVIEW目录调整为“C:\Program Files (x86)\National Instruments”,以确保两个软件在同一目录下。

当前,Multisim支持对以下型号搭载Xilinx Aritx-7芯片的Digilent FPGA开发板进行编程,包括:
● Basys 3
● Nexys 4 DDR
● Arty A7
● CMOD A7

要想正确将Mulisim与Vivado实现关联,你同时需要下载安装相关的FPGA工具。点击「阅读原文」下载安装NI LabVIEW FPGA Vivado 2014.4工具包。

下载页中所推荐的“NI Download Manager”选项可以帮你获取一个较小的下载文件,在此基础上帮你再下载工具包所需的安装文件。对应的,“Browser Download”选项直接帮助你获取一个*.iso镜像下载文件,并随后会直接自动安装到你的电脑光驱上。这里你可以选择任意一种你喜欢的方式进行下载安装。

如果*.iso镜像文件下载完毕后没有自动进入安装程序,你可以在默认下载路径中双击它来启动安装程序。

点击“Next”然后输入安装文件包中所包含的任一序列号。我使用的是LabVIEW序列号。

之后软件会自动搜索更新文件。一路选择“Accept”,然后单击“Next”。

随后,点击“Next”以接受3 License Agreements 。

之后,再点击一次“Next”即可开始安装。

安装完毕之后,记得务必重启你的电脑。然后进入“C:\NIFPGA\programs\Vivado2014_4\data\xicom\cable_drivers\nt64\digilent”,单击运行“install_digilent.exe”文件以安装Digilent Adept程序(如果提示需要的话)。

到这里,所有的软件程序及关联组建就都安装完毕了。接下来我们开始进行Multisim编程部分的讲解。

2.FPGA“代码编写”概述
通常,用于FPGA芯片的代码我们都是通过硬件描述语言来编写,其中最为广泛使用的即是VHDL或Verilog。绝大多数的硬件描述语言都可归结为使用两种不同的设计理念来编写代码:结构性或行为性。上述两种方式指的不是某种特定的语言,而是思考如何编写代码的两种概念方法。当然,你也可以在同一个项目中,同时使用结构性与行为性两种方法,只要你觉得没有问题的话。

在行为性设计中,我们简单地阐述所想要做的编译操作,代码会自行在某一特定背景下以芯片能够理解的方式“施展它的魔力”。以下是一个带有进位的二位全加法器的代码示例:
// Verilog example of a behavioral design
module Full_Adder_behavioral(
input A,
input B,
input Cin,
output S,
output Cout
);

wire [1:0] sum;

// The next line makes it clear what we have. All three terms are added
// together, so we must have an adder. We've described the behavior of
// the circuit. Note the absence of any logic declarations like "AND" or "&".
assign sum = A + B + Cin;
assign S = sum[0];
assign Cout = sum[1];
endmodule

当你增加3位时,你所能获得的最大值为十进制的3,或二进制的11,因此在这里我们需要'sum'值对于'sum'位数而言是一个二位占位符。编译器明白“+”的意义,并创建了一个二进制代码来完成这一任务。S与Cout位被对应的分配给'sum'中的相应位数。

相对应的,结构性设计是一种对于“实现正确处理输入数据的精确逻辑”的明确描述,以下是对于同一全加法器的结构性描述代码示例:
// Verilog example of a structural design
module Full_Adder_structural(
input A,
input B,
input Cin,
output S,
output Cout
);

// Here we see the use of several logic gate structures. Without deciphering
// the logic, it would be difficult at best to know what exactly is going on
// just by glancing at the code. Now imagine a large project with 100s of
// lines of code to decipher.
wire w01 = A ^ B;
wire w02 = Cin & w01;
wire w03 = A & B;

assign S = w01 ^ Cin;
assign Cout = w02 | w03;

endmodule

在这一代码示例中,我们已经明确告知编译器我们是如何希望所输入的数据被逻辑处理的。编译器再一次“施展它的魔力”并以芯片能够理解的方式编译文件。

这里写了这么多是想告诉你:由于Multisim是一款使用图形进行电路设计的工具,故而我们将使用结构性设计方式来“编写”我们的代码,但这里我们将用的是图形而非文本语言。如何理解这句话?图1即为针对上述同一全加法器的Multisim实现(直接从Multisim画布中复制过来)。这次你会发现我们使用的是图形化的逻辑门:

通过上述方式,我们使用Multisim十分清晰地构建了一个逻辑电路。试想,如果想要视觉化地来描述电路的结构而不使用结构性编程方法的话,难道还能有其它第二种方法吗?

以上就是使用Multisim来对FPGA开发板进行编程的全部基础知识所需。下面让我们进一步瞅瞅如何来进行编程。

3.现在让我们用Multisim来编写一些代码
使用Multisim来对FPGA开发板编程,更像是在画画,只是你首先需要有设计思路。这里,我们还是从设计一个先前提到的二位全加法器开始。

打开Multisim,你会看到一个默认的空白画布(canvas),用以设计或仿真模拟电路。

将鼠标移动到左上角,单击“File”然后选择“New”。

弹出窗口中,点击顶端的“PLD design”按钮,然后点击底部的“Create”按钮。

下一个跳出的窗口会让你去选择你的配置文件。在这里,你可以选择各种Multisim所支持的Digilent FPGA开发板定义,这些都已经在软件安装过程中被加载入。此处,你可以从下拉框中选择一种标准定义,或是加载一个自定义的配置文件(如果你有的话),再或是创建一个空白的PLD项目。在这一教程中,我将使用的是Digilent Basys 3 FPGA开发板。在选择好对应的开发板后,点击“Next”。

在下一个窗口中,给你的项目取一个名字。然后点击下一步。

之后的一个窗口中,你可以选择你希望加入到项目中的开发板所对应的全部I/O外设。在我的项目中,我需要5个LED,3个开关,因此我选择LED0 → LED4 and SW0 → SW2。选择好之后,点击“Finish”。

现在,PLD项目会在Multisim窗口左侧的Design Toolbox(设计工具箱)中出现,同时canvas(画布)上会显示你所选择的I/O接口。

我们有两种放置组件的方式。第一种方式为点击工具栏中的AND门小图标。这会帮你打开组件选择窗口,并默认对应到"PLD Logic"组过滤器。第二种方式为点击顶部菜单栏中的“Place”按钮,然后选择"Component" ,同样会帮你打开组件选择窗口。

在此教程中,我们将使用基础逻辑门,所以我们在左侧菜单栏中选择它,并高亮你准备放置的第一个门。放置好之后,选择下一个门。重复操作放置,直到所有的都放置完毕。在这个二位全加法器中,我们需要2个XOR2,2个AND2,和1个OR2门。将所有的门连接起来。需要注意的是,在这里你可以更改接口的标签,但并不鼓励你这样做。

4.使用Multisim对FPGA开发板进行编程
下一步,我们将代码部署到FPGA中去。这里,我们首先要确保FPGA开发板通过USB线已经连上电脑,并将之开关打开。然后,点击Mulitisim菜单栏中的“Transfer”,并选择“Export to PLD...”。

在接下去的一个窗口,会提示有多个选项提示操作。勾选单选框选择“Program the connected PLD”。

之后的一个窗口,记得确保在选择框中点击选中“NI LabVIEW FPGA”工具选项。然后点击底部的“Finish”来对FPGA实现编程。实际操作中,我也尝试勾选了“Xilinx Vivado 2016.4”选项,发现也没有任何问题。

随后,Multisim会自动连接至Vivado以生成编程开发板所需的正确文件。整个过程需要持续几分钟。一旦以上步骤全部都完成之后,你的开发板就编程完毕了。

5.配置文件的一些注意事项
Multisim使用配置文件来实现与Vivado之间的通信。每一块开发板需要两个配置文件,一个是*.mspc扩展文件,还有一个*.ucf或*.xdc文件。如果你所用的是Basys 3或是Nexys 4 DDR开发板(非老版本的Nexys 4),上述这些文件往往会缺失或者不完整。这里给大家讲解一下如何添加或修改这些配置文件。如果你使用的是其它开发板,则这里你可以略过。

对于Nexys 4 DDR开发板而言,上述配置文件并非默认包含。所以这里第一步我们首先要确保断开Multisim。然后,点击「阅读原文」下载DigilentNexys4DDR.mspc文件。接着,转至配置文件所在的Multisim目录。路径名称应该类似于:“C:\Program Files (x86)\National Instruments\Circuit Design Suite 14.1\pldconfig”。找到之后,将所下载的两个配置文件放到这个文件夹中。打开Multisim,接下来你就可以参考前述步骤来对你的Nexys 4 DDR进行项目编程了。

Basys 3的配置文件在Multisim安装时会自动生成,但这一文件中缺失了一些定义。最简单的方法,同样你可以点击「阅读原文」下载DigilentBasys3.xdc 和 DigilentBasys3.mspc两个配置文件,然后将之前自动生成的Basys 3配置文件覆盖掉。与之前提到的方法一样,转至配置文件所在的Multisim目录,将下载好的两个文件拖到文件夹中覆盖掉原始文件。

在这里,如果你希望挑战一下自己来自行修改原始的Basys 3配置文件,下文将教你如何实现。当你在Multisim中打开一个新的PLD项目,并选择Basys 3作为你的开发板,其中会有几个I/O选项丢失。丢失的部分同时包括了VGA,RS-232,USB HID(PS/2),以及quad SPI flash的定义。见图1。Multisim使用配置文件来实现与Vivado之间的通信。每一块开发板需要两个配置文件,一个是*.mspc扩展文件,还有一个*.ucf或*.xdc文件。如果你所用的是Basys 3或是Nexys 4 DDR开发板(非老版本的Nexys 4),上述这些文件往往会缺失或者不完整。这里给大家讲解一下如何添加或修改这些配置文件。如果你使用的是其它开发板,则这里你可以略过。

对于Nexys 4 DDR开发板而言,上述配置文件并非默认包含。所以这里第一步我们首先要确保断开Multisim。然后,点击「阅读原文」下载DigilentNexys4DDR.mspc文件。接着,转至配置文件所在的Multisim目录。路径名称应该类似于:“C:\Program Files (x86)\National Instruments\Circuit Design Suite 14.1\pldconfig”。找到之后,将所下载的两个配置文件放到这个文件夹中。打开Multisim,接下来你就可以参考前述步骤来对你的Nexys 4 DDR进行项目编程了。

Basys 3的配置文件在Multisim安装时会自动生成,但这一文件中缺失了一些定义。最简单的方法,同样你可以点「阅读原文」下载DigilentBasys3.xdc 和 DigilentBasys3.mspc两个配置文件,然后将之前自动生成的Basys 3配置文件覆盖掉。与之前提到的方法一样,转至配置文件所在的Multisim目录,将下载好的两个文件拖到文件夹中覆盖掉原始文件。

在这里,如果你希望挑战一下自己来自行修改原始的Basys 3配置文件,下文将教你如何实现。当你在Multisim中打开一个新的PLD项目,并选择Basys 3作为你的开发板,其中会有几个I/O选项丢失。丢失的部分同时包括了VGA,RS-232,USB HID(PS/2),以及quad SPI flash的定义。

要想解决这一问题,我们需要修改这些已经安装好的配置文件。要想找到这些文件,第一步我们需要确保断开Multisim,然后打开Multisim的根目录文件夹。路径名称应该类似于:“C:\Program Files (x86)\National Instruments\Circuit Design Suite 14.1\pldconfig”。找到两个名为“DigilentBasys3”的文件。其中一个文件的扩展名为.xdc,另一个则为.mspc。

在开始下一步操作之前,务必记得复制这两个文件,并将之放到一个单独的目录文件夹中,比如你可以在桌面上为之新建一个文件夹。这样做的目的是为以防整个操作过程的结果失败,这样可以让你保留有原始文件以取得再次尝试的机会。在这里,我不建议你选择修改文件,除非你对自己的能力很有信心。这是因为错误的文件修改虽然不会对Multisim的操作性能产生影响,但是你所编程的开发板很可能会因此出现问题。

想要做这些修改,你需要用到文本编辑器,比如:Notepad++。记得不要去双击打开.mspc文件,这会直接打开Multisim,而这样做对我们毫无意义。你所要做的只是对文件中的真实文本进行修改,以使Multisim能够读取并加载正确的开发板配置文件。因此,这里你需要做的是右键点击.mspc文件,选择“Open with...”,在弹出菜单中选择你的文本编辑器以将之打开。.mspc文件往往以标记语言形式撰写,类似于HTML或XML。这种形式简单易懂,但这里我们需要对其进行一些修改。

我们无需对顶部的1-9行数据做任何的修改。我们需要关心的部分是所有标签之间的数据。每一个I/O引脚定义需要一些基本的参数。其中,“Name”需要与.xdc文件中的引脚名称保持一致。“Mode”决定了引脚是被定义为输入(“in”),输出(“out”),还是双向引脚(“bidir”)。“Location”则用来告诉Multisim在画布上以何种默认的方向来放置引脚。正常情况下,输入朝向左面,输出则朝向右面。“Place”选项则是一个布尔值标志,以用来告诉Multisim当你初次选择I/O引脚时,是否是默认选择。

这里,你可以自行根据需求添加缺失的引脚,或者可以简单地复制以下定义:

将上述文本复制黏贴入“JXA_”定义下方的.mspc文本文件。然后保存更新好的.mspc文件,确保该文件所在的位置为Multisim目录下的“pldconfig” 文件夹内。

下面,我们在文本编辑器中打开“Basys 3 .xdc”文件。在“JXA_”定义下方,增加以下行段:
##VGA Connector
set_property PACKAGE_PIN G19 [get_ports {vgaRed0}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed0}]
set_property PACKAGE_PIN H19 [get_ports {vgaRed1}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed1}]
set_property PACKAGE_PIN J19 [get_ports {vgaRed2}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed2}]
set_property PACKAGE_PIN N19 [get_ports {vgaRed3}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed3}]
set_property PACKAGE_PIN N18 [get_ports {vgaBlue0}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue0}]
set_property PACKAGE_PIN L18 [get_ports {vgaBlue1}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue1}]
set_property PACKAGE_PIN K18 [get_ports {vgaBlue2}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue2}]
set_property PACKAGE_PIN J18 [get_ports {vgaBlue3}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue3}]
set_property PACKAGE_PIN J17 [get_ports {vgaGreen0}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen0}]
set_property PACKAGE_PIN H17 [get_ports {vgaGreen1}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen1}]
set_property PACKAGE_PIN G17 [get_ports {vgaGreen2}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen2}]
set_property PACKAGE_PIN D17 [get_ports {vgaGreen3}]
set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen3}]
set_property PACKAGE_PIN P19 [get_ports Hsync]
set_property IOSTANDARD LVCMOS33 [get_ports Hsync]
set_property PACKAGE_PIN R19 [get_ports Vsync]
set_property IOSTANDARD LVCMOS33 [get_ports Vsync]

##USB-RS232 Interface
set_property PACKAGE_PIN B18 [get_ports RsRx]
set_property IOSTANDARD LVCMOS33 [get_ports RsRx]
set_property PACKAGE_PIN A18 [get_ports RsTx]
set_property IOSTANDARD LVCMOS33 [get_ports RsTx]

##USB HID (PS/2)
set_property PACKAGE_PIN C17 [get_ports PS2Clk]
set_property IOSTANDARD LVCMOS33 [get_ports PS2Clk]
set_property PULLUP true [get_ports PS2Clk]
set_property PACKAGE_PIN B17 [get_ports PS2Data]
set_property IOSTANDARD LVCMOS33 [get_ports PS2Data]
set_property PULLUP true [get_ports PS2Data]

##Quad SPI Flash
set_property PACKAGE_PIN D18 [get_ports {QspiDB0}]
set_property IOSTANDARD LVCMOS33 [get_ports {QspiDB0}]
set_property PACKAGE_PIN D19 [get_ports {QspiDB1}]
set_property IOSTANDARD LVCMOS33 [get_ports {QspiDB1}]
set_property PACKAGE_PIN G18 [get_ports {QspiDB2}]
set_property IOSTANDARD LVCMOS33 [get_ports {QspiDB2}]
set_property PACKAGE_PIN F18 [get_ports {QspiDB3}]
set_property IOSTANDARD LVCMOS33 [get_ports {QspiDB3}]
set_property PACKAGE_PIN K19 [get_ports QspiCSn]
set_property IOSTANDARD LVCMOS33 [get_ports QspiCSn]

然后保存上述更新好的.xdc文件,同样确保其在“pldconfig” 文件夹内。接着,我们重新回到“pldconfig” 文件,检查一下确保文件的修改日期与当前的时间一致,而非你安装Multisim时的时间。

当上述步骤都完成好之后,让我们回过头来检查一下,确保所做的所有努力都能行之有效。打开Multisim并启动一个新的PLD。现在,你会发现所有的板载I/O在配置操作步骤中,都能够正常显示并可供选择。

到这里,所有的步骤与注意事项就都完成啦!如你所见,使用Multisim对FPGA进行编程是如此地简单方便。你所需要的仅仅只是具有一定的逻辑电路工作原理的知识,而无需再去去学习掌握硬件描述语言了。如果你有兴趣,赶紧拿起开发板与Multisim跟着一步步尝试一下吧!

原文链接: http://www.digilent.com.cn/project/diy/128.html