大神教你如何做好邏輯設計
規范很重要
本文引用地址:http://www.104case.com/article/246996.htm工作過的朋友肯定知道,公司里是很強調規范的,特別是對于大的設計(無論軟件還是硬件),不按照規范走幾乎是不可實現的。邏輯設計也是這樣:如果不按規范做的話,過一個月后調試時發現有錯,回頭再看自己寫的代碼,估計很多信號功能都忘了,更不要說檢錯了;如果一個項目做了一半一個人走了,接班的估計得從頭開始設計;如果需要在原來的版本基礎上增加新功能,很可能也得從頭來過,很難做到設計的可重用性。
在邏輯方面,我覺得比較重要的規范有這些:
1.設計必須文檔化。要將設計思路,詳細實現等寫入文檔,然后經過嚴格評審通過后才能進行下一步的工作。這樣做乍看起來很花時間,但是從整個項目過程來看,絕對要比一上來就寫代碼要節約時間,且這種做法可以使項目處于可控、可實現的狀態。
2.代碼規范。
a.設計要參數化。比如一開始的設計時鐘周期是30ns,復位周期是5個時鐘周期,我們可以這么寫:
parameter CLK_PERIOD = 30;
parameter RST_MUL_TIME = 5;
parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;
...
rst_n = 1'b0;
# RST_TIME rst_n = 1'b1;
...
# CLK_PERIOD/2 clk <= ~clk;
如果在另一個設計中的時鐘是40ns,復位周期不變,我們只需對CLK_PERIOD進行重新例化就行了,從而使得代碼更加易于重用。
b.信號命名要規范化。
1) 信號名一律小寫,參數用大寫。
2) 對于低電平有效的信號結尾要用_n標記,如rst_n。
3) 端口信號排列要統一,一個信號只占一行,最好按輸入輸出及從哪個模塊來到哪個模塊去的關系排列,這樣在后期仿真驗證找錯時后 方便很多。如:
module a(
//input
clk,
rst_n, //globle signal
wren,
rden,
avalon_din, //related to avalon bus
sdi, //related to serial port input
//output
data_ready,
avalon_dout, //related to avalon bus
...
);
4) 一個模塊盡量只用一個時鐘,這里的一個模塊是指一個module或者是一個entity。在多時鐘域的設計中涉及到跨時鐘域的設計中最好有專門一個模塊做時鐘域的隔離。這樣做可以讓綜合器綜合出更優的結果。
5) 盡量在底層模塊上做邏輯,在高層盡量做例化,頂層模塊只能做例化,禁止出現任何膠連邏輯(glue logic),哪怕僅僅是對某個信號取反。理由同上。
6) 在FPGA的設計上禁止用純組合邏輯產生latch,帶D觸發器的latch的是允許的,比如配置寄存器就是這種類型。
7) 一般來說,進入FPGA的信號必須先同步,以提高系統工作頻率(板級)。
8)所有模塊的輸出都要寄存器化,以提高工作頻率,這對設計做到時序收斂也是極有好處的。
9) 除非是低功耗設計,不然不要用門控時鐘--這會增加設計的不穩定性,在要用到門控時鐘的地方,也要將門控信號用時鐘的下降沿 打一拍再輸出與時鐘相與。
clk_gate_en -------- ----
-----------------|D Q |------------------| gate_clk
_out
| | ---------| )--------
-
------o|> | | | /
clk | -------- | ----
------------------------------------
10)禁止用計數器分頻后的信號做其它模塊的時鐘,而要用改成時鐘使能的方式,否則這種時鐘滿天飛的方式對設計的可靠性極為不利,也大大增加了靜態時序分析的復雜性。如FPGA的輸入時鐘是25M的,現在系統內部要通過RS232與PC通信,要以rs232_1xclk的速率發送數據。
不要這樣做:
always (posedge rs232_1xclk or negedge rst_n)
begin
...
end
而要這樣做:
always (posedge clk_25m or negedge rst_n)
begin
...
else if ( rs232_1xclk == 1'b1 )
...
end
DIY機械鍵盤相關社區:機械鍵盤DIY
塵埃粒子計數器相關文章:塵埃粒子計數器原理
評論