Wishbone共享總線連接與點到點連接同樣重要。在本例中,兩個主設備和兩個從設備通過SYSCON實現了共享總線連接,在后續章節中,我們將使用該例子對Or1200進行基本RTL驗證。系統復位后,一個或者多個主設備通過置高CYC_O請求使用總線,仲裁器(后文將討論)選擇其中一個主設備#X(X在0和N之間),只將該主設備對應的GNTX信號置高,而將其它GNT信號置低以通知INTERCON哪一個主設備可以使用總線。
一旦主設備選定,其輸出信號將通過選擇器送到共享總線進而送到各個從設備。例如,如果主設備#0被中可以使用總線,則器ADR()、DAT_O()、SEL_O()、WE_O和STB_O信號將被送到各個從設備。與此同時請求使用總線的其他設備,將永遠接收不到總線周期結束信號ACK_I/ERR_I/RTY_I。
從設備是如何被選擇的呢 '若系統中有M個從設備,則地址線被地址譯碼器分為M個部分,別代表每一個從設備的地址空間。從設備#Y對應的譯碼輸出信號與共享總線上的STB_I信號相與,如果STB_I信號和從設備#Y對應的譯碼輸出信號同時為高,從設備#Y才發起對主設備操作的響應。
各個從設備輸出的總線周期結束ACK_O/ERR_O/RTY_O被通過或門送到各個主設備的ACK_I/ERR_I/RTY_I。而從設備的DAT_O()輸出則通過選擇器送到各個主設備的輸入端,這個選擇器的輸入為共享地址總線。
圖22 基于選擇器的Wishbone共享總線連接示例
intercon模塊的源碼如下:
module intercon2M2S(clk_i,rst_i,wb0s_data_i,
wb0s_data_o,wb0_addr_i,wb0_sel_i,
wb0_we_i,wb0_cyc_i,wb0_stb_i,wb0_ack_o,
wb0_err_o,wb0_rty_o,wb0m_data_i,
wb0m_data_o,wb0_addr_o,wb0_sel_o,
wb0_we_o,wb0_cyc_o,wb0_stb_o,wb0_ack_i,
wb0_err_i,wb0_rty_i,wb1s_data_i,
wb1s_data_o,wb1_addr_i,wb1_sel_i,
wb1_we_i,wb1_cyc_i,wb1_stb_i,wb1_ack_o,
wb1_err_o,wb1_rty_o,wb1m_data_i,
wb1m_data_o,wb1_addr_o,wb1_sel_o,
wb1_we_o,wb1_cyc_o,wb1_stb_o,wb1_ack_i,
wb1_err_i,wb1_rty_i
);
……//這里忽略了端口定義
//仲裁器,兩個主設備,兩個從設備
wire GNT0,GNT1,CYC;
arbiter2M2S arbiter2M2S(.CLK(clk_i),.RST(rst_i),.CYC0(wb0_cyc_i),.CYC1(wb1_cyc_i),
.GNT0(GNT0),.GNT1(GNT1),.CYC(CYC));
//地址譯碼器
wire ACMP0,ACMP1;
wire [31:0] shared_address;
address_decoder2S
address_decoder2S(.addr_i(shared_address),.ACMP0(ACMP0),.ACMP1(ACMP1));
//共享總線周期有效信號CYC,從各主設備到各從設備assign wb0_cyc_o=CYC;
assign wb1_cyc_o=CYC;
//共享地址信號
assign shared_address=GNT1?wb1_addr_i:wb0_addr_i;
assign wb0_addr_o=shared_address;
assign wb1_addr_o=shared_address;
//從各主設備到各從設備的共享數據總線
wire [31:0] shared_data_m2s=GNT1?wb1m_data_i:wb0m_data_i;
assign wb0s_data_o=shared_data_m2s;
assign wb1s_data_o=shared_data_m2s;
//從各從設備到各主設備的共享數據總線
wire [31:0] shared_data_s2m=ACMP1?wb1s_data_i:wb0s_data_i;
assign wb0m_data_o=shared_data_s2m;
assign wb1m_data_o=shared_data_s2m;
//從各主設備到各從設備的共享選擇信號
wire [3:0] shared_sel=GNT1?wb1_sel_i:wb0_sel_i;
assign wb0_sel_o=shared_sel;
assign wb1_sel_o=shared_sel;
//從各主設備到各從設備的共享寫使能信號
wire shared_we=GNT1?wb1_we_i:wb0_we_i;
assign wb0_we_o=shared_we;
assign wb1_we_o=shared_we;
//從各主設備到各從設備的共享選通信號
wire shared_stb=GNT1?wb1_stb_i:wb0_stb_i;
assign wb0_stb_o=ACMP0?shared_stb:1'b0;
assign wb1_stb_o=ACMP1?shared_stb:1'b1;
//從各從設備到各主設備的應答信號
wire shared_ack=ACMP0?wb0_ack_i:wb1_ack_i;
assign wb0_ack_o=shared_ack;
assign wb1_ack_o=shared_ack;
wire shared_err=ACMP0?wb0_err_i:wb1_err_i;
assign wb0_err_o=shared_err;
assign wb1_err_o=shared_err;
wire shared_rty=ACMP0?wb0_rty_i:wb1_rty_i;
assign wb0_rty_o=shared_rty;
assign wb1_rty_o=shared_rty;
endmodule
-
總線
+關注
關注
10文章
2881瀏覽量
88090 -
Wishbone
+關注
關注
0文章
16瀏覽量
10434
原文標題:【博文連載】Wishbone共享總線連接示例
文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論