最近收到了一個(gè) Tang nano 9K FPGA開(kāi)發(fā)板,就想借此機(jī)會(huì)研究一下。
官方文檔里介紹如果想使用高云的 FPGA,就需要使用 GOWIN IDE,但是需要申請(qǐng) license 提交一堆資料,我是別人送的就不太方便讓別人弄。加上 IDE 其實(shí)并不是很適合學(xué)習(xí)和投入生產(chǎn),因?yàn)?IDE 忽略了很多細(xì)節(jié),以及對(duì)一些工作做了處理。所以就想找到其他的工作流程,就像可以使用任何文本編輯器加上 Clang/LLVM 就可以編譯 C/C++ 程序一樣。
FPGA開(kāi)發(fā)是在開(kāi)發(fā)什么?
首先是需要知道,F(xiàn)PGA 開(kāi)發(fā)到底是在開(kāi)發(fā)什么,這樣才能找到需要的工具和軟件。
計(jì)算機(jī)械執(zhí)行各種指令的本質(zhì)是給一系列邏輯單元的引腳通電,然后經(jīng)過(guò)邏輯電路之后輸出新的電路信號(hào)。從軟件的層面來(lái)說(shuō),每個(gè)引腳的輸入就是一個(gè)常見(jiàn)到的一串二進(jìn)制數(shù)字(比如01011101010
)中的一位(一般使用的正邏輯中,1
表示高電平,0
表示低電平),早期的打孔板就是實(shí)體版的這種二進(jìn)制數(shù)字。也就是說(shuō),最終我們需要的是一個(gè)存放二進(jìn)制指令的文件,然后由 FPGA 執(zhí)行。
這時(shí)候還有一個(gè)問(wèn)題:指令怎么知道接口和針腳誰(shuí)是誰(shuí)呢?不知道的話,是沒(méi)有辦法弄到正確的二進(jìn)制指令的,因?yàn)橐恍┲噶畹牟僮鲗?duì)象就可能是錯(cuò)誤的。
接口和針腳本質(zhì)是一些數(shù)字表示的,需要通過(guò)這些數(shù)字來(lái)標(biāo)識(shí),所以我們還需要標(biāo)識(shí)對(duì)應(yīng)接口和針腳的文件。
簡(jiǎn)而言之,開(kāi)發(fā) FPGA 就是編寫(xiě)兩個(gè)文件:xxxx.v
和xxxx.cst
。
-
.v
文件里存放的是 Verilog 語(yǔ)言的代碼,用來(lái)連接電路中的各種門(mén)、寄存器,以及一些硬 IP(hard intellectual property)。 -
.cst
文件里存放的是引腳約束文件,用來(lái)表示 FPGA 開(kāi)發(fā)板上每個(gè)引腳的作用和電壓。
然后再通過(guò)一些工具,最后將其轉(zhuǎn)換成存放了一堆位(bit)的文件,稱(chēng)之為比特流文件,來(lái)控制各部分的連接、工作等。不同 FPGA 廠商使用的文件格式不一樣。這里 Tang nano 9K 使用的文件后綴為.fs
,內(nèi)容如下:
安裝和配置需要的工具
前提
你需要有Python 3.8 或更新的版本,因?yàn)樯杀忍亓餍枰褂靡粋€(gè) Python 腳本。Mac 一般回預(yù)裝 Python,你只需要檢查和更新版本即可。
工具鏈 OSS CAD Suite
接下來(lái)使用需要 OSS CAD Suite,這是一個(gè)工具鏈,可以將xxxx.v
和xxxx.cst
轉(zhuǎn)換成最終的比特流文件(有點(diǎn)像編譯器或者說(shuō)交叉編譯里的工具鏈),最后將其寫(xiě)入 FPGA。
這個(gè)套件包含了很多 FPGA 的工具,一般目錄名或程序名帶
gowin
的便是這里 Tang Nano 系列所需的。但其實(shí)可以只安裝 Gowin FPGA 芯片所需的工具的,不過(guò) OSS CAD Suite 不光終端可以使用,VS Code 也可以使用,所以使用 OSS CAD Suite 比較方便兩頭使用,如果你使用其他 FPGA 的話,也可以減少安裝新的工具鏈。
OSS CAD Suite 下載地址為:https://github.com/YosysHQ/oss-cad-suite-build/releases/latest
如果你使用最新的 OSS CAD Suite 構(gòu)建時(shí)出現(xiàn)下列這種錯(cuò)誤,那么建議下載 2023 年 2 月或 3 月的版本(版本更新特別快,基本上幾天就一版,隨便哪天的都行)
gowin_pack -d GW1N-9C -o rio.fs rio_pnr.json
Traceback (most recent call last):
File "/opt/oss-cad-suite/libexec/gowin_pack", line 33, in
sys.exit(load_entry_point('Apycula==0.8.2a1', 'console_scripts', 'gowin_pack')())
File "/opt/oss-cad-suite/lib/python3.8/site-packages/Apycula-0.8.2a1-py3.8.egg/apycula/gowin_pack.py", line 984, in main
AttributeError: module 'importlib.resources' has no attribute 'files'
make: *** [Makefile:16: rio.fs] Error 1
然后將 OSS-CAD-Suite 中bin
的路徑放到環(huán)境變量PATH
中,你可以放到你的 Shell 配置文件中。語(yǔ)句如下:
export PATH="存放位置/oss-cad-suite/bin:$PATH"
然后使用source
激活更新或者新開(kāi)一個(gè)終端窗口即可。
只安裝 Gowin FPGA 需要的工具鏈
Tang Nano 使用的 Gowin FPGA 芯片,它的比特流和格式的工具在 Apicula 項(xiàng)目中,這是地址:https://github.com/YosysHQ/apicula。如果你需要閱讀文檔,那么也在這個(gè)項(xiàng)目中。
安裝方法如下:
$ pip3 install apycula
如果你想簡(jiǎn)潔安裝,那么可以使用這種方法。這樣下載安裝的包體積會(huì)小特別多(4.1 MB 對(duì) 1.35 GB),但是萬(wàn)一開(kāi)發(fā)過(guò)程中需要使用其他的工具,那么就得自己再去單獨(dú)下載這些工具了。
文本編輯器 VS Code
編寫(xiě)代碼這里使用 Visual Studio Code,當(dāng)然你使用任何文本編輯器來(lái)編寫(xiě)代碼,比如 Vim、Emacs 等。但是不能使用 Word、Pages 這種應(yīng)用程序,因?yàn)檫@種應(yīng)用程序?qū)嶋H上并不是文本編輯器,而是文本處理器,在底層并不是簡(jiǎn)單的文本。
這里使用 Visual Studio Code 的原因主要是擴(kuò)展會(huì)高亮代碼和方便設(shè)置針腳,以及構(gòu)建最終的比特流文件必須要使用一個(gè)插件來(lái)自動(dòng)構(gòu)建。所以需要安裝兩個(gè)擴(kuò)展:Lushay Code
和Verilog-HDL/SystemVerilog/Bluespec SystemVerilo
。Lushay Code
是為了使用 OSS-CAD-Suite,這是一個(gè)自動(dòng)構(gòu)建工具,而后者是為了高亮代碼和方便設(shè)置針腳。如果Lushay Code
不支持你的 FPGA,那么還請(qǐng)找一下支持自己 FPGA 的擴(kuò)展插件。
此外要配置一下擴(kuò)展,在“設(shè)置-擴(kuò)展”中,將你的 OSS-CAD-Suite 位置輸入到下圖位置,這樣 VS Code 才可以使用 OSS-CAD-Suite:
示例代碼:讓板載 LED 逐個(gè)亮起
這里有兩個(gè)文件:top.v
和tangnano9k.cst
,內(nèi)容分別如下(需要注意top.v
最后需要有一個(gè)空行)
// top.v
module top
(
input clk,
output [5:0] led
);
localparam WAIT_TIME = 13500000;
reg [23:0] clockCounter = 0;
reg [5:0] cur_state = 6'b111111; // 這個(gè)六位二進(jìn)制數(shù)的每一位都表示一個(gè) LED
always @(posedge clk) begin
clockCounter <= clockCounter + 1;
if (clockCounter == WAIT_TIME) begin
clockCounter <= 0;
cur_state <= cur_state << 1;
if (cur_state == 6'b000000) begin
cur_state <= 6'b111111;
end
end
end
assign led[5:0] = cur_state[5:0];
endmodule
// tangnano9k.cst
IO_LOC "clk" 52;
IO_PORT "clk" PULL_MODE=UP;
IO_LOC "led[0]" 10;
IO_LOC "led[1]" 11;
IO_LOC "led[2]" 13;
IO_LOC "led[3]" 14;
IO_LOC "led[4]" 15;
IO_LOC "led[5]" 16;
如果你的tangnano9k.cst
是用 VS Code 設(shè)置的,那么應(yīng)該如下:
構(gòu)建項(xiàng)目
使用 VS Code 構(gòu)建
這種方法很簡(jiǎn)單,如果你之前配置好了 VS Code,并且也已經(jīng)將你的 FPGA 連接到 Mac 上,直接按照下圖的順序點(diǎn)擊,等一會(huì)兒,fs
文件就已經(jīng)構(gòu)建好并且將其燒錄到 FPGA 上了:
使用終端構(gòu)建
這部分劃成兩節(jié),第一節(jié)詳細(xì)介紹了每一步的使用和原由,第二節(jié)則將其整理成一個(gè)腳本,這樣就方便許多了。
逐步來(lái)說(shuō)
首先進(jìn)入yosys
(輸入按回車(chē)),頁(yè)面如下:
然后輸入以下命令:
# 讀取分析top.v的內(nèi)容
> read -sv top.v
# 將top.v的內(nèi)容合成轉(zhuǎn)換為json格式(由于yosys已經(jīng)分析了文件,所以不用文件名top.v,而是模塊名top)
> synth_gowin -top top -json test.json
# 退出yosys
> exit
當(dāng)然上面這部分可以化簡(jiǎn)成一句話:
$ yosys -p "read_verilog top.v; synth_gowin -json test.json"
然后使用下面的命令來(lái)進(jìn)行進(jìn)一步的工作:
# 通過(guò)設(shè)置設(shè)備名、CST文件和剛才生成的 JSON 文件來(lái)生成 FPGA 布局和布線信息,并且放入 test_pnr.json 中。
$ nextpnr-gowin --family GW1N-9C --device GW1NR-LV9QN88PC6/I5 --cst tangnano9k.cst --json test.json --write test_pnr.json
上面的家族名和設(shè)備名需要根據(jù)你自己的 FPGA 型號(hào)進(jìn)行修改(如果不是 Tang nano 9K 的話可以不寫(xiě)--family
這個(gè)選項(xiàng)),這個(gè)型號(hào)不是官網(wǎng)上短的那種。你可以在自己 FPGA 芯片封裝上看到,比如下圖就是 Tang nano 9K 的設(shè)備名GW1NR-LV9QN88PC6/I5
:
也可以根據(jù)下面的表格進(jìn)行查找:
名稱(chēng) | 設(shè)備名(device) | 板子的名稱(chēng)(board) |
---|---|---|
Trenz TEC0117 | GW1NR-UV9QN881C6/I5 | tec0117 |
Sipeed Tang Nano: | GW1N-LV1QN48C6/I5 | tangnano |
Sipeed Tang Nano 1K | GW1NZ-LV1QN48C6/I5 | tangnano1k |
Sipeed Tang Nano 4K | GW1NSR-LV4CQN48PC7/I6 | tangnano4k |
Seeed RUNBER | GW1N-UV4LQ144C6/I5 | runber |
@Disasm honeycomb | GW1NS-UX2CQN48C5/I4 | honeycomb |
接下來(lái)需要注意,如果你和我一樣是 Tang nano 9K,那么使用下面的語(yǔ)句(設(shè)備不能寫(xiě)上面那個(gè)長(zhǎng)的):
$ gowin_pack -d GW1N-9C -o top.fs test_pnr.json
如果你是其他型號(hào)的 Gowin FPGA,那么使用:
$ gowin_pack -d 設(shè)備名(device) -o top.fs test_pnr.json
然后就是將比特流文件燒錄到 FPGA 上:
openFPGALoader -b 板子的名字 pack.fs
這個(gè)板子的名稱(chēng)
在上面的表格最后一列里可以看到對(duì)應(yīng)的。如果你看到類(lèi)似下面的內(nèi)容,那么就是燒錄成功了:
然后就可以看到這樣的現(xiàn)象:
寫(xiě)個(gè)腳本
這里搞點(diǎn)生產(chǎn)力,我們將其寫(xiě)成腳本來(lái)實(shí)現(xiàn)“一步生成和燒錄”,你可以根據(jù)自己的型號(hào)進(jìn)行修改.
新建一個(gè)空白文本文件build.sh
,然后輸入:
#!/bin/bash
DEVICE='GW1NR-LV9QN88PC6/I5|tangnano9k'
BOARD='tangnano9k'
yosys -p "read_verilog top.v; synth_gowin -json temp.json"
nextpnr-gowin --family GW1N-9C --device GW1NR-LV9QN88PC6/I5 --cst tangnano9k.cst --json temp.json --write test_pnr.json
gowin_pack -d GW1N-9C -o top.fs test_pnr.json
openFPGALoader -b $BOARD top.fs
然后使用下面的語(yǔ)句賦予運(yùn)行權(quán)限:
chmod +x build.sh
這樣只用./build.sh
就可以在當(dāng)前目錄下進(jìn)行構(gòu)建和燒錄了。
擴(kuò)展閱讀
FPGA 是數(shù)電的一個(gè)分支,F(xiàn)PGA 學(xué)習(xí)過(guò)程中需要了解很多數(shù)電的術(shù)語(yǔ)和概念,所以可以使用數(shù)電專(zhuān)業(yè)的專(zhuān)業(yè)書(shū)來(lái)做一些入門(mén),這對(duì)后續(xù)學(xué)習(xí)也有幫助。這里推薦劍橋大學(xué)的這些資料:
這些資料對(duì)于非數(shù)電專(zhuān)業(yè)的人士來(lái)說(shuō)是一些不錯(cuò)的資料。其中很多知識(shí)點(diǎn)并不是問(wèn)題,初高中都學(xué)過(guò),主要是國(guó)內(nèi)中學(xué)時(shí)期使用的是蘇聯(lián)式的符號(hào),而絕大部分資料使用的都是美式符號(hào)或者現(xiàn)在的國(guó)標(biāo)符號(hào),所以如果你直接看電路圖可能會(huì)看不懂。
如果你和我一樣是 FPGA 新手,那么關(guān)于 FPGA 的一些術(shù)語(yǔ)會(huì)讓人頭大。比如說(shuō) Verilog 是什么?硬 IP 又是什么?針對(duì)這些 FPGA 的術(shù)語(yǔ)和概念,我推薦看看 Intel 聯(lián)合出版的一本書(shū)《FPGAs for Dummies》,你可以很輕松的在搜索引擎中通過(guò)“FPGAs for Dummies PDF”找到,《FPGAs for Dummies》的封面如下圖:
這本書(shū)用非常輕松的語(yǔ)言介紹了你準(zhǔn)備踏入 FPGA 領(lǐng)域所需的術(shù)語(yǔ)、語(yǔ)言、設(shè)計(jì)思路、發(fā)展歷程、應(yīng)用等各方面的知識(shí),以及最基礎(chǔ)的那個(gè)問(wèn)題:為什么你要使用 FPGA。
《XXX FOR DUMMIES》是一個(gè)系列書(shū)籍,致力于用詼諧、簡(jiǎn)單的語(yǔ)言介紹技術(shù),類(lèi)似《十分鐘學(xué)會(huì)xxx》,但是作者有一些事業(yè)內(nèi)蠻厲害的人。這個(gè)系列并不是 Intel 的,只是 FPGA 這本是 Intel 合作的。
關(guān)于 tang nano 9k 還有國(guó)外寫(xiě)的很不錯(cuò)的專(zhuān)欄,介紹了很多案例和用法,上文中提到的 Lushay Code 插件就是這個(gè)團(tuán)隊(duì)做的:https://learn.lushaylabs.com/getting-setup-with-the-tang-nano-9k/
然后就是 YosysHQ 一些項(xiàng)目的代碼和文檔了,比如說(shuō)上文提到的:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-659282.html
- OSS CAD Suite:https://github.com/YosysHQ/oss-cad-suite-build
- Project Apicula:https://github.com/YosysHQ/apicula
- nextpnr:https://github.com/YosysHQ/nextpnr
希望能幫到有需要的人~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-659282.html
到了這里,關(guān)于Mac 開(kāi)發(fā) Tang Nano FPGA 指南(使用終端和使用 VS Code 和插件,適用所有 Gowin FPGA)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!