基于網絡編碼的多信源組播通信系統(tǒng),包括源代碼,原理圖等 (三)
3.4 解碼路由器詳細設計方案
3.4.1 解碼路由器系統(tǒng)整體模塊圖
如下圖3.4-1所示,為解碼路由器的整體模塊圖
3.4-1 解碼路由器系統(tǒng)整體模塊圖
3.4.2系統(tǒng)中各單元模塊的功能與時序
1、Input_arbiter:采用輪詢策略,當fifo非空時從fifo接收數據,根據mac header判斷數據是否為IP數據包,若是,則將數據發(fā)送到DRAM讀寫控制模塊,同時將信源號、代編號發(fā)送到CAM讀寫控制模塊。
可用一個兩狀態(tài)的狀態(tài)機實現:即輪詢判斷輸入和數據輸出:在FIFO非空時讀數據,并根據數據包的類型發(fā)送到DRAM讀寫控制器或output fifo中,若是IP數據包,同時將信源號、代編號發(fā)送給CAM讀寫控制。
主要信號列表:
信號名稱 | 位寬 bit | I/O | 描述 |
Wr_vld_arb | 1 | 寫DRAM控制器有效 | |
Out_data_0 | 64 | 輸出至DRAM的data | |
Out_ctrl_0 | 8 | 輸出至DRAM德ctrl | |
Src_gen_seq | 24 | 信源號、代的編號 | |
Cam_vld | 1 | 寫CAM控制器有效 | |
Port_num_dram | 2 | 數據的接收端口號 | |
Out_data_1 | 64 | 輸出至output arbiter的data | |
Out_ctrl_1 | 8 | 輸出至output arbiter的ctrl | |
Wr_vld_1 | 1 | 輸出至output arbiter信號有效 |
2、output_arbiter
圖3.4-2 output_arbiter結構圖
本模塊的結構如圖3.4-2所示,由兩個輸入fifo和一個輸出仲裁器組成,兩個fifo緩存來自SRAM和input_arbiter的數據包,Output_arbiter的作用是將解碼后的數據發(fā)送到MAC層。由于對于非IP數據包我們并沒有對其進行編碼,所以在解碼路由器中由input_arbiter判斷后直接輸出output_arbiter;對于編碼后的IP數據包,在解碼后先暫存到SRAM中,再發(fā)送出去。本模塊就是輪流判斷并接收來自SRAM和input_arbiter的數據,并將數據包發(fā)送到MAC層。
輸入輸出信號列表:
信號名稱 | 位寬bits | I/O | 描述 |
out_data_3 | 64 | O | 輸出至MAC層的數據總線 |
out_ctrl_3 | 8 | O | 輸出至MAC層的控制總線 |
out_wr_3 | 1 | O | 輸出有效 |
out_rdy_3 | 1 | I | MAC層空閑標志 |
dcod_data_0 | 64 | I | 已經解碼的IP數據包的數據總線 |
dcod_ctrl_0 | 8 | I | 已經解碼的IP數據包的控制總線 |
wr_vld_0 | 1 | I | 寫有效 |
wr_rdy_0 | 1 | O | 接收數據空閑標志 |
non_ip_data | 64 | I | 非IP數據包數據總線 |
non_ip_ctrl | 8 | I | 非IP數據包控制總線 |
wr_vld_1 | 1 | I | 寫有效 |
wr_rdy_1 | 1 | O | 接收數據空閑標志 |
3、decoded_reg_grp
本模塊分別與decode_control_panel,decoder和SRAM_contrl相連接,主要作用是記錄信源的某代數據包是否已經解碼,并將相應的解碼信息輸出給其他模塊,模塊結構如圖3.4-3:
圖3.4-3:decoded_reg_grp模塊圖
端口列表:
信號名稱 | 位寬bits | I/O | 描述 |
rd_dcod_reg_req_0 | 1 | I | 讀取解碼標志位請求 |
rd_dcod_src_gen_0 | 12 | I | 要讀取的數據包的信源號和代編號 |
req_ack_vld_0 | 1 | O | 輸出有效 |
alredy_decod_0 | 1 | O | 解碼標志(“1”代表已經解碼,“0”代表未解碼) |
rd_dcod_reg_req_1 | 1 | I | 讀取解碼標志位請求 |
rd_dcod_src_gen_1 | 12 | I | 要讀取的數據包的信源號和代編號 |
req_ack_vld_1 | 1 | O | 輸出有效 |
alredy_decod_1 | 1 | O | 解碼標志(為1時代表已經解碼,為0時未解碼) |
set_req | 1 | I | 置位請求 |
set_src_gen | 12 | I | 需要置位的數據包(表示已經解碼完畢) |
set_info_vld | 1 | I | 置位信息有效 |
set_ack | 1 | O | 置位請求響應 |
reset_req | 1 | I | 復位請求 |
reset_src_gen | 12 | I | 需要復位的數據包(表示解碼后已發(fā)送完畢) |
reset_info_vld | 1 | I | 復位信息有效 |
reset_ack | 1 | O | 復位請求響應 |
?、?讀解碼標志
當decoder模塊或decode_control_panel讀取解碼標志時,將查詢結果輸出,alredy_decod_0和alredy_decod_1為“1”時表示本次查詢的數據包已經解碼,為“0”時表示未被解碼,以與decoder接口為例,讀取解碼標志的時序如圖3.4-4:
圖3.4-4:讀解碼標志位時序圖
② 寫解碼標志位
當decoder把一個數據包解碼成功后,就把相應的解碼標志位置1,當SRAM_control將一個數據包發(fā)送出去后,再將相應的解碼標志位置0,以置位為例,解碼標志位的寫時序如圖3.4-5:
圖3.4-5:置位解碼標志寄存器
4、DRAM控制器:接收數據,并順序存儲到DRAM中去。
注意:我們將DRAM分為三塊,分別對應于數據接收的三個信道,即第0個信道的數據存儲到DRAM的第0塊,第1個信道的數據存儲到DRAM的第1塊……信道號由port_num給出。由于DRAM是按照block讀寫的,因此每個block大小為2034字節(jié),位寬為144位。
圖3.4-6:DRAM控制器模塊圖
① DRAM控制器與DRAM的接口與讀寫時序:
Signal Group | Signal Name | Direction | Bits | Description |
Request Negotiation | p_wr_req | from user logic to block-of-data rd/wr module | 1 | 1=request for write transfer (data are from user logic to DRAM), 0=otherwise |
Request Negotiation | p_wr_ptr | from user logic to block-of-data rd/wr module | PKT_MEM_PTR_WIDTH | the start address of DRAM for transfer. Each unit is 16-byte piece |
Request Negotiation | p_wr_ack | from block-of-data rd/wr module to user logic | 1 | 1=the arbiter acknowledges that the write requester can proceed, 0=otherwise |
Data Transfer | p_wr_data_vld | from user logic to block-of-data rd/wr module | 1 | 1=the write data is valid, 0=otherwise |
Data Transfer | p_wr_data | from user logic to block-of-data rd/wr module | PKT_DATA_WIDTH | the data transferred from user logic to DRAM |
Data Transfer | p_wr_full | from block-of-data rd/wr module to user logic | 1 | 1=notify the user logic to pause transfer the next clock cycle until this signal is deasserted, 0=otherwise |
Data Transfer | p_wr_done | from block-of-data rd/wr module to user logic | 1 | 1=this is the last write and no more write will be accepted for this block-of-data, 0=otherwise |
寫DRAM時序如圖3.4-7:
圖3.4-7 寫DRAM時序圖
讀端口:
Signal Group | Signal Name | Direction | Bits | Description |
Request Negotiation | p_rd_req | from user logic to block-of-data rd/wr module | 1 | 1=request for read transfer (data are from DRAM to user logic), 0=otherwise |
Request Negotiation | p_rd_ptr | from user logic to block-of-data rd/wr module | PKT_MEM_PTR_WIDTH | the start address of DRAM for transfer. Each unit is 16-byte piece |
Request Negotiation | p_rd_ack | from block-of-data rd/wr module to user logic | 1 | 1=the arbiter acknowledges that the read requester can proceed, 0=otherwise |
Data Transfer | p_rd_rdy | from block-of-data rd/wr module to user logic | 1 | 1=block-of-data rd/wr module has data for user logic to read, 0=otherwise |
Data Transfer | p_rd_en | from user logic to block-of-data rd/wr module | 1 | 1=user logic reads out one word of data from the block-of-data rd/wr module, 0=otherwise |
Data Transfer | p_rd_data | from block-of-data rd/wr module to user logic | PKT_DATA_WIDTH | data transferred from block-of-data rd/wr module to user logic |
Data Transfer | p_rd_done | from block-of-data rd/wr module to user logic | 1 | 1=this is the last read data and no more data will be read for this block-of-data, 0=otherwise |
讀DRAM時序如圖3.4-8:
圖3.4-8 寫DRAM時序圖
② 其他模塊對DRAM控制器的讀/寫過程:
當DRAM讀寫控制器將一個數據包讀/寫完之后, 就將rd_idle/wr_rdy_arb置為1,當外部模塊需要對DRAM進行讀寫時,首先要判斷這兩個信號是否有效,在有效的情況下進行對數據的操作。.端口列表如下:
信號名稱 | 位寬bits | I/O | 描述 |
wr_vld_arb | 1 | I | Input_arbiter輸入有效 |
out_data_0 | 64 | I | 輸入的數據包的data_bus |
out_ctrl_0 | 8 | I | 輸入數據包的ctrl_bus |
port_num_dram | 2 | I | 輸入信號的端口號,指明數據存放在DRAM的區(qū)域 |
wr_rdy_arb | 1 | O | 寫空閑信號 |
port_num_rd | 2 | I | 讀取數據包的區(qū)域 |
addr_vld | 1 | I | 讀地址有效 |
block_num_rd | 8 | I | 數據包存放的block的起始地址 |
rd_idle | 1 | O | 讀空閑信號 |
in_rdy | 1 | I | 數據輸出輸出允許信號 |
out_data | 64 | O | 讀出的數據包的data_bus |
out_ctrl | 8 | O | 輸出數據包的ctrl_bus |
data_vld | 1 | O | 輸出數據有效 |
(1)當decode_control_panel對DRAM控制器進行讀操作時,將信道號和block地址發(fā)送至DRAM控制器,接著DRAM控制器從DRAM中讀取數據,當decoder空閑時將數據發(fā)送出去,時序圖如3.4-9所示:
圖3.4-9 對DRAM控制器的讀操作
(2)當DRAM控制器進行寫操作時,將按照input_arbiter發(fā)送過來的端口號,按照地址大小順序寫DRAM,時序圖如3.4-10:
圖3.4-10 對DRAM控制器的寫操作
5、decode_control_panel
① 本模塊的內部結構圖如3.4-11所示,它由以下五個模塊組成:cam_info_save, decode_control_sm和3個CAM組成。
圖3.4-11:decode_control_panel內部結構圖
本模塊的輸入輸出端口定義表如下:
端口名稱 | 位寬 bits | I/O | 描述 |
port_num_cam | 2 | In | 數據寫入的CAM號,即信道號 |
Src_gen_seq | 24 | In | 輸入數據包的信源號、代編號 |
Cam_vld | 1 | In | 寫有效 |
Cam_rdy | 1 | Out | 寫Cam準備好 |
rd_idle | 1 | In | DRAM準備好 |
block_num_rd | 8 | Out | 讀DRAM的地址 |
addr_vld | 1 | Out | 讀地址有效 |
port_num_rd | 2 | out | 要讀取的DRAM的編號 |
Pkt_vld | 1 | Out | 要解碼的數據包輸出有效標志 |
Pkt_decoding | 12 | out | 正在解碼的數據包的信源號、代編號 |
Decod_com | 1 | In | 數據包解碼完成標志 |
has_other_factor | 1 | Out | 有另外一個解碼因子 |
Pkt_not_find | 1 | Out | 所需要解碼數據包未找到 |
pkt_need_src_gen | 12 | In | 解碼需要的數據包 |
need_pkt_vld | 1 | In | 所需數據包有效 |
rd_dcod_reg_req_1 | 1 | Out | 讀解碼標志寄存器請求 |
req_ack_vld_1 | 1 | In | 標志位有效 |
Alredy_Decod_1 | 1 | In | 解碼標志位 |
rd_dcod_src_gen_1 | 12 | out | 查詢數據包是否已經解碼 |
② cam_info_save:
該模塊的主要功能是將輸入的數據包的信源號和代的編號按地址大小順序存入到三個cam中,每個cam分別對應于三個數據輸入通道。每個CAM的大小是24bits×256,我們要求CAM的讀寫操作可以同時進行,寫數據從DIN進入,而讀(查詢)的數據從CMP_DIN進入,寫操作時BUSY信號有效,表示不可以響應其他寫請求,圖3.4-12是一個CAM的讀寫操作時序:
圖3.4-12:CAM讀寫過程
評論