ZYNQ GPIO 緩衝實現方法

2022-09-01 17:54:11 字數 1981 閱讀 8002

在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 #(

.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));

當然,這樣一來更新稍有不便,而且需要手工增加3個線,有點複雜。

如沒有特殊要求推薦第一種方法。

vc雙緩衝 VC 雙緩衝實現方法

在圖形圖象處理程式設計過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應wm paint訊息的時候要進行複雜的圖形處理,那麼窗體在重繪時由於過頻的重新整理而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因為窗體在重新整理時,總要有乙個擦除原來圖象的過程onerasebkgnd,它利用背景...

mfc下實現雙緩衝的方法

本帖解決的問題 如何實現雙緩衝 為什麼實現了雙緩衝還是會閃爍?以下資料為本人積累和加上自己的經驗 1 簡介一下windows mfc的view顯示重新整理過程 1 使用背景刷填充view窗體 呼叫內在機制的 2 呼叫onpain ondraw 呼叫使用者的 2 產生閃爍的原因出在於 當我們很快地重新...

如何實現雙緩衝 vc雙緩衝

cdc memdc 首先定義乙個顯示裝置物件 cbitmap membitmap 定義乙個位圖物件 隨後建立與螢幕顯示相容的記憶體顯示裝置 memdc.createcompatibledc null 這時還不能繪圖,因為沒有地方畫 下面建立乙個與螢幕顯示相容的點陣圖,至於點陣圖的大小嘛,可以用視窗的...