在vivado中,emio ip(system和axi擴充套件部分)引出實際上有3個管腳,分別是gpio_i,gpio_o,gpio_t,
要把它們轉化為標準的gpio,要外加緩衝器,步驟如下
在頂層模組中,會生成如下**
iobuf gpio_0_tri_iobuf_0
(.i(gpio_0_tri_o_0),
.io(gpio_0_tri_io[0]),
.o(gpio_0_tri_i_0),
.t(gpio_0_tri_t_0));
iobuf gpio_0_tri_iobuf_1
(.i(gpio_0_tri_o_1),
.io(gpio_0_tri_io[1]),
.o(gpio_0_tri_i_1),
.t(gpio_0_tri_t_1));
iobuf gpio_0_tri_iobuf_10
(.i(gpio_0_tri_o_10),
.io(gpio_0_tri_io[10]),
.o(gpio_0_tri_i_10),
.t(gpio_0_tri_t_10));
iobuf gpio_0_tri_iobuf_11
(.i(gpio_0_tri_o_11),
.io(gpio_0_tri_io[11]),
.o(gpio_0_tri_i_11),
.t(gpio_0_tri_t_11));
有多少io,就會有多少個緩衝器。
緩衝器內部結構如圖所示
這個緩衝器其實也可以自己寫得更加簡潔一些,比如adi官方的例子
module呼叫ad_iobuf (
dio_t,
dio_i,
dio_o,
dio_p);
parameter data_width = 1;
input [(data_width-1):0
] dio_t;
input [(data_width-1):0
] dio_i;
output [(data_width-1):0
] dio_o;
inout [(data_width-1):0
] dio_p;
genvar
n;
generate #迴圈例化
for (n = 0; n < data_width; n = n + 1) begin
: g_iobuf
assign dio_o[n] =dio_p[n];
assign dio_p[n] = (dio_t[n] == 1
'b1) ? 1
'bz : dio_i[n];
endendgenerate
endmodule
ad_iobuf #(當然,這樣一來更新稍有不便,而且需要手工增加3個線,有點複雜。.data_width(
32) #引數輸入,例化32個
) i_iobuf (
.dio_t(gpio_t[
31:0
]), .dio_i(gpio_o[
31:0
]), .dio_o(gpio_i[
31:0
]), .dio_p(gpio_bd));
如沒有特殊要求推薦第一種方法。
vc雙緩衝 VC 雙緩衝實現方法
在圖形圖象處理程式設計過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應wm paint訊息的時候要進行複雜的圖形處理,那麼窗體在重繪時由於過頻的重新整理而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因為窗體在重新整理時,總要有乙個擦除原來圖象的過程onerasebkgnd,它利用背景...
mfc下實現雙緩衝的方法
本帖解決的問題 如何實現雙緩衝 為什麼實現了雙緩衝還是會閃爍?以下資料為本人積累和加上自己的經驗 1 簡介一下windows mfc的view顯示重新整理過程 1 使用背景刷填充view窗體 呼叫內在機制的 2 呼叫onpain ondraw 呼叫使用者的 2 產生閃爍的原因出在於 當我們很快地重新...
如何實現雙緩衝 vc雙緩衝
cdc memdc 首先定義乙個顯示裝置物件 cbitmap membitmap 定義乙個位圖物件 隨後建立與螢幕顯示相容的記憶體顯示裝置 memdc.createcompatibledc null 這時還不能繪圖,因為沒有地方畫 下面建立乙個與螢幕顯示相容的點陣圖,至於點陣圖的大小嘛,可以用視窗的...