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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2184|回復(fù): 0
收起左側(cè)

FPGA設(shè)計(jì)干凈的代碼是程序員的核心技能

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

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

仿真過程:
每個(gè)時(shí)鐘上升沿一個(gè)一個(gè)檢查
發(fā)現(xiàn)這時(shí)某信號(hào)沒有變高
檢查代碼,把BUG補(bǔ)上
繼續(xù)檢查波形,繼續(xù)補(bǔ)BUG
發(fā)現(xiàn)信號(hào)A和B時(shí)序?qū)Σ积R
思考是打補(bǔ)丁呢還是打補(bǔ)丁呢
是改這個(gè)信號(hào)呢,還是改那個(gè)信號(hào),還是加一個(gè)信號(hào)
一番折騰后,終于對(duì)齊了
修改測(cè)試文件,再測(cè)試
還是有BUG,繼續(xù)打補(bǔ)丁

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产福利91精品一区二区三区 | 人人cao | 久久九七 | 爱综合| 亚洲免费视频一区 | 91精品一区二区三区久久久久 | 91在线免费观看 | 日韩中文一区二区三区 | 久久久久久黄 | 成人福利影院 | 91影库| 欧美在线 | 天堂av中文 | 中文字幕一区二区不卡 | 欧美日韩在线一区二区三区 | 日日夜夜精品免费视频 | 日韩av看片| 国产精品精品视频一区二区三区 | 亚洲精品久久久9婷婷中文字幕 | 欧美一级淫片免费视频黄 | 免费大黄视频 | 亚洲精品v日韩精品 | 免费九九视频 | 欧美国产中文字幕 | 成人超碰 | 九九99精品 | 欧美视频精品 | 91一区二区三区在线观看 | 美女国产精品 | 99久9 | 日本成年免费网站 | 女同久久另类99精品国产 | 欧美xxxx性| 一区欧美 | 久热国产在线 | 国产一级视屏 | 爱爱视频在线观看 | 久久久成人精品 | 免费在线视频一区二区 | 一区二区视频免费观看 | 宅女噜噜66国产精品观看免费 |