優化邏輯時序的幾個辦法 verilog語言

2021-06-01 18:00:14 字數 2986 閱讀 6208

1)邏輯條件判斷「a==b」和「a!=b」全部換成「!(a^b)」和「a^b」

2)複雜的邏輯條件判斷全部單獨用乙個時鐘去判斷,如:

if(a>1000 && a<=1000000 && b>1000 && b<=10000)

改為如下:

reg flag;

flag <= a>1000 && a<=1000000 && b>1000 && b<=10000;

if(flag)

這種大小判斷略微還好一些,對於減法等運算一定不能在if條件中直接計算,否則會導致很差的邏輯時序;

3)如果給ip核的數是經過較為複雜的運算得到的,盡量經過一級快取後再傳給ip核,如:

reg [31:0] diff,res_reg; reg [15:0] measurediffcnt;
if(start_cal_d1)

begin res_reg <= res_reg + diff; end

else if( == 2'b10)

begin res_reg <= 0; measurediffcnt <= 0;dividorce <= 0; end

else

begin res_reg <= res_reg; end

mstdividor    mstdividor_inst(

.clk(clk_200m),

.ce(dividorce),

.dividend(res_reg),

.divisor(measurediffcnt),

.quotient(quotient),

.remainder(remainder),

.rfd()

);

如上所示,即32bit位寬的res_reg要經過累加運算後作為除法ip核的輸入,當然這也許不算是十分複雜的計算,但對於速度較低和時鐘工作較高的場合,也會對邏輯時序造成影響,因些改為如下運算:

reg [31:0] res_in_div;

reg [15:0] diffcnt_in_div;

always @ (posedge clk_200m)

if(!rst)

begin

res_in_div <= 0;

diffcnt_in_div <= 0;

endelse

begin

res_in_div <= res_reg;

diffcnt_in_div <= measurediffcnt;

end

mstdividor				mstdividor_inst(

.clk(clk_200m),

.ce(dividorce),

//.dividend(res_reg),

.dividend(res_in_div),

//.divisor(measurediffcnt),

.divisor(diffcnt_in_div),

.quotient(quotient),

.remainder(remainder),

.rfd()

);

如上所示,即將計算結果進行一級快取後再給除法ip核,這樣時序會好一些……

當然有些ip核會自帶快取,那就另當別論了

4)根據我自己親自驗證,將減法運算改為等效的加法運算並不能優化邏輯時序,如下所示:

以下變數均為32位reg型,即reg [31:0]

將以下運算:

diff1 <= locdatad2 - slvdatad2;

diff2 <= locdatad2 - slvdatad1;

diff3 <= locdatad1 - slvdatad2;

修改為等效的以下運算:

diff1 <= (locdatad2 + 1) + (~slvdatad2);

diff2 <= (locdatad2 + 1) + (~slvdatad1);

diff3 <= (locdatad1 + 1) + (~slvdatad2);

最後的**結果會更壞,因此不建議這麼做。

5)位寬越多,做運算如加、減、比較大小等耗時越大,這個可以自己用數電裡學到的知識將對應的電路畫出來,看看要經過多少級邏輯延時才可以得到結果,因此能用較少的位數表示時就用較少的位數吧。

6)對於hdl**,一般都需要有乙個狀態機程式,即會用乙個case語句控制整個程式的的流程,舉個例子來說吧:

假如需要五個狀態來表示:

reg [2:0] state

case(state)

3'b000:

3'b001:

3'b010:

3'b011:

3'b100:

default:

endcase

這樣的判斷個人認為邏輯時序會比較差,因為基本閒置了最高位,只有最後乙個狀態才用到了最高位,我認為按如下方式寫比較好:

reg [2:0] state

case(state)

3'b111:

3'b110:

3'b101:

3'b100:

3'b011:

default:

endcase

這個我沒有太多的理論依據,同樣可以畫出實現電路圖去論證一下,反正我在**的時候使用後者得到了較好的邏輯時序,大家可以試一下哦。

7)對於運算級數的優化,如:

a<= a1 + a2 + a3 + a3;

優化為:

a<= (a1 + a2) + (a3 +a4);

這個不是我自己試出來的,是從書上看到的,具體見《xilinx fpga 開發實用教程》(田耘,徐文波,清華大學出版社)第96頁例3-7。書上說第一種寫法有三個延遲,而第二個寫法只有兩個延遲。

目前我就得到了這麼一些優化時序的方法,慢慢積累吧……

優化邏輯時序的幾個辦法 verilog語言

標籤 優化 語言div 出版工作 2011 11 11 09 38 4578人閱讀收藏 舉報 verilog相關 8 1 邏輯條件判斷 a b 和 a!b 全部換成 a b 和 a b 2 複雜的邏輯條件判斷全部單獨用乙個時鐘去判斷,如 if a 1000 a 1000000 b 1000 b 10...

組合邏輯與時序邏輯的定義和差別

1.組合邏輯電路 組合電路 1 任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關 1.1 邏輯函式的表示方法 邏輯函式 輸入輸出之間的函式關係 1 邏輯真值表 2 邏輯函式式 還可以用卡諾圖表示 3 邏輯圖 由邏輯圖形符號與或非等,構成的圖 4 波形圖 1.2 組合邏輯電路的設計方法 1 ...

FPGA中組合邏輯和時序邏輯的區別

數位電路根據邏輯功能的不同特點,可以分成兩大類,一類叫組合邏輯電路 簡稱組合電路 另一類叫做時序邏輯電路 簡稱時序電路 1 組合邏輯概念 組合邏輯電路在邏輯功能上的特點是任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關,不涉及對訊號跳變沿的處理,無儲存電路,也沒有反饋電路。通常可以通過真值...