開發(fā)流程
1、設(shè)計(jì)定義
項(xiàng)目需要做什么,了解系統(tǒng)的功能,如果是大型的項(xiàng)目還會劃分模塊
2、設(shè)計(jì)輸入
通過使用verilog、VHDL、成熟的IP核或者通過畫原理圖的方式進(jìn)行邏輯輸入設(shè)計(jì)
3、分析和綜合
當(dāng)邏輯輸入設(shè)計(jì)完成后需要對其進(jìn)行驗(yàn)證,該部分由軟件部分進(jìn)行驗(yàn)證,如果邏輯輸入有問題需要檢查語法錯誤或則重新設(shè)計(jì)設(shè)計(jì)輸入
4、功能仿真
當(dāng)分析和綜合通過后應(yīng)該進(jìn)行功能性驗(yàn)證,針對項(xiàng)目設(shè)計(jì)定義的功能使用設(shè)計(jì)的邏輯輸入驗(yàn)證其功能能否實(shí)現(xiàn),一般的做法都是通過功能仿真的方式進(jìn)行驗(yàn)證,比如軟件邏輯分析儀,modelsim、vivado等軟件自帶的仿真工具進(jìn)行仿真驗(yàn)證
功能仿真也稱為行為仿真,主旨在于驗(yàn)證電路的功能是否符合設(shè)計(jì)要求,其特點(diǎn)是不考慮電路門延遲與線延遲,主要是驗(yàn)證電路與理想情況是否一致。也可以叫做RTL仿真(test bench)
5、布局布線
當(dāng)我們的IO可以開始分配了我們首先需要分配IO,如果當(dāng)前還沒到IO分配的時候我們可以將IO分配放在最后,當(dāng)IO分配完成后我們就可以通過軟件進(jìn)行布局布線,在芯片內(nèi)部生成芯片電路
6、時序仿真
時序仿真也稱為布局布線后仿真,是指電路已經(jīng)映射到特定的工藝環(huán)境以后,綜合考慮電路的路徑延遲與門延遲的影響,驗(yàn)證電路能否在一定時序條件下滿足設(shè)計(jì)構(gòu)想的過程,能較好地反映芯片的實(shí)際工作情況,當(dāng)時序仿真不通過的時候可能還會設(shè)計(jì)到時序約束的一個過程(在比較復(fù)雜的設(shè)計(jì)中也需要用到);
7、IO分配以及配置文件(bit流文件)的生成
如果在布局布線時未進(jìn)行IO分配在該步驟進(jìn)行IO分配并生成BIT流文件
8、配置(燒錄)FPGA
時序通過了后需要通過硬件進(jìn)行驗(yàn)證也就是最后一步的實(shí)物驗(yàn)證
9、在線調(diào)試
當(dāng)系統(tǒng)出現(xiàn)問題運(yùn)行不正常我們可以通過外部硬件示波器或者邏輯分析儀進(jìn)行實(shí)際引腳信號抓取分析
例子
1、設(shè)計(jì)定義
1.1 需求
二選一多路器,兩個輸入IO(a,b)可以是高電平可以是低電平,一個sel選擇信號
當(dāng)sel為0時候輸出按鍵1的狀態(tài)
當(dāng)sel為1時候輸出按鍵2的狀態(tài)
1.2 原理圖
1.3 真值表
2、設(shè)計(jì)輸入
2.1 新建工程
選擇自己使用的芯片(我這里采用的是小梅哥的高云FPGA開發(fā)板)
新建一個verilog文件
2.2 添加代碼
module mux_2_1(
input wire in1, // 輸入端口1
input wire in2, // 輸入端口2
input wire sel, // 輸入通道的選擇
output wire led // 輸出led
);
// assign led = (sel == 1'b0) ? in1 : in2; // 第一種方式直接使用三目運(yùn)算符
// 第二種方式是使用always的*觸發(fā)方法ifelse判斷
reg out;
always @(*) begin
if(sel)
out <= in2;
else
out <= in1;
end
assign led = out;
endmodule
3、分析和綜合
這里代碼我已經(jīng)驗(yàn)證了所以沒有語法錯誤,直接進(jìn)行綜合
當(dāng)沒有語法錯誤時表示代碼正常然后我們可以運(yùn)行工具中的RTL Desgin Viewer查看原理圖網(wǎng)表;
4、功能仿真
這里我們需要將我們的源代碼設(shè)置為頂層文件(這里引用一下小梅哥的圖),然后我們可以看到該源碼所占用的資源情況
然后我們創(chuàng)建一個test beach測試文件
代碼如下
`timescale 1ns/1ps
module mux_2_1_tb();
reg In1;
reg In2;
reg Sel;
wire Led;
// 創(chuàng)建模塊實(shí)例并賦值參數(shù)
mux_2_1 Mux_2_1(
.in1(In1),
.in2(In2),
.sel(Sel),
.led(Led)
);
// 初始化運(yùn)行 測試每個真值表上對應(yīng)的參數(shù)設(shè)定
initial begin
In1 = 0;In2 = 0;Sel = 0;
#100;
In1 = 0;In2 = 0;Sel = 1;
#100;
In1 = 0;In2 = 1;Sel = 0;
#100;
In1 = 0;In2 = 1;Sel = 1;
#100;
In1 = 1;In2 = 0;Sel = 0;
#100;
In1 = 1;In2 = 0;Sel = 1;
#100;
In1 = 1;In2 = 1;Sel = 0;
#100;
In1 = 1;In2 = 1;Sel = 1;
#100;
end
endmodule
點(diǎn)擊綜合和布線,驗(yàn)證有無邏輯錯誤
然后我們打開modsim軟件創(chuàng)建工程
添加我們的兩個源碼文件并編譯
進(jìn)入 Add Simulation Configuration 頁面,我們在 Design 標(biāo)簽頁面中選擇work 庫中的“ mux_2_1_tb”模塊作為設(shè)計(jì)頂層,點(diǎn)擊復(fù)制模塊名作為仿真配置“ Simulation Configuration Name”的命名,確保命名保持一致。在復(fù)雜的工程設(shè)計(jì)中,我們可以設(shè)計(jì)多個不同的仿真配置頂層對工程進(jìn)行仿真測試。
點(diǎn)擊“ Optimization Options…”, 在“ Optimization Options…” 設(shè)置欄中選擇“ Apply full visibility to all modules(full debug module)”,點(diǎn)擊“ OK”
配置元件庫(這一步的操作需要在modsim中已經(jīng)添加了高云fpga的仿真庫后操),點(diǎn)擊“ libraries” 設(shè)置欄, 在“ Search libraries(-L)” 一欄中點(diǎn)擊“ Add…”添加我們新建的高云的庫文件“ gw5a”,在“ Search Libraries First(-Lf)”同樣選擇庫文件“ gw5a”,最后點(diǎn)擊“ Save”保存設(shè)置;
然后雙擊我們的仿真文件進(jìn)入仿真界面
然后我們選中模塊右擊后點(diǎn)擊Add Wave放到顯示波形中
添加好波形后回到“ Library”欄,右鍵單擊“ work”點(diǎn)擊 Update 將
“ mux_2_1_tb”文件更新在“ work”欄,如下所示
然后我們點(diǎn)擊狀態(tài)欄中的運(yùn)行即可捕捉到波形,然后右擊Zoom Full可以快速查看波形,在這一步我們可以驗(yàn)證我們的波形是否是我們需要的效果;
下一步我們可以將modsim的工程和波形文件保存到項(xiàng)目project路徑下;
然后點(diǎn)擊波形界面一下再點(diǎn)擊這個按鈕選擇保存波形路徑
下次還需打開工程只需要點(diǎn)擊該目錄下的.mpf文件即可
到這里功能仿真也就是RTL仿真就結(jié)束了,下一步我們需要分配我們程序中引腳并完成布局布線;
5、引腳約束及布局布線
首先我們需要確認(rèn)我們輸入和輸出接的引腳,這里小梅哥的板子提供了excel表格,下面是我使用到的資源;
然后我們回到軟件中進(jìn)行引腳約束
保存后進(jìn)行點(diǎn)擊布線查看是否存在錯誤
最終生成文件
//Copyright (C)2014-2023 Gowin Semiconductor Corporation.
//All rights reserved.
//File Title: Physical Constraints file
//Tool Version: V1.9.9 (64-bit)
//Part Number: GW5A-LV25UG324C2/I1
//Device: GW5A-25
//Device Version: A
//Created Time: Mon 12 25 15:47:02 2023
IO_LOC "led" D14; // 指定“l(fā)ed”io位置為D14
IO_PORT "led" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3; // 無上拉 驅(qū)動等級8 io電壓3.3v
IO_LOC "sel" C15;
IO_PORT "sel" PULL_MODE=NONE BANK_VCCIO=3.3;
IO_LOC "in2" A15;
IO_PORT "in2" PULL_MODE=NONE BANK_VCCIO=3.3;
IO_LOC "in1" B16;
IO_PORT "in1" PULL_MODE=NONE BANK_VCCIO=3.3;
6、時序仿真
在仿真章節(jié)的代碼中其實(shí)有涉及到時序相關(guān)的代碼,在那一章節(jié)就可以觀察時序相關(guān)的需求,例如本設(shè)計(jì)的需求有三個輸入,分別是key1、key2以及sel,我們要實(shí)現(xiàn)的功能便是根據(jù)這三個信號的輸入狀態(tài)來輸出led,那當(dāng)我們?nèi)齻€輸入信號發(fā)生后多久led會產(chǎn)生變化,這就是時序,當(dāng)我們的需求是要在10ms內(nèi)反應(yīng)操作,那我們就需要觀察輸入信號發(fā)生變化時輸入信號離輸出信號產(chǎn)生的間隙是多長如下圖,這里的設(shè)計(jì)沒有復(fù)雜的運(yùn)算以及復(fù)雜的判斷電路類似直接導(dǎo)通所以沒有延時產(chǎn)生(實(shí)際不會如此,很難有絕對)
如果仿真產(chǎn)生的延時達(dá)不到我們的需求我們就需要進(jìn)行調(diào)整修改,而且實(shí)際的IO輸出和仿真的效果往往也會有不同,例如這里的輸入是按鍵,那按鍵抖動時波形的狀態(tài)我們就可以通過示波器或則硬件邏輯分析儀進(jìn)行時序分析這樣會更加準(zhǔn)確一些;
7、bit流輸出、配置燒錄、板級驗(yàn)證
需要注意在燒錄驗(yàn)證之前,我們需要在高云軟件中配置硬件默認(rèn)狀態(tài),高云編譯器默認(rèn)IO上拉我們需要手動更改為接地
默認(rèn)燒錄是燒錄到sram也就是掉電后程序就不在了,如果重啟后直接開始運(yùn)行需要設(shè)置未固化到flash中如下圖2設(shè)置文章來源:http://www.zghlxwxcb.cn/news/detail-766817.html
然后我們就可以在板子上驗(yàn)證我們設(shè)計(jì)的功能了;文章來源地址http://www.zghlxwxcb.cn/news/detail-766817.html
到了這里,關(guān)于【FPGA】高云FPGA之科學(xué)的FPGA開發(fā)流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!