Wishbone共享總線連接與點(diǎn)到點(diǎn)連接同樣重要。在本例中,兩個(gè)主設(shè)備和兩個(gè)從設(shè)備通過(guò)SYSCON實(shí)現(xiàn)了共享總線連接,在后續(xù)章節(jié)中,我們將使用該例子對(duì)Or1200進(jìn)行基本RTL驗(yàn)證。系統(tǒng)復(fù)位后,一個(gè)或者多個(gè)主設(shè)備通過(guò)置高CYC_O請(qǐng)求使用總線,仲裁器(后文將討論)選擇其中一個(gè)主設(shè)備#X(X在0和N之間),只將該主設(shè)備對(duì)應(yīng)的GNTX信號(hào)置高,而將其它GNT信號(hào)置低以通知INTERCON哪一個(gè)主設(shè)備可以使用總線。
一旦主設(shè)備選定,其輸出信號(hào)將通過(guò)選擇器送到共享總線進(jìn)而送到各個(gè)從設(shè)備。例如,如果主設(shè)備#0被中可以使用總線,則器ADR()、DAT_O()、SEL_O()、WE_O和STB_O信號(hào)將被送到各個(gè)從設(shè)備。與此同時(shí)請(qǐng)求使用總線的其他設(shè)備,將永遠(yuǎn)接收不到總線周期結(jié)束信號(hào)ACK_I/ERR_I/RTY_I。
從設(shè)備是如何被選擇的呢 '若系統(tǒng)中有M個(gè)從設(shè)備,則地址線被地址譯碼器分為M個(gè)部分,別代表每一個(gè)從設(shè)備的地址空間。從設(shè)備#Y對(duì)應(yīng)的譯碼輸出信號(hào)與共享總線上的STB_I信號(hào)相與,如果STB_I信號(hào)和從設(shè)備#Y對(duì)應(yīng)的譯碼輸出信號(hào)同時(shí)為高,從設(shè)備#Y才發(fā)起對(duì)主設(shè)備操作的響應(yīng)。
各個(gè)從設(shè)備輸出的總線周期結(jié)束ACK_O/ERR_O/RTY_O被通過(guò)或門(mén)送到各個(gè)主設(shè)備的ACK_I/ERR_I/RTY_I。而從設(shè)備的DAT_O()輸出則通過(guò)選擇器送到各個(gè)主設(shè)備的輸入端,這個(gè)選擇器的輸入為共享地址總線。
圖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
);
……//這里忽略了端口定義
//仲裁器,兩個(gè)主設(shè)備,兩個(gè)從設(shè)備
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));
//共享總線周期有效信號(hào)CYC,從各主設(shè)備到各從設(shè)備assign wb0_cyc_o=CYC;
assign wb1_cyc_o=CYC;
//共享地址信號(hào)
assign shared_address=GNT1?wb1_addr_i:wb0_addr_i;
assign wb0_addr_o=shared_address;
assign wb1_addr_o=shared_address;
//從各主設(shè)備到各從設(shè)備的共享數(shù)據(jù)總線
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;
//從各從設(shè)備到各主設(shè)備的共享數(shù)據(jù)總線
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;
//從各主設(shè)備到各從設(shè)備的共享選擇信號(hào)
wire [3:0] shared_sel=GNT1?wb1_sel_i:wb0_sel_i;
assign wb0_sel_o=shared_sel;
assign wb1_sel_o=shared_sel;
//從各主設(shè)備到各從設(shè)備的共享寫(xiě)使能信號(hào)
wire shared_we=GNT1?wb1_we_i:wb0_we_i;
assign wb0_we_o=shared_we;
assign wb1_we_o=shared_we;
//從各主設(shè)備到各從設(shè)備的共享選通信號(hào)
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;
//從各從設(shè)備到各主設(shè)備的應(yīng)答信號(hào)
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
-
總線
+關(guān)注
關(guān)注
10文章
2888瀏覽量
88137 -
Wishbone
+關(guān)注
關(guān)注
0文章
16瀏覽量
10438
原文標(biāo)題:【博文連載】Wishbone共享總線連接示例
文章出處:【微信號(hào):ChinaAET,微信公眾號(hào):電子技術(shù)應(yīng)用ChinaAET】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論