FPGA設計 用好的代碼實(shí)現0仿真0調試

發(fā)布時(shí)間:2018-8-30 15:18    發(fā)布者:luckyb1
關(guān)鍵詞: FPGA
在正式開(kāi)始之前,我們先看看一位FPGA工程師的工作日常:
開(kāi)始設計代碼
開(kāi)始寫(xiě)第一個(gè)always代碼
發(fā)現要增加一個(gè)信號,因此寫(xiě)第二個(gè)always,設計這個(gè)新增的信號
回到第一個(gè)always上,繼續完善這個(gè)代碼
開(kāi)始寫(xiě)第三個(gè)always代碼
感覺(jué)第一個(gè)always有情況沒(méi)考慮到
一陣重新思考
回去修改第一個(gè)always的代碼
寫(xiě)完后,得了,不檢查代碼了,仿真再說(shuō)吧。

仿真過(guò)程:
每個(gè)時(shí)鐘上升沿一個(gè)一個(gè)檢查
發(fā)現這時(shí)某信號沒(méi)有變高
檢查代碼,把BUG補上
繼續檢查波形,繼續補BUG
發(fā)現信號A和B時(shí)序對不齊
思考是打補丁呢還是打補丁呢
是改這個(gè)信號呢,還是改那個(gè)信號,還是加一個(gè)信號
一番折騰后,終于對齊了
修改測試文件,再測試
還是有BUG,繼續打補丁

該上板調試了
系統跑一會(huì )沒(méi)問(wèn)題,長(cháng)時(shí)間跑就出BUG
用調試工具各種分析各種定位
一番折騰后,終于找到BUG
一個(gè)corner沒(méi)想到/粗心大意漏了個(gè)條件/
早知道,要沒(méi)這BUG,我早就做完了

又出現BUG了,又要來(lái)折騰啦。

這個(gè)場(chǎng)景是不是覺(jué)得很熟悉?還有下面這些情形也許都遇到過(guò):一個(gè)項目看上去很簡(jiǎn)單,精心設置了架構,結果越做發(fā)現沖突越多,直到整個(gè)邏輯完全混亂。本來(lái)一天可以的完成的事不知道怎么搞的一個(gè)星期還沒(méi)有完成;本來(lái)只需要做一行更改,結果卻涉及到N個(gè)模塊;出現了一個(gè)非常小的BUG打了一個(gè)補丁,然后補丁越來(lái)越多,到最后無(wú)法解決。諸如此類(lèi)等等情況不一而足,究其原因,總離不開(kāi)“混亂”兩個(gè)字。這些混亂的根源是什么?又該如何解決呢?
一個(gè)好的FPGA項目的設計作品,不僅依賴(lài)于架構設計,優(yōu)秀的代碼也是必不可少的關(guān)鍵因素。而好的代碼最基本的就是清晰整潔。整潔的代碼運行穩定,也是后期維護和升級的基礎。正如C++語(yǔ)言發(fā)明者Bjarne  Stroustrup說(shuō)的那樣:“代碼邏輯應當直截了當,叫缺陷難以隱藏;盡量減少依賴(lài)關(guān)系,使之便于維護;依據某種分層戰略完善錯誤處理代碼;性能調至最優(yōu),避免其他人優(yōu)化時(shí)不知所措從而出現混亂狀態(tài)。整潔的代碼只做好一件事!
這段話(huà)說(shuō)得實(shí)在太好了,整潔的代碼只去做好一件事。事實(shí)上,有兩點(diǎn)只要做到了,就可以大大提高自己代碼的整潔度。第一、寫(xiě)簡(jiǎn)單的代碼;第二、把復雜的代碼簡(jiǎn)單化。下面我們通過(guò)一個(gè)小的實(shí)例來(lái)說(shuō)明一下。我們先來(lái)看這樣一組代碼:
  
1
  
2
  
3
  
4
  
5
  
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
always   @(posedge clk or negedge rst_n)begin
  
     if(rst_n==1'b0)begin
  
         shi_ge <= 0 ;
  
     end
  
     else if(((set_flag == 1'b1 && set_sel == 4)&& (key_vld  == 1 && key_num == 4'b0010)) || shi_ge_add)begin
  
         if(shi_shi ==2 && shi_ge == 3)begin
  
            shi_ge <= 0 ;
  
         end
  
         else if((shi_shi == 0 || shi_shi ==1) && shi_ge == 9)begin
  
            shi_ge <= 0 ;
  
         end
  
         else begin
  
            shi_ge <= shi_ge + 1 ;
  
         end
  
     end
  
end
這個(gè)程序時(shí)一個(gè)數字時(shí)鐘功能的其中一份關(guān)于小時(shí)個(gè)位的代碼。小時(shí)個(gè)位復位等于0(第3行代碼);設置的語(yǔ)句(第5行代碼),意思是當你選中小時(shí)的個(gè)位并且按鍵按下去,小時(shí)個(gè)位+1,或者說(shuō)正常情況下一個(gè)小時(shí)+1。這里需要注意的是:首先小時(shí)的計數方式在0:00——9:00,10:00——19:00,20:00——23:00情況下+1;另外幾個(gè)時(shí)間點(diǎn)清零。
我們來(lái)分析一下,在這份代碼的設計中需要考慮到很多因素。第一、需要考慮按鍵;第二、按下去時(shí)與正常計數的關(guān)系;第三、需要數多少次清零,比如說(shuō)9點(diǎn)、19點(diǎn)、23點(diǎn)清零;當很多因素混在一起去考慮,特別是格式?jīng)]有被規范的時(shí)候,就容易出現混亂、遺漏點(diǎn)或是相互之間出現沖突,出錯的可能性隨之變大。
接下來(lái)我們來(lái)看另外一組代碼的思路和操作。
首先,我們建立一個(gè)通用的計數器模板,命名為jsq。每次遇到計數器,只需要輸入JSq,即可調入該模板。(注:關(guān)于模板的設置以后章節介紹)
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
always @(posedge clk or negedge  rst_n)begin
  
     if(!rst_n)begin
  
         cnt <= 0;
  
     end
  
     else if(add_cnt)begin
  
         if(end_cnt)
  
            cnt <= 0;
  
         else
  
            cnt <= cnt + 1;
  
     end
  
end
  
  
assign add_cnt = ;      
  
assign end_cnt = add_cnt && cnt==  ;
接下來(lái)設置什么時(shí)候個(gè)位+1,分為兩種情況:1、按鍵按下去;2、自然計數+1;(第13行)
采用變量法設置X-1;即先不用去管數多少下,反正數完就清零;(第14行)
最后我們設置數多少下。20:00時(shí)數4下;其它時(shí)候數10下;(16~21行)
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
always @(posedge clk or negedge  rst_n)begin
  
     if(!rst_n)begin
  
         cnt <= 0;
  
     end
  
     else if(add_cnt)begin
  
         if(end_cnt)
  
            cnt <= 0;
  
         else
  
            cnt <= cnt + 1;
  
     end
  
end
  
  
assign add_cnt =((set_flag == 1'b1  && set_sel == 4)&& (key_vld == 1 && key_num ==  4'b0010)) || shi_ge_add ;      
  
assign end_cnt = add_cnt && cnt==  x-1 ;
  
  
always   @(*)begin
  
     if(shi_s == 2)
  
         x = 4 ;
  
     else
  
         x = 10 ;
  
end
現在我們來(lái)回顧一下這段代碼,從中不難發(fā)現,設計的總體思路有著(zhù)嚴密的邏輯和步驟,并采取了便捷工具(模板)來(lái)規范了代碼編寫(xiě),減少了設計量。最重要的是設計者的意圖清晰了然,控制語(yǔ)句直截了當,代碼之間相互依賴(lài)性非常低,作者之外的開(kāi)發(fā)者閱讀和增補非常輕松。
這一節我們講到了代碼混亂的根源及解決這個(gè)問(wèn)題的技巧,下一節我們要講到的是簡(jiǎn)單代碼規則的技巧。
本文地址:http://selenalain.com/thread-546582-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页