《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 模擬設(shè)計 > 其他 > 教學(xué):FPGA設(shè)計中邏輯復(fù)制的使用

教學(xué):FPGA設(shè)計中邏輯復(fù)制的使用

2022-09-30
來源:FPGA設(shè)計論壇
關(guān)鍵詞: FPGA 邏輯復(fù)制

  在FPGA設(shè)計中經(jīng)常使用到邏輯復(fù)制,,邏輯復(fù)制也用在很多場合,。

  1.    信號驅(qū)動級數(shù)非常大,,扇出很大,需要增加驅(qū)動力

  邏輯復(fù)制最常使用的場合時調(diào)整信號的扇出,。如果某個信號需要驅(qū)動后級很多單元,,此時該信號的扇出非常大,那么為了增加這個信號的驅(qū)動能力,,一種辦法就是插入多級Buffer,,但是這樣雖然能增加驅(qū)動能力,但是也增加了這個信號的路徑延時,。

  為了避免這種情況這時可以復(fù)制生成這個信號的邏輯,,用多路同頻同相的信號驅(qū)動后續(xù)電路,使平均到每路的扇出變低,,這樣不需要插入Buffer就能滿足驅(qū)動能力增加的要求,,從而節(jié)約該信號的路徑延時。如從圖1.1到圖1.2轉(zhuǎn)變所示,。

  74.JPG

  圖1.1  邏輯復(fù)制前

73.JPG

  圖1.2  邏輯復(fù)制后

  由于現(xiàn)在綜合器都已經(jīng)非常智能,,此種場合的邏輯復(fù)制工作大多由綜合器完成,不需要人手動調(diào)整,。各大FPGA廠商的綜合器以及第三方綜合器都有這種功能,。

  2.    FPGA中需要做很多重復(fù)工作

  在某些FPGA設(shè)計中,需要很多重復(fù)設(shè)計的時候,,這時候邏輯復(fù)制也就有用了,。

  例如:在某個特殊應(yīng)用場合需要設(shè)計方向可以任意改變的240位寬的三態(tài)IO管腳。我們先看看常用的一個位寬的三態(tài)管腳怎么設(shè)計,。

  module inout_interface(

  dat_in,

  io_out,

  io_dir,

  dat_out

 ?。?/p>

  input       dat_in;

  input       io_dir;

  output      dat_out;

  inout       io_out;

  assign      io_out  = io_dir ? dat_in : 1'bz;    assign      dat_out = io_out;

  endmodule

  如上述程序所示為單個雙向IO口的典型設(shè)計代碼,,中間由IO輸入方向控制數(shù)據(jù)和高阻之間的切換,,難題出現(xiàn)了,怎么設(shè)計240位寬的雙向IO口呢,?難道如下列程序所示:

  module inout_interface(

  dat_in,

  io_out,

  io_dir,

  dat_out

 ?。?/p>

  input  [239 : 0]     dat_in;

  input  [239 : 0]     io_dir;

  output [239 : 0]     dat_out;

  inout  [239 : 0]     io_out;

  assign      io_out  = io_dir ? dat_in : 240'bz;    assign      dat_out = io_out;

  endmodule

  顯然這樣是不行的,,因為當(dāng)io_dir為240位的時候只有當(dāng)全為0的時候此式才為假,,其余時候都為真,顯然達不到想要的每個IO都是雙向口的設(shè)計,。

  修改代碼如下:

  module inout_interface( dat_in, io_out, io_dir, dat_out ); input [239 : 0] dat_in; input [239 : 0] io_dir; output [239 : 0] dat_out; inout [239 : 0] io_out; assign io_out[0] = io_dir[0] ? dat_in[0] : 1'bz; assign dat_out[0] = io_out[0]; assign io_out[1] = io_dir[1] ? dat_in[1] : 1'bz; assign dat_out[1] = io_out[1]; assign io_out[2] = io_dir[2] ? dat_in[2] : 1'bz; assign dat_out[2] = io_out[2]; . . // 此處略去1萬行 . assign io_out[239] = io_dir[239] ? dat_in[239] : 1'bz; assign dat_out[239] = io_out[239]; endmodule

  顯然這種辦法能實現(xiàn)240位寬的獨立方向控制IO,但是估計寫代碼要累死人,,有沒得更好的辦法呢,?

  當(dāng)然有,在verilog2001中有個邏輯復(fù)制語法——generate,,可以對verilog模塊進行無限復(fù)制,。有了這個模塊我們即可輕松通過邏輯復(fù)制來達到我們的要求了。

  // 單個雙向IO實現(xiàn)模塊 module pin_inout( indat, indir, outdat, outdaTIn ),; input indat; input indir; inout outdat; output outdaTIn; assign outdat = indir ? indat : 1'bz; assign outdaTIn = outdat; endmodule module inout_interface( dat_in, io_out, io_dir, dat_out ),; input [239 : 0] dat_in; input [239 : 0] io_dir; output [239 : 0] dat_out; inout [239 : 0] io_out; // 邏輯復(fù)制240次 genvar i; generate for(i = 0; i < 240; i = i + 1) begin : pin_loop pin_inout pin_inout_inst( .indat ( dat_in[i] ), .indir ( io_dir[i] ),, .outdat ( io_out[i] ),, .outdaTIn ( dat_out[i] ) ); end endgenerate endmodule

  由上面代碼可看出,,巧妙利用verilog語法能減少自身工作量,。

  3.    總結(jié)

  在FPGA設(shè)計中有些情況的邏輯復(fù)制不需要我們做,但是有些情況的邏輯復(fù)制不得不手工完成,,因此,,熟練掌握verilog語法是設(shè)計出好的模型、減少工作量的前提,。



更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<

mmexport1621241704608.jpg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected]