訊號命名原則跟 coding style 一樣重要,尤其代碼量多的工程,一看訊號名稱就大概知道此訊號的特徵也方便 debug 。以下是我個人常用的方法。
除特殊訊號外FPGA輸入實際名稱用大寫,字跟字間用底線區分。
input SIGNAL_NAME
除特殊訊號外FPGA輸出實際名稱用大寫,字跟字間用底線區分。
output SIGNAL_NAME
sub module 輸入訊號前面加i
input iSignalName
sub module 輸出訊號前面加o
output oSignalName
reg 類型訊號前面加r
reg rSignalName
wire 類型訊號前面加w
wire wSignalName
輸入訊號為 vectors 類型訊號前面加 iv
input [7:0] ivSignalName
輸出訊號為 vectors 類型訊號前面加 ov
output [7:0] ovSignalName
reg 為 vectors 類型前面加rv
reg [7:0] rvSignalName
wire 為 vectors 類型前面加 wv
wire [7:0] wvSignalName
輸入訊號為 low active 前面加大寫 N
input SignalNameN
D Flip Flop 輸出端後面加 _q
reg rSignalName_q
D Flip Flop 輸入端後面加 _d
reg rSignalName_d
Generate 好用之處在於可以依不同條件下產生不同實體模組這樣對 coding 的靈活性有很大的幫助。
(1) generate 有 generate for, generate if 及 generate case 三種用法。
(2) generate for 變數要以 genvar 關鍵字定義。
(3) generate for 內容需加 begin end 包起來。
(4) generate for 後面需加名子 ex : begin : name
以下是使用 generate for, generate if 及 generate case 的範例
FPGA 幾乎會用到計數器相關設計,如 Watch dog、 PWM 、除頻器等等。
而計數器設計大致會有二個條件 :
1.什麼條件下計數
2.什麼條件下重新計數
掌握了這二個條件就可以設計計數器,以下為一個簡單計數器設計。
(1)在 iEn 為 1 時計數器加一。
assign AddCnt = iEn;
(2)在計數器數到使用者設定的值時,下一個clock進來時重新計數。
assign EndCnt = AddCnt && (rvCnt_q == MOD — 1);
而 iClr 為 1 時計數器清 0,iLoad 為 1 時可填入計數初始值。
掌握了這二個條件就可以設計計數器了。