還在使用FPGA開發環境自帶的代碼編輯器?還在逐個字母敲擊冗長重復的代碼?明德揚至簡設計法讓你快速提高代碼編寫效率!利用GVIM這一高效的編輯工具並添加自定義模板,通過簡短的腳本命令即可自動生成所有常用的邏輯塊。
先來說說WIN系統下VIVADO和quartusII綁定GVIM作為默認代碼編輯器的方法:
1 VIVADO:IDE上方主菜單欄Tools ->Options ,選擇General項,點擊Text Editor右側“...”按鈕。在彈出的Custom Editor Definition 下方的Editor空白內填寫xxx /gvim.exe [file name] :[line number] 按下OK退出即可。其中xxx為GVIM軟件安裝路徑。
2 quartusII:同樣選擇菜單欄中Tools ->Options
選擇左側的Preferred Text Editor,1處選中下拉菜單中Vim,並點擊2處右側“...”按鈕找到GVIM的安裝目錄。最后點擊OK退回。
在FPGA設計中一個個復雜的模塊均由接口定義、信號定義、時序邏輯和組合了邏輯塊等部分組成,因此將代碼划分成幾種類型的模塊,以統一的代碼風格通過簡短的腳本語言調用可以很大程度提高設計效率,實現“填空式”設計!以下是腳本自動生成代碼示例,括號中為根據規定格式的參數輸入。
1 計數器
計數器是FPGA實現時序的基本單元,比如數據幀處理,串並轉換等均要用到。命令模式下輸入<:Mdyjsq > (注意<>不用輸入,加尖括號只是為了與文字區分開) 按下回車自動生成如下計數器模塊,連相關的信號定義也可自動生成。
再次輸入同樣的命令,會產生另一個計數器模塊,同時cnt后編號依次遞增,對於需要多個計數器嵌套使用的場合非常實用。
但如果想自定義定義計數器名稱怎么辦?難道要手動修改么?例如需要對din_vld這一信號進行計數,計10個一循環。命令模式下輸入
<:call MDYJSQ("cnt_din","din_vld",10)>,按下回車生成如下代碼。
格式為call MDYJSQ("計數器名稱","加1條件",計數個數)。該模板加1條件和計數個數是可選參數,但建議輸入腳本時添加,這樣有助於在編寫代碼之前,思考好計數器最重要的兩個要素:加1條件和計數個數。
2 狀態機
較為復雜的時序邏輯中,經常需要狀態機與計數器配合使用。如有如下狀態轉移圖:
在命令模式下輸入<:call MDYZTJ(3,"IDLE","S1","S2",12,23,31)>,按下回車生成明德揚四段式狀態機。
在生成的框架中添加狀態轉移條件和相應狀態輸出。命令格式為call MDYZTJ(狀態個數,"狀態1名稱","狀態2名稱",...,跳轉條件1,跳轉條件2,...)
3 always邏輯塊
在邏輯設計中,最常用的就是always時序邏輯塊,其內部通過多個if else語句區分不同的情況。當要產生信號dout邏輯且在兩種情況下需要賦予不同的值時,命令模式下輸入<:call MDYSHIXU("dout",2)>,按下回車生成如下代碼。格式為call MDYSHIXU("信號名稱",情況個數)
當然也少不了組合邏輯塊,可以很方便地做到連續立即更新信號數值。插入模式下輸入<Zuhe> 按下回車:
4 接口與信號定義
除了核心代碼外的信號定義和接口定義同樣可以快速生成。如數據包處理模塊要輸入位寬為8bit的數據包。根據至簡設計法命名規范,在命令模式下輸入
<:call MDYINPUT(“din_sop”,1, “din_eop”,1, “din”,8, “din_vld”,1) > 回車
格式為call MDYINPUT("輸入接口信號1名稱",信號1位寬,"輸入接口信號2名稱",信號2位寬) 同理,output,reg類型信號,wire類型信號生成方式和格式與input一致。
有了上述生成代碼的腳本命令,對設計人員的幫助不然而喻。接下來通過GVIM工具常用快捷鍵操作示例,進一步體會什么叫效率!
1.補全命令
在插入模式,輸入din_之后按下<ctrl+p>補全命令,可以快速根據當前文件中已有符號進行補全。有多個符號匹配時可自行選擇。
2.跳轉命令
命令模式下,按下<gg>會跳轉到當前文件頭,按下<G>跳轉到文件尾(再也不用不停地滾動鼠標滾輪了)。
3.搜索命令
命令模式下,在想要找出同樣符號位置的符號上按下*鍵,所有該符號出現位置自動高亮。調試起來很方便。
當要查找一個已知名稱符號時,命令模式下輸入</xxx> 直接找到所有xxx符號位置。上述兩種搜索命令均可使用<n>跳轉到下一個高亮位置,<N>跳轉到上一位置。
4.刪除復制命令
復制N整行:命令模式下,光標在一行頭位置輸入yy,將光標移到欲粘貼位置上一行任意處,按下p即可在下一行粘貼所復制內容。可在yy前加數字表示要從當前行開始向下復制行數。
5.保存退出
命令模式下,輸入<:w xxx.y> 回車為以特定文件名和文件格式保存文件。輸入<:wq> 回車保存當前文件退出。
6.替換命令
全文件替換:命令模式下,輸入<:%s/xx/yy/gc> 回車把當前文件所有xx可選擇替換成yy,逐個按下y確認替換,按下n否定替換。
范圍替換:命令模式下,輸入<:n,ms/xx/yy/gc>回車把n到m行所有xx可選擇替換成yy,以相同方式確認。
如將5到22行clk替換成clk_tx:命令模式下,輸入<:5,22s/clk/clk_tx/gc> 回車
灰色為當前待替換位置,按下<y>或<n>逐一確認。
7.列操作模式
在編寫testbench時,要例化待測試模塊。這是復制待測試模塊中以下部分。
a.鼠標選中待刪除區域,按下<ctrl+q>進入列選模式。b.按下delete直接刪除,之后用tab鍵在每行前流出空白。c.命令模式下,輸入<ctrl+q>進入列操作模式,通過<j><k><h><l>(下 上 左 右)鍵選擇欲編輯區域。d.輸入大寫字母“I”,再輸入想要列插入符號“.”,最后按下Esc鍵退出完成列插入。以同樣方式插入每行后()
合理規范的代碼是設計成功關鍵,通過上述一個個簡短便於記憶的腳本命令,可以讓設計人員從低級重復性的工作中解脫出來,將時間花在“刀刃”上。從代碼搬運工變成專注於功能算法的設計師,讓解答題變成填空題,從此開始!