FPGA設計代碼整潔之道(2)

發(fā)布時(shí)間:2018-8-31 10:05    發(fā)布者:luckyb1
關(guān)鍵詞: fpga
《極限編程實(shí)施》作者Ron  Jeffries 仔細研究了貝克的簡(jiǎn)單代碼規則,并依其重要順序分別列為:
&  能通過(guò)所有測試
&  沒(méi)有重復代碼
&  體現系統中的全部涉及理念
&  包括盡量少的實(shí)體,比如類(lèi)、方法、函數等
能通過(guò)所有測試這一點(diǎn),后文中在架構設計方面詳細說(shuō)明,這里我們還是借助一個(gè)小的例子說(shuō)明“沒(méi)有重復代碼”的一些技巧。
曾經(jīng)有一次我將多份不同的程序代碼用A4紙打印出來(lái),平攤到我的床上對照時(shí),還在上小學(xué)的女兒在旁邊說(shuō)道:爸比,你每天就是看這幾只毛毛蟲(chóng)爬來(lái)爬去嗎?always、if、else,begin,對了,還有end,大概就是這幾只。小孩子幼稚的話(huà)語(yǔ)引得我哈哈大笑,當我回頭看向這些代碼時(shí),突然記起一位大師說(shuō)過(guò)的話(huà):大部分程序都是由極為相似的元素構成。誠哉斯言!同時(shí),由于這種相似性,許多程序中出現了重復的代碼。我們來(lái)看一下下面這組代碼:
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
  
assign data0 = {1'b1,din0,1'b0};
  
assign data1 = {1'b1,din1,1'b0};
  
assign data2 = {1'b1,din2,1'b0};
  
  
always   @(posedge clk or negedge rst_n)begin
  
     if(rst_n==1'b0)begin
  
         dout <= 0 ;
  
     end
  
     else if(sel0)begin
  
         dout <= data0[9-cnt2];
  
     end
  
     else if(sel1)begin
  
         dout <= data1[9-cnt2];
  
     end
  
     else begin
  
         dout <= data2[9-cnt2];
  
     end
  
end
這是一個(gè)串口發(fā)送程序的代碼,所實(shí)現的功能是發(fā)送0、1、2三個(gè)數據。很明顯,在第2到第4行中,相當于程序中同樣的事情做了三遍。第10到第19行也是選了三次,這就屬于重復的代碼。隨著(zhù)信號越來(lái)越多,就需要不斷的四個(gè)、五個(gè)……N個(gè)。程序越來(lái)越累贅。
同一段代碼的反復出現,“唯一性”的邊界變得模糊,也容易出現混亂;蛘哒f(shuō),作者的想法沒(méi)有得到最佳的實(shí)現。在本例中假設通過(guò)搜索引擎輸入“?”就會(huì )得到相似的?個(gè)結果。還記得前文中提到的“做簡(jiǎn)單的事”嗎,這時(shí)我們應該思考是代碼自身贅余還是對象功能是否太多。如果是前者,應該從有效命名等去改善它;如果是后者,那就“把復雜的事情簡(jiǎn)單化”,采取某種手段重構它,使功能可以清晰的被說(shuō)明以及被實(shí)現。
如上面的代碼,正確的思路和做法應該是什么呢?我們來(lái)看下面這份代碼。
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
always   @(*)begin
  
     if(sel0)
  
         din_sel = din0 ;
  
     else if(sel1)
  
         din_sel = din1 ;
  
     else
  
         din_sel = din2 ;
  
end
  
  
assign data = {1'b1,din_sel,1'b0};
  
  
always   @(posedge clk or negedge rst_n)begin
  
     if(rst_n==1'b0)begin
  
         dout <= 0 ;
  
     end
  
     else begin
  
         dout <= data[9-cnt2];
  
     end
  
end
首先先把din0,1,2選出來(lái),如果se10的情況下,那么din-se1等于din0;否則,在se11的情況下,那么din-se1等于din1;否則,din-se1等于din2;
接下來(lái)我們再來(lái)補充0和1;
接著(zhù)選擇時(shí)序。dout的變化為XXXXXX,到此代碼完成。
通過(guò)比較不難看出,第二份代碼中,無(wú)論是補0補1,還是dout送出,都只做一次,一行代碼只做一件事且做好這件事,讓編程語(yǔ)言看起來(lái)像是專(zhuān)為解決這個(gè)問(wèn)題而存在的。
還有一點(diǎn),在本節的兩個(gè)例子中,驗證時(shí)前一份代碼要依次驗證,送出的信號din0,din,din2……din N,這個(gè)過(guò)程中任何一點(diǎn)出現錯誤都非常麻煩;而第二份代碼僅需要驗證它們之間的邏輯關(guān)系正確即可。
需要注意的是,本節是以一個(gè)非常小的信號輸出代碼為例。越是大型的、復雜的代碼,這兩種方法之間的效率和質(zhì)量差距越大。下一節《信號命名和定義應該明確》

FPGA整潔代碼2.pdf

318.88 KB, 下載積分: 積分 -1

本文地址:http://selenalain.com/thread-546608-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页