ODDR的使用錯誤

2021-06-21 16:56:50 字數 2796 閱讀 1372

我在做一塊數字io卡,io卡的功能包括32路單端數字i/o輸出。

32路單端i/o的資料速率為200mbps,利用100mhz時鐘,使用oddr實現此功能。oddr能實現雙倍時鐘的資料速率。在時鐘上公升沿輸出乙個資料,在時鐘下降沿輸出另乙個資料。oddr的工作模式有2種:同沿和不同沿。同沿方式通過延遲乙個時鐘,能節省時鐘和clb資源,提高效能。

oddr#(

.ddr_clk_edge("opposite_edge"),//"opposite_edge" or "same_edge"

.init(1'b0),    // initial value of q: 1'b0 or 1'b1

.srtype("sync") // set/resettype: "sync" or "async"

) oddr_inst (

.q    (q),   // 1-bit ddr output

.c    (c),  // 1-bit clock input

.ce  (ce),// 1-bit clock enable input

.d1  (d1),// 1-bit data input (positive edge)

.d2  (d2),// 1-bit data input (negative edge)

.r    (r),   // 1-bit reset

.s     (s)    // 1-bit set

我的使用方法為:

wire[63:0] do32;

wire[31:0]    do_o;

wiredo_clk_sel;

wire[31:0]    do_en;

genvar  dq_o;

generate

for(dq_o= 0; dq_o < 32; dq_o = dq_o+1) begin: gen_do

oddr #(

.ddr_clk_edge("same_edge"),

.init(1'b0),

.srtype("sync")

) do_oddr (

.q           (do_o[dq_o]                      ),

.c           (do_clk_sel                        ),

.ce  (1'b1                                  ),

.d1  (do32[dq_o]               ),//64位

.d2  (do32[dq_o+ 32] ),

.r    (do_en[dq_o]                           ),

.s     (1'b0                                  )

endassign dio[dq_o]=do_if_ctrl[dq_o]? (do_reg_vld[dq_o]?do_reg[dq_o]: do_dout_vld? do_dout[dq_o] : do_df_out_en[ dq_o ] &(~do_df_out_en_iv[dq_o]) ?  do_df[dq_o ]: 1'bz ) :1』bz;

endgenerate

dio訊號是頂層的inout型別雙向埠。數字i/o卡的輸出資料有三種型別:暫存器靜態資料;動態資料;flash資料。綜合可以通過,但是在map過程中,出現了32個錯誤:

thedual data rate register "gen_do[0].do_oddr" failed to  join an ologic component as required.

thedual data rate register "gen_do[1].do_oddr" failed to  join an ologic component as required.

thedual data rate register "gen_do[31].do_oddr" failed to  join an ologic component as required.

錯誤的原因是oddr的輸出必須直接連到輸出pad上,不可以再引進邏輯內部。因此會出現do_oddr的輸出無法連入ologic中。

我的解決辦法是:

通過iobuf將雙向dio資料分離成要輸入到fpga中的di_d和從fpga獲得do_o. iobuf的控制位t為高時fpga輸入i埠資料使能,為低時輸出o使能。

iobuf#(

.drive(12), // specify the output drivestrength

.iostandard("default"), //specify the i/o standard

.slew("slow") // specify theoutput slew rate

) iobuf_inst (

.o            (di_d[dq_o]  ),    // buffer output to fpga

.io           (dio[dq_o]    ),  // buffer inout port (connect directly to top-level port)

.i              (do_o[dq_o]),     // buffer input from fpga

.t             (dir_o[dq_o/8 ])      // 3-state enableinput, high=input, low=output

將資料埠準備輸出的資料準備好後,再賦值給oddr的d埠,將q輸出連線iobuf的o上。map成功。

看來學習下xilinx的器件手冊還是很有用的。ug190.

git使用錯誤

問題 第一次使用git,在配置好使用環境後,當我準備開始上傳本地專案,git push u origin master 發現乙個錯誤 rejected master master non fast forward error failed to push some refs to 於是我又重新檢查之...

this指標使用錯誤

todo 給person增加過載方法setname string,string public class main 錯誤 class person public void setname string name public void setname string name,string na 建立...

Genymotion 部分使用錯誤

直接將arm元件拖拽進入genymotion。2 genymotion無法啟動或者啟動時候黑屏。在virtual box看是一直在報錯 init untracked pid 914 exited 這種型別的,但是看了官方說明,原因是 your network adapter can be misco...