【技術(shù)分享】FPGA雜記之基礎(chǔ)篇
發(fā)布時間2020-12-23
分享
Verilog基礎(chǔ)語法

1.1 可綜合???/strong>
以module為單元,具體實現(xiàn)如下:

1.1.1 時序邏輯
以異步觸發(fā)的D觸發(fā)器為例,時序邏輯在always塊里實現(xiàn)。

主要注意點:
1. 聲明??槭保淙氡淞懇歡ㄊ莣ire類型。
2. 聲明??槭,输出变量可以是wire,也可以是reg, reg變量只能在always塊中賦值。
3. 敏感列表既可以是邊沿觸發(fā),也可以是電平觸發(fā)。
4. 沿觸發(fā)的邏輯里,一定采用的是非阻塞觸發(fā)<=。
1.1.2 組合邏輯
以數(shù)據(jù)選擇器為例,組合邏輯通常使用assign語句賦值。


主要注意點:
1. sel = 0時,c = a;sel = 1時,c =b,即二選一數(shù)據(jù)選擇器。四選一則有兩個選擇端,四個輸入端,八選一則是三個選擇端,八個輸入端。
2. wire 變量一定要用連續(xù)賦值語句賦值,而且必須用阻塞賦值。
1.2 仿真???/span>
仿真??楹涂勺酆夏?櫚那?:
可綜合模塊最終生成的bit文件會燒錄進(jìn)芯片運行,而仿真??楸嘁牘笫竊詵掄嬡砑ɡ鏼odelsim)上運行的。仿真模塊是基于可綜合??榻欣,并通过窉鄫茼件的模拟,可以初步褭?001老百匯網(wǎng)站寫的可綜合??櫚氖迪窒窒蟆?/p>
以計數(shù)器為例,可綜合??槿縵?:

基于以上可綜合模塊的仿真??槿縵?:

1. 仿真的模塊聲明不需要輸入列表。
2. initial塊只能對【寄存器】量進(jìn)行賦值。
3. 例化??槭保綣寄?槭鞘涑霰淞,则括号脑r匭搿緒ire變量】。
HDL常見例子
2.1 譯碼器
2.1.1 可綜合??椋╟ase語句)
此??橛胏ase實現(xiàn)了一個數(shù)據(jù)選擇的功能,先產(chǎn)生了一個8位計數(shù)器,通過判斷計數(shù)器的值來輸出不同的取值,當(dāng)計數(shù)器計數(shù)到1時,o_data和o_dv分別輸出5和1,當(dāng)計數(shù)器為2時,輸出7和1,其余均輸出0。(Note:Case語句常常運用于狀態(tài)機(jī)中狀態(tài)的判斷)


Case語句注意點:
必須有default語句,否則會形成鎖存器。
2.1.2 仿真???/span>

2.2 狀態(tài)機(jī)
由于FPGA內(nèi)部語句塊都是并行運行的,當(dāng)4001老百匯網(wǎng)站希望FPGA按照順序執(zhí)行4001老百匯網(wǎng)站的語句時,就會用到狀態(tài)機(jī)。
下面例子是使用狀態(tài)機(jī)模擬的一個簡單的自動售貨機(jī),該售貨機(jī)中的商品 2.5 元一件,每次投幣既能投入 1 元,也能投入 0.5 元,當(dāng)投入 3 元時,需要設(shè)定找零。
2.2.1 狀態(tài)圖

2.2.2 可綜合??椋?段式狀態(tài)機(jī))



2.2.3 仿真???/strong>

2.2.4 仿真腳本
仿真腳本可以省去人工操作modelsim軟件圖形頁面的步驟,運行腳本,modelsim可以根據(jù)腳本命令自動運行包括創(chuàng)建工作目錄,編譯文件,啟動仿真等步驟,以下是本例中的仿真腳本。

仿真腳本編寫好后,只需要進(jìn)入仿真軟件(本例使用的是modelsim),改變當(dāng)前路徑到腳本保存的路徑,然后在modelsim命令行輸入 do [腳本文件名] 即可。


仿真結(jié)果:

2.2.5 上板測試
上板測試對原來的條件做了一定改動更方便觀測結(jié)果,輸入和輸出分別使用的按鍵和LED燈,測試版使用的是Anlogic的EF3L40CG332B_DEV,實現(xiàn)的功能如下:
① 在開發(fā)板上完成自動售貨機(jī)的實驗,投幣的動作通過按鍵實現(xiàn), 當(dāng)按一次按鍵(按下到抬起算一次),算作投幣一次。
② 按鍵有兩個,按下分別代表 5 毛和 1 元,可樂售價 2.5 元。
③ 當(dāng)投入總金額為 5 毛時, led 燈亮一個,投入總金額為 1 元時, led 燈亮兩個, 投入總金額為 1.5 元時, led 燈亮三個, 投入總金額為 2 元時, led 亮四個, 用單向流水燈效果充當(dāng)出可樂并且不找零的情況,用雙向流水燈效果充當(dāng)既出可樂又找零的情況。流水燈持續(xù)十秒后熄滅,狀態(tài)回到初始狀態(tài)。
重新設(shè)計狀態(tài)圖如下:

代碼詳見工程fsm_key,筆記不再贅述,此次筆記主要記錄關(guān)于頂層??楹屠南喙刂兜?:
工程目錄如下所示:

各??櫓淶墓叵凳牽?/p>
頂層文件是fsm.v,在fsm.v中調(diào)用了??閘ed_water_single,led_Water_double和key_debounce,這三個??櫚墓δ芊直鶚塹ハ蛄魎,双向留u坪桶醇?。想在頂層文件中調(diào)用對應(yīng)的??樾枰詼ゲ鬮募卸韻嚶Φ哪?榻欣,揖墺向留u莆?。
單向流水燈的聲明如下:

(具體功能實現(xiàn)代碼略,如有需要,請登錄www.fortune-co.com留言)

那么在fsm.v中例化方法如下:

括號外的信號是對應(yīng)的聲明信號;括號內(nèi)的信號是從fsm??櫓寫氳男藕牛瞇藕琶瓶梢宰遠(yuǎn)ㄒ?。
整個工程的框架如下:(由于本實驗沒有另外寫一個總的TOP文件,而是將例化和狀態(tài)機(jī)信號處理都放在了fsm??櫓,因此top層和狀態(tài)機(jī)??槎急曜⒌氖莊sm)

其中key05,key10,就是從外界接入的信號,led[7:0]即輸出信號。接入信號4001老百匯網(wǎng)站要引到對應(yīng)的按鍵,可以參考EF3L40CG332B_DEV的原理圖:


SW2和SW3對應(yīng)的FPGA的管腳分別是R19和R20,同理可查,八個led的對應(yīng)腳,并寫出相應(yīng)的管腳約束文件:

管腳約束文件寫完后,在可綜合??槎ゲ鬮募械氖淙朧涑魴藕啪突岫雜Φ較嚶Φ奈錮硎淙朧涑觶部梢允褂猛夾我趁嬪柚?。
完成后編譯下載到板子上觀測現(xiàn)象。
在本次實驗的過程中也發(fā)生了一個編程錯誤問題,剛編寫完上板測試時發(fā)現(xiàn)結(jié)果和預(yù)想的有差異,具體錯處在輸入3元進(jìn)入雙向流水燈的狀態(tài)時,雙向流水燈正向流水正常,當(dāng)反向流水時,在倒數(shù)第二個燈會卡?,染忬峰N戳撩鸕故歡齙,铆h(huán)ㄍ瓿煞聰蛄魎?。

由于第一次正向流水是正常的,因此推測是在反向流水時有條件判斷錯誤使得反向流水無法正常運行,進(jìn)入到led_water_double??楣賾詵聰蛄魎頻牟僮髂?,经查褭微腺|(zhì)巧柚梅曛鏡氖焙蚺卸咸跫創(chuàng)砹恕?/p>

判斷條件應(yīng)該是led == 8’b1111_1110,更改后,實驗現(xiàn)象符合預(yù)期要求。
1
END
1
以上是FPGA雜記基礎(chǔ)篇的第一部分,因文章篇幅所限,本文先分享到這里。后續(xù)會有更多基于FPGA的設(shè)計文章,敬請期待……