FPGA正在逐漸成為EECS專業(yè)的同學們在校期間學習掌握的一項必備技能。無論是在課程實驗、競賽作品、科研項目還是未來求職過程中,擁有FPGA技能包對每一名電類工科生而言都會是一項不小的加分項。
對于想要學習著手開始學習FPGA的童鞋們,我們有一則壞消息和一則好消息。先說壞消息:現(xiàn)今每家FPGA廠商都有其專屬的開發(fā)工具鏈,這也意味著要想對不同的FPGA開發(fā)板進行編程,你首先得熟悉掌握不同的開發(fā)工具鏈,而這往往并不簡單。接下來的好消息你一定會眼前一亮:現(xiàn)在,你可以使用Multisim這一在電路實驗中無處不在并廣受歡迎的電路搭建與仿真工具來對多款Digilent FPGA開發(fā)板進行編程了!是的,你沒有聽錯哦。只需要一些基本的設置,你所熟悉的Multisim就將成為助你探索FPGA奇妙世界的一項利器。
在今天分享的教程中,我們就將手把手一步步教你如何使用Multisim對Digilent FPGA開發(fā)板進行編程。如果你有興趣,趕緊跟著我們一起來操作吧!
1.獲取正確的工具
想要使用Multisim來對Digilent FPGA開發(fā)板進行編程,你首先得安裝一些必要的軟件:
● LabVIEW 2014或更新版本
● Multisim 14.0或更新版本
● Vivado 2014.4或更新版本
第一步記得先安裝LabVIEW,這是由于Multisim的一些文件需要在裝好LabVIEW的基礎上才能實現(xiàn)交互運作。當上述每一個軟件裝好之后,記得重啟電腦以使其生效。
在這里,我所安裝的是LabVIEW 2016版,默認安裝路徑為:“C:\Program Files\National Instruments”而非“C:\Program Files (x86)\National Instruments”。由于Multisim會與LabVIEW產(chǎn)生交互,故而我選擇將LabVIEW目錄調(diào)整為“C:\Program Files (x86)\National Instruments”,以確保兩個軟件在同一目錄下。
當前,Multisim支持對以下型號搭載Xilinx Aritx-7芯片的Digilent FPGA開發(fā)板進行編程,包括:
● Basys 3
● Nexys 4 DDR
● Arty A7
● CMOD A7
要想正確將Mulisim與Vivado實現(xiàn)關聯(lián),你同時需要下載安裝相關的FPGA工具。點擊「閱讀原文」下載安裝NI LabVIEW FPGA Vivado 2014.4工具包。
下載頁中所推薦的“NI Download Manager”選項可以幫你獲取一個較小的下載文件,在此基礎上幫你再下載工具包所需的安裝文件。對應的,“Browser Download”選項直接幫助你獲取一個*.iso鏡像下載文件,并隨后會直接自動安裝到你的電腦光驅(qū)上。這里你可以選擇任意一種你喜歡的方式進行下載安裝。
如果*.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程序(如果提示需要的話)。
到這里,所有的軟件程序及關聯(lián)組建就都安裝完畢了。接下來我們開始進行Multisim編程部分的講解。
2.FPGA“代碼編寫”概述
通常,用于FPGA芯片的代碼我們都是通過硬件描述語言來編寫,其中最為廣泛使用的即是VHDL或Verilog。絕大多數(shù)的硬件描述語言都可歸結(jié)為使用兩種不同的設計理念來編寫代碼:結(jié)構(gòu)性或行為性。上述兩種方式指的不是某種特定的語言,而是思考如何編寫代碼的兩種概念方法。當然,你也可以在同一個項目中,同時使用結(jié)構(gòu)性與行為性兩種方法,只要你覺得沒有問題的話。
在行為性設計中,我們簡單地闡述所想要做的編譯操作,代碼會自行在某一特定背景下以芯片能夠理解的方式“施展它的魔力”。以下是一個帶有進位的二位全加法器的代碼示例:
// 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‘位數(shù)而言是一個二位占位符。編譯器明白“+”的意義,并創(chuàng)建了一個二進制代碼來完成這一任務。S與Cout位被對應的分配給’sum‘中的相應位數(shù)。
相對應的,結(jié)構(gòu)性設計是一種對于“實現(xiàn)正確處理輸入數(shù)據(jù)的精確邏輯”的明確描述,以下是對于同一全加法器的結(jié)構(gòu)性描述代碼示例:
// 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
在這一代碼示例中,我們已經(jīng)明確告知編譯器我們是如何希望所輸入的數(shù)據(jù)被邏輯處理的。編譯器再一次“施展它的魔力”并以芯片能夠理解的方式編譯文件。
這里寫了這么多是想告訴你:由于Multisim是一款使用圖形進行電路設計的工具,故而我們將使用結(jié)構(gòu)性設計方式來“編寫”我們的代碼,但這里我們將用的是圖形而非文本語言。如何理解這句話?圖1即為針對上述同一全加法器的Multisim實現(xiàn)(直接從Multisim畫布中復制過來)。這次你會發(fā)現(xiàn)我們使用的是圖形化的邏輯門:
通過上述方式,我們使用Multisim十分清晰地構(gòu)建了一個邏輯電路。試想,如果想要視覺化地來描述電路的結(jié)構(gòu)而不使用結(jié)構(gòu)性編程方法的話,難道還能有其它第二種方法嗎?
以上就是使用Multisim來對FPGA開發(fā)板進行編程的全部基礎知識所需。下面讓我們進一步瞅瞅如何來進行編程。
3.現(xiàn)在讓我們用Multisim來編寫一些代碼
使用Multisim來對FPGA開發(fā)板編程,更像是在畫畫,只是你首先需要有設計思路。這里,我們還是從設計一個先前提到的二位全加法器開始。
打開Multisim,你會看到一個默認的空白畫布(canvas),用以設計或仿真模擬電路。
將鼠標移動到左上角,單擊“File”然后選擇“New”。
彈出窗口中,點擊頂端的“PLD design”按鈕,然后點擊底部的“Create”按鈕。
下一個跳出的窗口會讓你去選擇你的配置文件。在這里,你可以選擇各種Multisim所支持的Digilent FPGA開發(fā)板定義,這些都已經(jīng)在軟件安裝過程中被加載入。此處,你可以從下拉框中選擇一種標準定義,或是加載一個自定義的配置文件(如果你有的話),再或是創(chuàng)建一個空白的PLD項目。在這一教程中,我將使用的是Digilent Basys 3 FPGA開發(fā)板。在選擇好對應的開發(fā)板后,點擊“Next”。
在下一個窗口中,給你的項目取一個名字。然后點擊下一步。
之后的一個窗口中,你可以選擇你希望加入到項目中的開發(fā)板所對應的全部I/O外設。在我的項目中,我需要5個LED,3個開關,因此我選擇LED0 → LED4 and SW0 → SW2。選擇好之后,點擊“Finish”。
現(xiàn)在,PLD項目會在Multisim窗口左側(cè)的Design Toolbox(設計工具箱)中出現(xiàn),同時canvas(畫布)上會顯示你所選擇的I/O接口。
我們有兩種放置組件的方式。第一種方式為點擊工具欄中的AND門小圖標。這會幫你打開組件選擇窗口,并默認對應到“PLD Logic”組過濾器。第二種方式為點擊頂部菜單欄中的“Place”按鈕,然后選擇“Component” ,同樣會幫你打開組件選擇窗口。
在此教程中,我們將使用基礎邏輯門,所以我們在左側(cè)菜單欄中選擇它,并高亮你準備放置的第一個門。放置好之后,選擇下一個門。重復操作放置,直到所有的都放置完畢。在這個二位全加法器中,我們需要2個XOR2,2個AND2,和1個OR2門。將所有的門連接起來。需要注意的是,在這里你可以更改接口的標簽,但并不鼓勵你這樣做。
4.使用Multisim對FPGA開發(fā)板進行編程
下一步,我們將代碼部署到FPGA中去。這里,我們首先要確保FPGA開發(fā)板通過USB線已經(jīng)連上電腦,并將之開關打開。然后,點擊Mulitisim菜單欄中的“Transfer”,并選擇“Export to PLD.。.”。
在接下去的一個窗口,會提示有多個選項提示操作。勾選單選框選擇“Program the connected PLD”。
之后的一個窗口,記得確保在選擇框中點擊選中“NI LabVIEW FPGA”工具選項。然后點擊底部的“Finish”來對FPGA實現(xiàn)編程。實際操作中,我也嘗試勾選了“Xilinx Vivado 2016.4”選項,發(fā)現(xiàn)也沒有任何問題。
隨后,Multisim會自動連接至Vivado以生成編程開發(fā)板所需的正確文件。整個過程需要持續(xù)幾分鐘。一旦以上步驟全部都完成之后,你的開發(fā)板就編程完畢了。
5.配置文件的一些注意事項
Multisim使用配置文件來實現(xiàn)與Vivado之間的通信。每一塊開發(fā)板需要兩個配置文件,一個是*.mspc擴展文件,還有一個*.ucf或*.xdc文件。如果你所用的是Basys 3或是Nexys 4 DDR開發(fā)板(非老版本的Nexys 4),上述這些文件往往會缺失或者不完整。這里給大家講解一下如何添加或修改這些配置文件。如果你使用的是其它開發(fā)板,則這里你可以略過。
對于Nexys 4 DDR開發(fā)板而言,上述配置文件并非默認包含。所以這里第一步我們首先要確保斷開Multisim。然后,點擊「閱讀原文」下載DigilentNexys4DDR.mspc文件。接著,轉(zhuǎn)至配置文件所在的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配置文件覆蓋掉。與之前提到的方法一樣,轉(zhuǎn)至配置文件所在的Multisim目錄,將下載好的兩個文件拖到文件夾中覆蓋掉原始文件。
在這里,如果你希望挑戰(zhàn)一下自己來自行修改原始的Basys 3配置文件,下文將教你如何實現(xiàn)。當你在Multisim中打開一個新的PLD項目,并選擇Basys 3作為你的開發(fā)板,其中會有幾個I/O選項丟失。丟失的部分同時包括了VGA,RS-232,USB HID(PS/2),以及quad SPI flash的定義。見圖1。
Multisim使用配置文件來實現(xiàn)與Vivado之間的通信。每一塊開發(fā)板需要兩個配置文件,一個是*.mspc擴展文件,還有一個*.ucf或*.xdc文件。如果你所用的是Basys 3或是Nexys 4 DDR開發(fā)板(非老版本的Nexys 4),上述這些文件往往會缺失或者不完整。這里給大家講解一下如何添加或修改這些配置文件。如果你使用的是其它開發(fā)板,則這里你可以略過。
對于Nexys 4 DDR開發(fā)板而言,上述配置文件并非默認包含。所以這里第一步我們首先要確保斷開Multisim。然后,點擊「閱讀原文」下載DigilentNexys4DDR.mspc文件。接著,轉(zhuǎn)至配置文件所在的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配置文件覆蓋掉。與之前提到的方法一樣,轉(zhuǎn)至配置文件所在的Multisim目錄,將下載好的兩個文件拖到文件夾中覆蓋掉原始文件。
在這里,如果你希望挑戰(zhàn)一下自己來自行修改原始的Basys 3配置文件,下文將教你如何實現(xiàn)。當你在Multisim中打開一個新的PLD項目,并選擇Basys 3作為你的開發(fā)板,其中會有幾個I/O選項丟失。丟失的部分同時包括了VGA,RS-232,USB HID(PS/2),以及quad SPI flash的定義。
要想解決這一問題,我們需要修改這些已經(jīng)安裝好的配置文件。要想找到這些文件,第一步我們需要確保斷開Multisim,然后打開Multisim的根目錄文件夾。路徑名稱應該類似于:“C:\Program Files (x86)\National Instruments\Circuit Design Suite 14.1\pldconfig”。找到兩個名為“DigilentBasys3”的文件。其中一個文件的擴展名為.xdc,另一個則為.mspc。
在開始下一步操作之前,務必記得復制這兩個文件,并將之放到一個單獨的目錄文件夾中,比如你可以在桌面上為之新建一個文件夾。這樣做的目的是為以防整個操作過程的結(jié)果失敗,這樣可以讓你保留有原始文件以取得再次嘗試的機會。在這里,我不建議你選擇修改文件,除非你對自己的能力很有信心。這是因為錯誤的文件修改雖然不會對Multisim的操作性能產(chǎn)生影響,但是你所編程的開發(fā)板很可能會因此出現(xiàn)問題。
想要做這些修改,你需要用到文本編輯器,比如:Notepad++。記得不要去雙擊打開.mspc文件,這會直接打開Multisim,而這樣做對我們毫無意義。你所要做的只是對文件中的真實文本進行修改,以使Multisim能夠讀取并加載正確的開發(fā)板配置文件。因此,這里你需要做的是右鍵點擊.mspc文件,選擇“Open with.。.”,在彈出菜單中選擇你的文本編輯器以將之打開。.mspc文件往往以標記語言形式撰寫,類似于HTML或XML。這種形式簡單易懂,但這里我們需要對其進行一些修改。
我們無需對頂部的1-9行數(shù)據(jù)做任何的修改。我們需要關心的部分是所有標簽之間的數(shù)據(jù)。每一個I/O引腳定義需要一些基本的參數(shù)。其中,“Name”需要與.xdc文件中的引腳名稱保持一致?!癕ode”決定了引腳是被定義為輸入(“in”),輸出(“out”),還是雙向引腳(“bidir”)?!癓ocation”則用來告訴Multisim在畫布上以何種默認的方向來放置引腳。正常情況下,輸入朝向左面,輸出則朝向右面?!癙lace”選項則是一個布爾值標志,以用來告訴Multisim當你初次選擇I/O引腳時,是否是默認選擇。
這里,你可以自行根據(jù)需求添加缺失的引腳,或者可以簡單地復制以下定義:
將上述文本復制黏貼入“JXA_”定義下方的.mspc文本文件。然后保存更新好的.mspc文件,確保該文件所在的位置為Multisim目錄下的“pldconfig” 文件夾內(nèi)。
下面,我們在文本編輯器中打開“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” 文件夾內(nèi)。接著,我們重新回到“pldconfig” 文件,檢查一下確保文件的修改日期與當前的時間一致,而非你安裝Multisim時的時間。
當上述步驟都完成好之后,讓我們回過頭來檢查一下,確保所做的所有努力都能行之有效。打開Multisim并啟動一個新的PLD?,F(xiàn)在,你會發(fā)現(xiàn)所有的板載I/O在配置操作步驟中,都能夠正常顯示并可供選擇。
到這里,所有的步驟與注意事項就都完成啦!如你所見,使用Multisim對FPGA進行編程是如此地簡單方便。你所需要的僅僅只是具有一定的邏輯電路工作原理的知識,而無需再去去學習掌握硬件描述語言了。如果你有興趣,趕緊拿起開發(fā)板與Multisim跟著一步步嘗試一下吧!
-
FPGA
+關注
關注
1629文章
21738瀏覽量
603464 -
Multisim
+關注
關注
132文章
757瀏覽量
115316 -
Digilent
+關注
關注
2文章
219瀏覽量
15839
發(fā)布評論請先 登錄
相關推薦
評論