久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2227|回復: 0
收起左側

FPGA設計干凈的代碼是程序員的核心技能

[復制鏈接]
ID:588548 發表于 2019-7-25 10:26 | 顯示全部樓層 |閱讀模式

在正式開始之前,我們先看看一位FPGA工程師的工作日常:
開始設計代碼
開始寫第一個always代碼
發現要增加一個信號,因此寫第二個always,設計這個新增的信號
回到第一個always上,繼續完善這個代碼
開始寫第三個always代碼
感覺第一個always有情況沒考慮到
一陣重新思考
回去修改第一個always的代碼
寫完后,得了,不檢查代碼了,仿真再說吧。

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

該上板調試了
系統跑一會沒問題,長時間跑就出BUG
用調試工具各種分析各種定位
一番折騰后,終于找到BUG
一個corner沒想到/粗心大意漏了個條件/
早知道,要沒這BUG,我早就做完了

又出現BUG了,又要來折騰啦。
這個場景是不是覺得很熟悉?還有下面這些情形也許都遇到過:一個項目看上去很簡單,精心設置了架構,結果越做發現沖突越多,直到整個邏輯完全混亂。本來一天可以的完成的事不知道怎么搞的一個星期還沒有完成;本來只需要做一行更改,結果卻涉及到N個模塊;出現了一個非常小的BUG打了一個補丁,然后補丁越來越多,到最后無法解決。諸如此類等等情況不一而足,究其原因,總離不開“混亂”兩個字。這些混亂的根源是什么?又該如何解決呢?
一個好的FPGA項目的設計作品,不僅依賴于架構設計,優秀的代碼也是必不可少的關鍵因素。而好的代碼最基本的就是清晰整潔。整潔的代碼運行穩定,也是后期維護和升級的基礎。正如C++語言發明者Bjarne  Stroustrup說的那樣:“代碼邏輯應當直截了當,叫缺陷難以隱藏;盡量減少依賴關系,使之便于維護;依據某種分層戰略完善錯誤處理代碼;性能調至最優,避免其他人優化時不知所措從而出現混亂狀態。整潔的代碼只做好一件事!
這段話說得實在太好了,整潔的代碼只去做好一件事。事實上,有兩點只要做到了,就可以大大提高自己代碼的整潔度。第一、寫簡單的代碼;第二、把復雜的代碼簡單化。下面我們通過一個小的實例來說明一下。我們先來看這樣一組代碼:
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
這個程序時一個數字時鐘功能的其中一份關于小時個位的代碼。小時個位復位等于0(第3行代碼);設置的語句(第5行代碼),意思是當你選中小時的個位并且按鍵按下去,小時個位+1,或者說正常情況下一個小時+1。這里需要注意的是:首先小時的計數方式在0:00——9:00,10:00——19:00,20:00——23:00情況下+1;另外幾個時間點清零。
我們來分析一下,在這份代碼的設計中需要考慮到很多因素。第一、需要考慮按鍵;第二、按下去時與正常計數的關系;第三、需要數多少次清零,比如說9點、19點、23點清零;當很多因素混在一起去考慮,特別是格式沒有被規范的時候,就容易出現混亂、遺漏點或是相互之間出現沖突,出錯的可能性隨之變大。
接下來我們來看另外一組代碼的思路和操作。
首先,我們建立一個通用的計數器模板,命名為jsq。每次遇到計數器,只需要輸入JSq,即可調入該模板。(注:關于模板的設置以后章節介紹)
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== ;
接下來設置什么時候個位+1,分為兩種情況:1、按鍵按下去;2、自然計數+1;(第13行)
采用變量法設置X-1;即先不用去管數多少下,反正數完就清零;(第14行)
最后我們設置數多少下。20:00時數4下;其它時候數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
現在我們來回顧一下這段代碼,從中不難發現,設計的總體思路有著嚴密的邏輯和步驟,并采取了便捷工具(模板)來規范了代碼編寫,減少了設計量。最重要的是設計者的意圖清晰了然,控制語句直截了當,代碼之間相互依賴性非常低,作者之外的開發者閱讀和增補非常輕松。
這一節我們講到了代碼混亂的根源及解決這個問題的技巧,下一節我們要講到的是簡單代碼規則的技巧。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕 国产精品 | 成人在线欧美 | 亚洲男人的天堂网站 | 欧美日韩久 | 色爽女 | 黄色视频a级毛片 | 黄色一级毛片 | 夜夜骚 | 日韩在线免费视频 | 成人av一区二区亚洲精 | 国产精品视频免费看 | 精品国产一区二区三区成人影院 | jlzzjlzz国产精品久久 | 国产日屁| 国产精品精品视频一区二区三区 | 男女下面一进一出网站 | 久久伦理电影 | 中文在线一区二区 | 日韩高清av | 久久精品国产一区 | 午夜黄色影院 | 亚洲免费在线观看 | 九九热在线免费观看 | 国产成人网| 网站国产| 欧美成年网站 | 国产精品夜夜春夜夜爽久久电影 | 国产中文字幕亚洲 | 91国产视频在线 | 日韩中文字幕在线观看 | 中文日韩字幕 | 日韩精品久久一区二区三区 | 国产一区二区三区四区在线观看 | 亚洲视频在线观看 | 免费看一区二区三区 | 一区二区三区欧美 | 国产精品黄视频 | 日韩国产在线观看 | 九色国产 | 欧洲av在线 | 日本成人综合 |