基于網(wǎng)絡(luò)編碼的多信源組播通信系統(tǒng),包括源代碼,原理圖等 (三)
3 系統(tǒng)的詳細(xì)設(shè)計(jì)方案
3.1 概述
在組播網(wǎng)絡(luò)的拓?fù)鋱D中,編碼路由器、轉(zhuǎn)發(fā)路由器和解碼路由器是三個(gè)獨(dú)立的系統(tǒng),各自完成編碼、轉(zhuǎn)發(fā)和解碼的任務(wù)。前面講過,分組的編碼、解碼主要在網(wǎng)絡(luò)層完成。在網(wǎng)絡(luò)層中數(shù)據(jù)通道中,data bus和ctrl bus是同步傳輸?shù)?,二者之間的關(guān)系和格式如圖3.1-1所示:
ctrl bus(8位) |
Data bus(64位) |
ff |
module header |
00 |
Pkt data1 |
00 |
…… |
xy(xy≠00) |
Last pkt data |
圖3.1-1 數(shù)據(jù)通道中的data bus和ctrl bus
Ctrl為ff時(shí),表明為一個(gè)數(shù)據(jù)包的包頭,xy為非零數(shù)據(jù),指明最后一個(gè)有效的字節(jié)所在的位置,如01000000指明是第7個(gè),即data[63:48]為有效數(shù)據(jù)。模塊之間數(shù)據(jù)傳輸?shù)倪^程是:若上一個(gè)模塊已經(jīng)處理完畢,想把數(shù)據(jù)傳輸?shù)较乱粋€(gè)模塊,首先判斷輸入信號rdy是否有效,當(dāng)rdy = 1時(shí),將數(shù)據(jù)和控制信號同步發(fā)送出去,同時(shí)wr_vld信號有效,時(shí)序如圖3.1-2所示:
圖3.1-2 有效的數(shù)據(jù)傳輸時(shí)序
3.2 編碼路由器詳細(xì)設(shè)計(jì)方案
3.2.1編碼系統(tǒng)整體模塊如圖3.2-1所示
圖3.2-1:編碼系統(tǒng)整體模塊圖
3.2.2系統(tǒng)中各單元模塊的功能與時(shí)序
(1)Input arbiter
?、?Input arbiter內(nèi)部結(jié)構(gòu)如圖3.2-2所示:
圖3.2-2 Input arbiter內(nèi)部結(jié)構(gòu)圖
② 本模塊輸入輸出信號列表及說明
Signal name |
Bit width |
Input or output |
description |
Input_fifo_data_1 |
64 |
input |
Input data bus from “input FIFO 1” |
Input_fifo_ctrl_1 |
8 |
input |
Input ctrl bus from “input FIFO 1” |
Input_fifo_empty_1 |
1 |
input |
1=input FIFO is empty,0=otherwise |
Input_fifo_rd_en_1 |
1 |
output |
Read enable |
Input_fifo_data_2 |
64 |
input |
Input data bus from “input FIFO 2” |
Input_fifo_ctrl_2 |
8 |
input |
Input ctrl bus from “input FIFO 2” |
Input_fifo_empty_2 |
1 |
input |
1=input FIFO is empty,0=otherwise |
Input_fifo_rd_en_2 |
1 |
output |
Read enable |
Data_arbiter_ctrl_1 |
64 |
output |
Output data bus to “control module” |
Ctrl_arbiter_ctrl_1 |
8 |
Output |
Output ctrl bus to “control module” |
Val_arbitrer_ctrl_1 |
1 |
Output |
1=data from input arbiter 1 to head splitter 1 is valid, 0=otherwise |
Rdy_arbiter_ctrl_1 |
1 |
Input |
1=module “head splitter 1” is ready to receive |
Data_arbiter_ctrl_2 |
64 |
output |
Output data bus to “control module” |
Ctrl_arbiter_ctrl_2 |
8 |
Output |
Output ctrl bus to “control module” |
Val_arbitrer_ctrl_2 |
1 |
Output |
1=data from input arbiter 2 to head splitter 2 is valid, 0=otherwise |
Rdy_arbiter_ctrl_2 |
1 |
Input |
1=module “head splitter 2” is ready to receive, 0=otherwise |
Data_arbiter_out_1 |
64 |
output |
Output data bus to “output arbiter module” |
Ctrl_arbiter_out_1 |
8 |
Output |
Output ctrl bus to “output arbiter module” |
Val_arbiter_out_1 |
1 |
Output |
1=data from input arbiter 1 to output arbiter is valid, 0=otherwise |
Rdy_arbiter_out_1 |
1 |
Input |
1=module “output arbiter” is ready to receive from input arbiter 1, 0=otherwise |
Data_arbiter_out_2 |
64 |
output |
Output data bus to “output arbiter module” |
Ctrl_arbiter_out_2 |
8 |
Output |
Output ctrl bus to “output arbiter module” |
Val_arbiter_out_2 |
1 |
Output |
1=data from input arbiter 2 to output arbiter is valid, 0=otherwise |
Rdy_arbiter_out_2 |
1 |
Input |
1=module “output arbiter” is ready to receive from input arbiter 2, 0=otherwise |
clk |
1 |
Input |
System clock, running at 125MHz |
Rst_n |
1 |
input |
System asynchronous reset signal |
③ 功能描述及數(shù)據(jù)流
本模塊執(zhí)行輸入仲裁功能。兩個(gè)獨(dú)立的input arbiter模塊分別從兩個(gè)輸入FIFO讀出數(shù)據(jù)包,判斷數(shù)據(jù)包類型,決定輸出端口(非IP包直接送往output arbiter,IP包送往control),輸出數(shù)據(jù)。
為了判斷數(shù)據(jù)包類型,需要獲取16-bit Ether Type信息,該信息位于每個(gè)數(shù)據(jù)包第二個(gè)double word中的31:16位,若Ether Type為0x0080,則說明此數(shù)據(jù)包為IP數(shù)據(jù)包,若Ether Type值不是0x0080,則說明此數(shù)據(jù)包不是IP數(shù)據(jù)包,將被直接送往output arbiter模塊。
?、?關(guān)鍵時(shí)序及狀態(tài)機(jī)
本模塊的狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)化如圖3.2-3所示
圖3.2-3:input arbiter狀態(tài)轉(zhuǎn)換圖
2、Control
① 子模塊列表
Sub module name |
quantity |
description |
Head_spliter |
2 |
Split head and payload, send head to “head info extractor”, send payload to “FIFO ctrl payload” |
Head_info_extractor |
2 |
Receive head from “head splitter”, extract “source number”, generate “generation number”. Store legacy head and packing info head respectively in “FIFO ctrl legacy” and “FIFO ctrl packinginfo” |
Control_arbiter |
1 |
Detect ctrl bus to determine whether should process both channels synchronously or hold one channel and process the other. |
FIFO ctrl payload |
2 |
Standard FIFO generated by CoreGen, store payload |
FIFO ctrl legacy |
2 |
Standard FIFO generated by CoreGen, store legacy head |
FIFO ctrl packinginfo |
2 |
Standard FIFO generated by CoreGen, store packing info head |
② 內(nèi)部結(jié)構(gòu)如圖3.2-4
圖3.2-4:control模塊內(nèi)部結(jié)構(gòu)
③ 本模塊輸入輸出信號列表及說明
Signal name |
Bit width |
Input or output |
description |
Data_arbiter_ctrl_1 |
64 |
Input |
Input data bus from “input arbiter 1” |
Ctrl_arbiter_ctrl_1 |
8 |
Input |
Input ctrl bus from “input arbiter 1” |
Val_arbiter_ctrl_1 |
1 |
Input |
1=data from input arbiter 1 to head splitter 1 is valid, 0=otherwise |
Rdy_arbiter_ctrl_1 |
1 |
output |
1=module “head splitter 1” is ready to receive from input arbiter 1, 0=otherwise |
Data_arbiter_ctrl_2 |
64 |
Input |
Input data bus from “input arbiter 2” |
Ctrl_arbiter_ctrl_2 |
8 |
Input |
Input ctrl bus from “input arbiter 2” |
Val_arbiter_ctrl_2 |
1 |
Input |
1=data from input arbiter 2 to head splitter 2 is valid, 0=otherwise |
Rdy_arbiter_ctrl_2 |
1 |
output |
1=module “head splitter 2” is ready to receive from input arbiter 2, 0=otherwise |
Data_payloadfifo_router_1 |
64 |
output |
output data bus to “payload router” |
Ctrl_payloadfifo_router_1 |
8 |
output |
Output ctrl bus to “payload router” |
Rd_en_payloadfifo_router_1 |
1 |
Input |
Read enable |
Empty_payloadfifo_router_1 |
1 |
output |
1=FIFO ctil payload 1 is empty,0=otherwise |
Data_payloadfifo_router_2 |
64 |
output |
output data bus to “payload router” |
Ctrl_payloadfifo_router_2 |
8 |
output |
Output ctrl bus to “payload router” |
Rd_en_payloadfifo_router_2 |
1 |
Input |
Read enable |
Empty_payloadfifo_router_2 |
1 |
output |
1=FIFO ctrl payload 2 is empty,0=otherwise |
Data_center_legacyfifo_1 |
64 |
Output |
Output data bus to “packing center” |
Rd_en_center_legacyfifo_1 |
1 |
Input |
Read enable |
Data_center_packingfifo_1 |
14 |
Output |
Output data bus to “packing center” |
Rd_en_center_packingfifo_1 |
1 |
input |
Read enable |
Data_center_legacyfifo_2 |
64 |
Output |
Output data bus to “packing center” |
Rd_en_center_legacyfifo_2 |
1 |
Input |
Read enable |
Data_center_packingfifo_2 |
14 |
Output |
Output data bus to “packing center” |
Rd_en_center_packingfifo_2 |
1 |
input |
Read enable |
clk |
1 |
input |
System clock, running at 125MHz |
Rst_n |
1 |
input |
System asynchronous reset signal |
④ 功能描述及數(shù)據(jù)流
本模塊為主控制模塊。子模塊control arbiter通過監(jiān)控兩條輸入通道的ctrl bus,控制子模塊head_spliter的兩個(gè)獨(dú)立的例化。具體控制操作如下:
若兩條輸入通道同時(shí)進(jìn)來新的IP包,則同時(shí)處理兩條通道。
若輸入通道1進(jìn)來新IP包時(shí),通道2中IP包已經(jīng)在處理中,則阻塞通道1,直至通道2處理完畢再重新判決。
若同時(shí)處理兩條通道時(shí),兩條通道中的數(shù)據(jù)包深度相同,則無需“PADDING”操作。若通道1中數(shù)據(jù)包發(fā)送完畢時(shí)(ctrl bus用one-hot-code標(biāo)明結(jié)尾字節(jié)),通道2中數(shù)據(jù)包尚未發(fā)送完畢,則需對通道1中數(shù)據(jù)包補(bǔ)零,并在ctrl bus中用0b11110000標(biāo)明此為padding數(shù)據(jù)。
子模塊head_spliter分離包頭和負(fù)載,并分別發(fā)往head_info_extractor提取封裝信息和FIFO_ctrl_payload暫存負(fù)載。
子模塊head_info_extractor提取包頭中的源IP地址,并由此生成4-bit信源編號(source number)和10-bit代編號(generation number),將生成的封裝信息存入FIFO_ctrl_packinginfo,將原始包頭存入FIFO_ctrl_legacy。
⑤ 關(guān)鍵時(shí)序及狀態(tài)機(jī)
Head_spliter狀態(tài)機(jī)如圖3.2-5
圖3.2-5:Head_spliter狀態(tài)機(jī)
Control arbiter時(shí)序圖
Head spliter時(shí)序圖
3、Coding
① 子模塊列表
Submodule name |
quantity |
description |
Payload router |
1 |
Determine by the arrival of packets from both channels, whether should process coding or transport directly to packing module |
M64×8 multiplier |
2 |
Multiply 64-bit data from “payload router” by 8-bit random number from “prng tap16” |
Prng tap16 |
1 |
8-bit random number generator |
M72×72 adder |
1 |
72-bit by 72-bit full adder |
M72to64 converter |
1 |
Convert data bus width from 72-bit to 64-bit |
② Coding模塊的內(nèi)部結(jié)構(gòu)如圖3.2-6
圖3.2-6:coding模塊內(nèi)部結(jié)構(gòu)
③ 本模塊輸入輸出信號列表及說明
Signal name |
Bit width |
I/O |
description |
Data_payloadfifo_router_1 |
64 |
Input |
Input data bus from “FIFO ctrl payload 1” |
Ctrl_payloadfifo_router_1 |
8 |
Input |
Input ctrl bus from “FIFO ctrl payload 1” |
empty_payloadfifo_router_1 |
1 |
Input |
1=FIFO ctrl payload 1 is empty,0=otherwise |
Rd_en_payloadfifo_rouer_1 |
1 |
output |
Read enable |
Data_payloadfifo_router_2 |
64 |
Input |
Input data bus from “FIFO ctrl payload 2” |
Ctrl_payloadfifo_router_2 |
8 |
Input |
Input ctrl bus from “FIFO ctrl payload 2” |
empty_payloadfifo_router_2 |
1 |
Input |
1=FIFO ctrl payload 2 is empty,0=otherwise |
Rd_en_payloadfifo_rouer_2 |
1 |
output |
Read enable |
Router status |
3 |
output |
Output FSM state signal to “packing FIFO” and “packing center”, coordinate with the control of packing procedure |
Data_router_packingfifo |
73 |
output |
Output data bus to “packing FIFO”. Bit 64 is set to “0” to indicate this is an uncoded packet |
Wr_en_router_packingfifo |
1 |
output |
Write enable |
Rdy_router_packingfifo |
1 |
input |
1=module “packing FIFO” is ready to receive from payload router, 0=otherwise |
Empty_packingfifo |
1 |
input |
1=FIFO packing is empty,0=otherwise |
Data_converter_packingfifo |
73 |
output |
Output data bus to “packing FIFO”. Bit 64 is set to “1” to indicate this is a coded packet |
Wr_en_converter_packingfifo |
1 |
Output |
Write enable |
Rdy_converter_packingfifo |
1 |
output |
1=module “packing FIFO” is ready to receive from m72to64 converter, 0=otherwise |
Empty_converterfifo |
1 |
output |
1=FIFO converter is empty,0=otherwise |
Rand_num_1 |
8 |
output |
Output random number 1 to “packing center” |
Rand_num_2 |
8 |
output |
Output random number 2 to “packing center” |
clk |
1 |
input |
System clock running at 125MHz |
Rst_n |
1 |
input |
System asynchronous reset signal |
④ 功能描述及數(shù)據(jù)流
本模塊為主運(yùn)算模塊。子模塊paylaod router構(gòu)建與上游模塊control的接口,從control的子模塊FIFO ctrl payload中讀取數(shù)據(jù)。若兩FIFO都非空,則說明control模塊同時(shí)處理了兩條通道,也即需要進(jìn)行編碼操作。Paylpad router同時(shí)讀取兩個(gè)FIFO中的數(shù)據(jù),送往由m64×8 multiplier、m72×72 adder以及m72to64 converter組成的“編碼流水線”進(jìn)行編碼運(yùn)算,并向下游packing模塊發(fā)送編碼過的數(shù)據(jù)包。
子模塊prng tap16是8位偽隨機(jī)數(shù)產(chǎn)生器。使能信號rand_num_en有效時(shí),產(chǎn)生一個(gè)8位偽隨機(jī)數(shù)。子模塊m64×8 multiplier是64乘8位乘法器,該模塊將負(fù)載與隨即系數(shù)相乘,得到72位結(jié)果。m72×72 adder是72位全加器,將兩個(gè)乘法器得到的結(jié)果相加得到編碼輸出。m72to64 converter是位寬轉(zhuǎn)換器,由于coding模塊輸出的數(shù)據(jù)總線仍需保持64位,所以需要該轉(zhuǎn)換器將72位編碼輸出轉(zhuǎn)換為64為編碼數(shù)據(jù)。由于是同步電路,采用同一時(shí)鐘,該位寬轉(zhuǎn)換將產(chǎn)生一定的數(shù)據(jù)囤積,需要較大緩存。
⑤ 關(guān)鍵時(shí)序與狀態(tài)機(jī)
- Payload router狀態(tài)機(jī)
圖3.2-7 Payload router狀態(tài)機(jī)[!--empirenews.page--]
4、Packing
① 子模塊列表
Sub module name |
quantity |
Description |
Packing FIFO |
1 |
Receive and store processed packets before being packed in “packing center” |
Packing center |
1 |
Packing payload with all sorts of heads |
② 內(nèi)部結(jié)構(gòu)圖
圖3.2-8 Packing內(nèi)部結(jié)構(gòu)圖
③ 本模塊輸入輸出信號列表及說明
Signal name |
Bit width |
I/O |
Description |
Data_router_packingfifo |
73 |
input |
Input data bus from “payload router”. Bit 64 is set to “0” to indicate this is an uncoded packet |
Wr_en_router_packingfifo |
1 |
Input |
Write enable |
Rdy_router_packingfifo |
1 |
Output |
1=module “packing FIFO” is ready to receive from payload router, 0=otherwise |
Router_status |
3 |
input |
Input FSM state signal to coordinate with the control of “packing FIFO” |
Empty_packingfifo |
1 |
output |
1=FIFO packing is empty,0=otherwise |
Data_converter_packingfifo |
73 |
input |
Input data bus from “m72to64 converter”. Bit 64 is set to “1” to indicate this is a coded packet |
Wr_en_converter_packingfifo |
1 |
Input |
Write enable |
Rdy_converter_packingfifo |
1 |
Output |
1=module “packing FIFO” is ready to receive from m72to64 converter, 0=otherwise |
Empty_converterfifo |
1 |
Input |
1=FIFO converter is empty,0=otherwise |
Data_center_legacyfifo_1 |
64 |
Input |
Input data bus from “FIFO ctrl legacy 1” |
Rd_en_center_legacyfifo_1 |
1 |
output |
Read enable |
Data_center_packinginfo_1 |
14 |
Input |
Input data bus from “FIFO ctrl packinginfo 1” |
Rd_en_center_packinginfo_1 |
1 |
output |
Read enable |
Data_center_legacyfifo_2 |
64 |
Input |
Input data bus from “FIFO ctrl legacy 2” |
Rd_en_center_legacyfifo_2 |
1 |
output |
Read enable |
Data_center_packinginfo_2 |
14 |
Input |
Input data bus from “FIFO ctrl packinginfo 2” |
Rd_en_center_packinginfo_2 |
1 |
output |
Read enable |
Rand_num_center_1 |
8 |
input |
Input random number from “m64×64 multiplier 1” |
Rand_num_center_2 |
8 |
input |
Input random number from “m64×64 multiplier 2” |
Out_data_out_0 |
64 |
output |
Output data bus to “output arbiter” |
Out_ctrl_out_0 |
8 |
Output |
Output ctrl bus to “output arbiter” |
Data_val_out_0 |
1 |
Output |
1=data from packing center to output arbiter is valid, 0=otherwise |
Rdy_out_0 |
1 |
Input |
1=output arbiter is ready to receive from packing center, 0=otherwise |
clk |
1 |
Input |
System clock running at 125 MHz |
Rst_n |
1 |
input |
System asynchronous reset signal |
?、?功能描述及數(shù)據(jù)流
本模塊為封裝模塊。子模塊packing FIFO構(gòu)建與coding模塊的數(shù)據(jù)接口,將接收并緩存編碼數(shù)據(jù)包以及未編碼數(shù)據(jù)包(使用額外第64位數(shù)據(jù)標(biāo)志該包是否編碼,該位為“1”說明編碼,該位為“0”說明未編碼)。
子模塊packing center是主封裝模塊。它根據(jù)packing FIFO中讀出的數(shù)據(jù)判斷需要哪些包頭信息,然后向control模塊中相應(yīng)FIFO讀取需要的包頭信息,并依次封裝成NCP數(shù)據(jù)包,發(fā)送到output arbiter。
⑤ 關(guān)鍵時(shí)序及狀態(tài)機(jī)
Packing center狀態(tài)機(jī)
第一層狀態(tài)機(jī):packing_center_status
圖3 .2-9 packing_center_status狀態(tài)機(jī)
第二層狀態(tài)機(jī):
coded_process
圖3 .2-10coded_process狀態(tài)機(jī)
uncoded_process
圖3.2-11 uncoded_process 狀態(tài)機(jī)
5、Output arbiter
① 本模塊輸入輸出信號列表及說明
Signal name |
Bit width |
Input or output |
Description |
Out_data_out_0 |
64 |
input |
input data bus from “packing center” |
Out_ctrl_out_0 |
8 |
Input |
input ctrl bus from “packing center” |
Data_val_out_0 |
1 |
Input |
1=data from packing center to output arbiter is valid, 0=otherwise |
Rdy_out_0 |
1 |
output |
1=output arbiter is ready to receive from packing center, 0=otherwise |
Out_data_out_1 |
64 |
input |
input data bus from “input arbiter 1” |
Out_ctrl_out_1 |
8 |
Input |
input ctrl bus from “input arbiter 1” |
Data_val_out_1 |
1 |
Input |
1=data from input arbiter 1 to output arbiter is valid, 0=otherwise |
Rdy_out_1 |
1 |
output |
1=output arbiter is ready to receive from input arbiter 1, 0=otherwise |
Out_data_out_2 |
64 |
input |
input data bus from “input arbiter 2” |
Out_ctrl_out_2 |
8 |
Input |
input ctrl bus from “input arbiter 2” |
Data_val_out_2 |
1 |
Input |
1=data from input arbiter 2 to output arbiter is valid, 0=otherwise |
Rdy_out_2 |
1 |
output |
1=output arbiter is ready to receive from input arbiter 2, 0=otherwise |
Out_data_mac |
64 |
output |
output data bus to “MAC Layer” |
Out_ctrl_mac |
8 |
Output |
output ctrl bus to “MAC Layer” |
Data_val_mac |
1 |
Output |
1=data from output arbiter to MAC layer is valid, 0=otherwise |
Rdy_mac |
1 |
Input |
1=MAC layer is ready to receive from output arbiter, 0=otherwise |
clk |
1 |
Input |
System clock running at 125MHz |
Rst_n |
1 |
input |
System asynchronous reset signal |
② 功能描述及數(shù)據(jù)流
本模塊為輸出仲裁模塊。為協(xié)調(diào)多路輸出通道,避免沖突而設(shè)計(jì)。入端構(gòu)建與input arbiter通信的兩路端口和與packing通信的一路端口,出端構(gòu)建與MAC層通信的輸出端口。將選通并維護(hù)唯一一條輸入通道直至該數(shù)據(jù)包全部發(fā)送完畢。采用輪詢方式檢查三路輸入通道以避免沖突。
?、?關(guān)鍵時(shí)序及狀態(tài)機(jī)
圖3.2-12 Output arbiter狀態(tài)機(jī)
3.3 轉(zhuǎn)發(fā)路由器詳細(xì)設(shè)計(jì)方案
3.3.1轉(zhuǎn)發(fā)路由器系統(tǒng)整體模塊圖
圖3.3-1總體模塊圖
系統(tǒng)模塊功能說明:該模塊有兩個(gè)子模塊input_arbiter模塊和forward模塊構(gòu)成,其中前者為標(biāo)準(zhǔn)模塊;后者為自定義模塊,接受來自MAC層的數(shù)據(jù)包,經(jīng)過相關(guān)處理輸出數(shù)據(jù)包,實(shí)現(xiàn)將未編碼的IP數(shù)據(jù)包封裝成NCP數(shù)據(jù)包并進(jìn)行轉(zhuǎn)發(fā)以及將其它非IP數(shù)據(jù)包或NCP數(shù)據(jù)包進(jìn)行直接轉(zhuǎn)發(fā)的功能。
3.3.2系統(tǒng)中各單元模塊的功能與時(shí)序
Input_arbiter模塊
?、?Input_arbiter模塊的內(nèi)部結(jié)構(gòu)圖如圖3.3-2
圖3.3-2 input_arbiter模塊
② 本模塊的輸入輸出信號列表及說明(如下例)
信號名稱 |
位寬 bits |
I/O |
描述 |
in_data_n(n:0、1、2、3) |
64 |
input |
從MAC層輸入的data數(shù)據(jù) |
in_ctrl_n(n:0、1、2、3) |
8 |
input |
從MAC層輸入的ctrlbus數(shù)據(jù) |
in_wr_n(n:0、1、2、3) |
1 |
input |
從MAC層輸入的數(shù)據(jù)寫使能信號(1為有效) |
in_rdy_n(n:0、1、2、3) |
1 |
output |
輸出至MAC層的準(zhǔn)備信號(1為準(zhǔn)備完畢,可以寫入) |
out_data |
64 |
output |
輸出至forward模塊的data數(shù)據(jù) |
out_ctrl |
8 |
output |
輸出至froward模塊的ctrl數(shù)據(jù) |
out_wr |
1 |
output |
輸出至forward模塊的寫使能信號(1為寫使能有效) |
out_rdy |
1 |
input |
從forward模塊輸入的準(zhǔn)備信號(1為準(zhǔn)備好,可以寫入)
|
本模塊的功能描述以及內(nèi)部數(shù)據(jù)處理的過程
功能描述:從MAC層的接口傳來的數(shù)據(jù)信號寫入到receivefifo中,每個(gè)接口接一個(gè)fifo,通過本模塊的仲裁,循環(huán)查詢每個(gè)fifo,如果每個(gè)fifo不為空則輸出該fifo的數(shù)據(jù)到forward 模塊。本次實(shí)驗(yàn)只用到接口1,其他接口實(shí)際上是沒有數(shù)據(jù)輸入,然而為了以后的可拓展設(shè)計(jì),采取循環(huán)查詢每個(gè)fifo,這樣可以從每個(gè)接口進(jìn)行數(shù)據(jù)讀入數(shù)據(jù),更合理。
?、?關(guān)鍵時(shí)序和狀態(tài)機(jī)轉(zhuǎn)化圖
圖3.3-3 input_arbiter時(shí)序圖
2、forward模塊
① forward模塊的內(nèi)部結(jié)構(gòu)圖如圖3.3-4
圖3.3-4
②本模塊的輸入輸出信號列表及說明(如下例)
信號名稱 |
位寬 bits |
I/O |
描述 |
out_data |
64 |
input |
從input_arbiter模塊輸出的data數(shù)據(jù) |
out_ctrl |
8 |
input |
從input_arbiter模塊輸出的ctrl數(shù)據(jù) |
out_wr |
1 |
input |
從input_arbiter模塊輸出的寫使能信號(1為寫使能有效) |
out_rdy |
1 |
input |
輸出至input_arbiter模塊的準(zhǔn)備使能信號(1為準(zhǔn)備使能有效) |
out_data_n(n:0、1、2、3) |
64 |
output |
輸出至MAC層的data數(shù)據(jù) |
out_ctrl_n(n:0、1、2、3) |
8 |
output |
輸出至MAC層的ctrlbus數(shù)據(jù) |
out_wr_n(n:0、1、2、3) |
1 |
output |
輸出至MAC層的數(shù)據(jù)寫使能信號(1為有效) |
out_rdy_n(n:0、1、2、3) |
1 |
intput |
從MAC層輸入的準(zhǔn)備信號(1為準(zhǔn)備完畢,可以寫入) |
?、?本模塊的功能描述以及內(nèi)部數(shù)據(jù)處理的過程
(1)Forward模塊下子模塊Ip_Packet_Arbiter 定義6個(gè)寄存器變量分別為:Reg_0—Reg_5 寬度為64bit, 6個(gè)寄存器變量:Ctrl_0—Ctrl_5寬度為8bit.分別存儲(chǔ)數(shù)據(jù)包的前48個(gè)字節(jié)數(shù)據(jù)和CtrlBus信息。以便對包頭進(jìn)行解析,并進(jìn)行判斷所屬的類型。
(2)判斷屬于哪一類型的數(shù)據(jù)包,如果是非IP數(shù)據(jù)包則從Ip_packet_Arbiter模塊發(fā)送一個(gè)信號Ip_Packet_Check的信號到Transmit模塊,通過data信號線和ctrl信號線將數(shù)據(jù)傳送到Transmit模塊并轉(zhuǎn)發(fā)到各個(gè)接口;
(3)如果屬于iP數(shù)據(jù)包則進(jìn)一步判斷是屬于編碼后的數(shù)據(jù)包還是未編碼的數(shù)據(jù)包,如果是編碼后的數(shù)據(jù)包則和①做同樣處理,如果是未編碼的數(shù)據(jù)包,則進(jìn)行相應(yīng)的處理(更改modulheader、MAC的目標(biāo)地址、Ip包頭、添加NCP包頭操作),然后將組合好的數(shù)據(jù)包頭和Ctrlbus 和Ip_Packet_Check信號一起送到Transmit模塊。在Transmit模塊通過收到的Ip_Packet_Check信號進(jìn)行判斷是否需要對存放數(shù)據(jù)進(jìn)行重新的封裝并進(jìn)行相應(yīng)處理,然后進(jìn)行轉(zhuǎn)發(fā)操作。整個(gè)過程的流程圖如圖3.3-5
圖3.3-5
?、荜P(guān)鍵時(shí)序和狀態(tài)機(jī)轉(zhuǎn)化圖
圖3.3-6
?、?froward模塊下子模塊Transmit的狀態(tài)機(jī)以及描述如圖3.3-7
圖3.3-7
對整個(gè)狀態(tài)機(jī)工作條件進(jìn)行詳細(xì)的描述如下:
當(dāng)滿足滿足計(jì)數(shù)器counter=0的條件時(shí),進(jìn)入IDLE狀態(tài);counter計(jì)數(shù)器不改變并且不是包頭的起始信號時(shí)則保持在該狀態(tài);如果counter=1,發(fā)現(xiàn)包頭起始信號則保存該字段的值,并設(shè)置counter=2;
當(dāng)滿足計(jì)數(shù)器counter=2時(shí),并且是包的中間值信號時(shí)則跳轉(zhuǎn)到READ狀態(tài);根據(jù)counter計(jì)數(shù)器的值有條件的保存在該狀態(tài);counter自加;
當(dāng)滿足計(jì)數(shù)器counter=3時(shí),判斷MAC字段中上層協(xié)議的類型標(biāo)志,如果為IP數(shù)據(jù)包繼續(xù)保持在READ狀態(tài),counter+1;當(dāng)counter=4時(shí) 進(jìn)行判斷數(shù)據(jù)包中協(xié)議字段的如果為未編碼的IP數(shù)據(jù)包則保存在該狀態(tài),counter+1;
當(dāng)滿足counter=3時(shí)判斷上層協(xié)議類型標(biāo)志為非IP數(shù)據(jù)包,則直接跳轉(zhuǎn)到SEND狀態(tài);如果為已經(jīng)編碼的IP數(shù)據(jù)包既NCP數(shù)據(jù)包,則調(diào)整到SEND狀態(tài);
當(dāng)counter=7的時(shí)候,跳轉(zhuǎn)到ADDNCPHEADER狀態(tài);數(shù)據(jù)處理完畢后state=SEND;
當(dāng)暫存的數(shù)據(jù)包沒有發(fā)送完之前則保持在該狀態(tài);
當(dāng)state=SEND時(shí),跳轉(zhuǎn)到SEND狀態(tài);
當(dāng)暫存的數(shù)據(jù)包的字段發(fā)送完畢后,跳轉(zhuǎn)到CONSENCTIVEPASS(持續(xù)發(fā)包)狀態(tài)時(shí);
判斷包尾的結(jié)束標(biāo)志,如果不是包尾的結(jié)束標(biāo)志則保持在該狀態(tài);
判斷包尾的結(jié)束標(biāo)志,如果是包尾的結(jié)束標(biāo)志,則發(fā)最后一個(gè)字段,并跳轉(zhuǎn)到IDLE(起始狀態(tài));[!--empirenews.page--]
3.4 解碼路由器詳細(xì)設(shè)計(jì)方案
3.4.1 解碼路由器系統(tǒng)整體模塊圖
如下圖3.4-1所示,為解碼路由器的整體模塊圖
3.4-1 解碼路由器系統(tǒng)整體模塊圖
3.4.2系統(tǒng)中各單元模塊的功能與時(shí)序
1、Input_arbiter:采用輪詢策略,當(dāng)fifo非空時(shí)從fifo接收數(shù)據(jù),根據(jù)mac header判斷數(shù)據(jù)是否為IP數(shù)據(jù)包,若是,則將數(shù)據(jù)發(fā)送到DRAM讀寫控制模塊,同時(shí)將信源號、代編號發(fā)送到CAM讀寫控制模塊。
可用一個(gè)兩狀態(tài)的狀態(tài)機(jī)實(shí)現(xiàn):即輪詢判斷輸入和數(shù)據(jù)輸出:在FIFO非空時(shí)讀數(shù)據(jù),并根據(jù)數(shù)據(jù)包的類型發(fā)送到DRAM讀寫控制器或output fifo中,若是IP數(shù)據(jù)包,同時(shí)將信源號、代編號發(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 |
|
數(shù)據(jù)的接收端口號 |
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結(jié)構(gòu)圖
本模塊的結(jié)構(gòu)如圖3.4-2所示,由兩個(gè)輸入fifo和一個(gè)輸出仲裁器組成,兩個(gè)fifo緩存來自SRAM和input_arbiter的數(shù)據(jù)包,Output_arbiter的作用是將解碼后的數(shù)據(jù)發(fā)送到MAC層。由于對于非IP數(shù)據(jù)包我們并沒有對其進(jìn)行編碼,所以在解碼路由器中由input_arbiter判斷后直接輸出output_arbiter;對于編碼后的IP數(shù)據(jù)包,在解碼后先暫存到SRAM中,再發(fā)送出去。本模塊就是輪流判斷并接收來自SRAM和input_arbiter的數(shù)據(jù),并將數(shù)據(jù)包發(fā)送到MAC層。
輸入輸出信號列表:
信號名稱 |
位寬bits |
I/O |
描述 |
out_data_3 |
64 |
O |
輸出至MAC層的數(shù)據(jù)總線 |
out_ctrl_3 |
8 |
O |
輸出至MAC層的控制總線 |
out_wr_3 |
1 |
O |
輸出有效 |
out_rdy_3 |
1 |
I |
MAC層空閑標(biāo)志 |
dcod_data_0 |
64 |
I |
已經(jīng)解碼的IP數(shù)據(jù)包的數(shù)據(jù)總線 |
dcod_ctrl_0 |
8 |
I |
已經(jīng)解碼的IP數(shù)據(jù)包的控制總線 |
wr_vld_0 |
1 |
I |
寫有效 |
wr_rdy_0 |
1 |
O |
接收數(shù)據(jù)空閑標(biāo)志 |
non_ip_data |
64 |
I |
非IP數(shù)據(jù)包數(shù)據(jù)總線 |
non_ip_ctrl |
8 |
I |
非IP數(shù)據(jù)包控制總線 |
wr_vld_1 |
1 |
I |
寫有效 |
wr_rdy_1 |
1 |
O |
接收數(shù)據(jù)空閑標(biāo)志 |
3、decoded_reg_grp
本模塊分別與decode_control_panel,decoder和SRAM_contrl相連接,主要作用是記錄信源的某代數(shù)據(jù)包是否已經(jīng)解碼,并將相應(yīng)的解碼信息輸出給其他模塊,模塊結(jié)構(gòu)如圖3.4-3:
圖3.4-3:decoded_reg_grp模塊圖
端口列表:
信號名稱 |
位寬bits |
I/O |
描述 |
rd_dcod_reg_req_0 |
1 |
I |
讀取解碼標(biāo)志位請求 |
rd_dcod_src_gen_0 |
12 |
I |
要讀取的數(shù)據(jù)包的信源號和代編號 |
req_ack_vld_0 |
1 |
O |
輸出有效 |
alredy_decod_0 |
1 |
O |
解碼標(biāo)志(“1”代表已經(jīng)解碼,“0”代表未解碼) |
rd_dcod_reg_req_1 |
1 |
I |
讀取解碼標(biāo)志位請求 |
rd_dcod_src_gen_1 |
12 |
I |
要讀取的數(shù)據(jù)包的信源號和代編號 |
req_ack_vld_1 |
1 |
O |
輸出有效 |
alredy_decod_1 |
1 |
O |
解碼標(biāo)志(為1時(shí)代表已經(jīng)解碼,為0時(shí)未解碼) |
set_req |
1 |
I |
置位請求 |
set_src_gen |
12 |
I |
需要置位的數(shù)據(jù)包(表示已經(jīng)解碼完畢) |
set_info_vld |
1 |
I |
置位信息有效 |
set_ack |
1 |
O |
置位請求響應(yīng) |
reset_req |
1 |
I |
復(fù)位請求 |
reset_src_gen |
12 |
I |
需要復(fù)位的數(shù)據(jù)包(表示解碼后已發(fā)送完畢) |
reset_info_vld |
1 |
I |
復(fù)位信息有效 |
reset_ack |
1 |
O |
復(fù)位請求響應(yīng) |
?、?讀解碼標(biāo)志
當(dāng)decoder模塊或decode_control_panel讀取解碼標(biāo)志時(shí),將查詢結(jié)果輸出,alredy_decod_0和alredy_decod_1為“1”時(shí)表示本次查詢的數(shù)據(jù)包已經(jīng)解碼,為“0”時(shí)表示未被解碼,以與decoder接口為例,讀取解碼標(biāo)志的時(shí)序如圖3.4-4:
圖3.4-4:讀解碼標(biāo)志位時(shí)序圖
?、?寫解碼標(biāo)志位
當(dāng)decoder把一個(gè)數(shù)據(jù)包解碼成功后,就把相應(yīng)的解碼標(biāo)志位置1,當(dāng)SRAM_control將一個(gè)數(shù)據(jù)包發(fā)送出去后,再將相應(yīng)的解碼標(biāo)志位置0,以置位為例,解碼標(biāo)志位的寫時(shí)序如圖3.4-5:
圖3.4-5:置位解碼標(biāo)志寄存器
4、DRAM控制器:接收數(shù)據(jù),并順序存儲(chǔ)到DRAM中去。
注意:我們將DRAM分為三塊,分別對應(yīng)于數(shù)據(jù)接收的三個(gè)信道,即第0個(gè)信道的數(shù)據(jù)存儲(chǔ)到DRAM的第0塊,第1個(gè)信道的數(shù)據(jù)存儲(chǔ)到DRAM的第1塊……信道號由port_num給出。由于DRAM是按照block讀寫的,因此每個(gè)block大小為2034字節(jié),位寬為144位。
圖3.4-6:DRAM控制器模塊圖
① DRAM控制器與DRAM的接口與讀寫時(shí)序:
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時(shí)序如圖3.4-7:
圖3.4-7 寫DRAM時(shí)序圖
讀端口:
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時(shí)序如圖3.4-8:
圖3.4-8 寫DRAM時(shí)序圖
② 其他模塊對DRAM控制器的讀/寫過程:
當(dāng)DRAM讀寫控制器將一個(gè)數(shù)據(jù)包讀/寫完之后, 就將rd_idle/wr_rdy_arb置為1,當(dāng)外部模塊需要對DRAM進(jìn)行讀寫時(shí),首先要判斷這兩個(gè)信號是否有效,在有效的情況下進(jìn)行對數(shù)據(jù)的操作。.端口列表如下:
信號名稱 |
位寬bits |
I/O |
描述 |
wr_vld_arb |
1 |
I |
Input_arbiter輸入有效 |
out_data_0 |
64 |
I |
輸入的數(shù)據(jù)包的data_bus |
out_ctrl_0 |
8 |
I |
輸入數(shù)據(jù)包的ctrl_bus |
port_num_dram |
2 |
I |
輸入信號的端口號,指明數(shù)據(jù)存放在DRAM的區(qū)域 |
wr_rdy_arb |
1 |
O |
寫空閑信號 |
port_num_rd |
2 |
I |
讀取數(shù)據(jù)包的區(qū)域 |
addr_vld |
1 |
I |
讀地址有效 |
block_num_rd |
8 |
I |
數(shù)據(jù)包存放的block的起始地址 |
rd_idle |
1 |
O |
讀空閑信號 |
in_rdy |
1 |
I |
數(shù)據(jù)輸出輸出允許信號 |
out_data |
64 |
O |
讀出的數(shù)據(jù)包的data_bus |
out_ctrl |
8 |
O |
輸出數(shù)據(jù)包的ctrl_bus |
data_vld |
1 |
O |
輸出數(shù)據(jù)有效 |
(1)當(dāng)decode_control_panel對DRAM控制器進(jìn)行讀操作時(shí),將信道號和block地址發(fā)送至DRAM控制器,接著DRAM控制器從DRAM中讀取數(shù)據(jù),當(dāng)decoder空閑時(shí)將數(shù)據(jù)發(fā)送出去,時(shí)序圖如3.4-9所示:
圖3.4-9 對DRAM控制器的讀操作
(2)當(dāng)DRAM控制器進(jìn)行寫操作時(shí),將按照input_arbiter發(fā)送過來的端口號,按照地址大小順序?qū)慏RAM,時(shí)序圖如3.4-10:
圖3.4-10 對DRAM控制器的寫操作
5、decode_control_panel
① 本模塊的內(nèi)部結(jié)構(gòu)圖如3.4-11所示,它由以下五個(gè)模塊組成:cam_info_save, decode_control_sm和3個(gè)CAM組成。
圖3.4-11:decode_control_panel內(nèi)部結(jié)構(gòu)圖
本模塊的輸入輸出端口定義表如下:
端口名稱 |
位寬 bits |
I/O |
描述 |
port_num_cam |
2 |
In |
數(shù)據(jù)寫入的CAM號,即信道號 |
Src_gen_seq |
24 |
In |
輸入數(shù)據(jù)包的信源號、代編號 |
Cam_vld |
1 |
In |
寫有效 |
Cam_rdy |
1 |
Out |
寫Cam準(zhǔn)備好 |
rd_idle |
1 |
In |
DRAM準(zhǔn)備好 |
block_num_rd |
8 |
Out |
讀DRAM的地址 |
addr_vld |
1 |
Out |
讀地址有效 |
port_num_rd |
2 |
out |
要讀取的DRAM的編號 |
Pkt_vld |
1 |
Out |
要解碼的數(shù)據(jù)包輸出有效標(biāo)志 |
Pkt_decoding |
12 |
out |
正在解碼的數(shù)據(jù)包的信源號、代編號 |
Decod_com |
1 |
In |
數(shù)據(jù)包解碼完成標(biāo)志 |
has_other_factor |
1 |
Out |
有另外一個(gè)解碼因子 |
Pkt_not_find |
1 |
Out |
所需要解碼數(shù)據(jù)包未找到 |
pkt_need_src_gen |
12 |
In |
解碼需要的數(shù)據(jù)包 |
need_pkt_vld |
1 |
In |
所需數(shù)據(jù)包有效 |
rd_dcod_reg_req_1 |
1 |
Out |
讀解碼標(biāo)志寄存器請求 |
req_ack_vld_1 |
1 |
In |
標(biāo)志位有效 |
Alredy_Decod_1 |
1 |
In |
解碼標(biāo)志位 |
rd_dcod_src_gen_1 |
12 |
out |
查詢數(shù)據(jù)包是否已經(jīng)解碼 |
② cam_info_save:
該模塊的主要功能是將輸入的數(shù)據(jù)包的信源號和代的編號按地址大小順序存入到三個(gè)cam中,每個(gè)cam分別對應(yīng)于三個(gè)數(shù)據(jù)輸入通道。每個(gè)CAM的大小是24bits×256,我們要求CAM的讀寫操作可以同時(shí)進(jìn)行,寫數(shù)據(jù)從DIN進(jìn)入,而讀(查詢)的數(shù)據(jù)從CMP_DIN進(jìn)入,寫操作時(shí)BUSY信號有效,表示不可以響應(yīng)其他寫請求,圖3.4-12是一個(gè)CAM的讀寫操作時(shí)序:
圖3.4-12:CAM讀寫過程[!--empirenews.page--]
③decode_control_sm
該模塊的功能是按照輪詢策略,控制decoder解碼儲(chǔ)存在DRAM中的數(shù)據(jù)包。通過查詢CAM中的數(shù)據(jù)包的存儲(chǔ)地址,將查詢到的地址輸出給DRAM讀寫控制模塊,從而找到解碼所需要的數(shù)據(jù),同時(shí)將要查詢的數(shù)據(jù)包的信源號和代的編號發(fā)送給解碼模塊。若不能查找到解碼因子,則將信號Pkt_not_find置為有效電平,通知decoder無法解碼,同時(shí)將狀態(tài)轉(zhuǎn)到解碼下一個(gè)數(shù)據(jù)包的狀態(tài)上。在開始查找CAM時(shí),要等待儲(chǔ)存一定數(shù)量的數(shù)據(jù)包,在我們的系統(tǒng)里面,暫定為32。
狀態(tài)機(jī)處理控制流程如圖3.4-13:
圖3.4-13:decode_control_sm狀態(tài)機(jī)及數(shù)據(jù)處理流程
6、decoder
decoder是整個(gè)解碼路由器的核心之一,它的主要功能是接收來自DRAM的編碼后的IP數(shù)據(jù)包,在decode_control_panel模塊的控制下對數(shù)據(jù)包進(jìn)行解碼,它包括多個(gè)小模塊,其整體圖和內(nèi)部結(jié)構(gòu)圖如3.4-14和3.4-15所示:
圖3.4-14 decoder整體結(jié)構(gòu)圖
圖3.4-15:decoder內(nèi)部結(jié)構(gòu)圖
?、?header_parser
分析接收到的數(shù)據(jù)包,如果已經(jīng)被編碼,根據(jù)包頭提取信源號、代號、長度和系數(shù)給運(yùn)算控制模塊,如果沒有被編碼,則查詢解碼標(biāo)志寄存器,如果已經(jīng)解碼并儲(chǔ)存在二級緩存中,則該數(shù)據(jù)包只是一個(gè)解碼因子,把數(shù)據(jù)發(fā)送到fwd_sel,若沒有解碼,則同時(shí)發(fā)送到capsulation和forward sel。如果數(shù)據(jù)是編碼后的數(shù)據(jù)包,則將數(shù)據(jù)包去掉包頭后將數(shù)據(jù)發(fā)送給forward sel模塊。當(dāng)發(fā)送到最后的64位數(shù)據(jù)時(shí),eop信號有效,指明是數(shù)據(jù)包的最后有效字節(jié)。
下圖所示為輸入輸出接口圖3.4-16:
圖3.4-16:header_parser模塊圖
其輸入輸出端口列表如下:
信號名稱 |
位寬bits |
I/O |
描述 |
in_rdy |
1 |
O |
數(shù)據(jù)輸出輸入允許信號 |
out_data |
64 |
I |
輸入的數(shù)據(jù)包的data_bus |
out_ctrl |
8 |
I |
輸入數(shù)據(jù)包的ctrl_bus |
data_vld |
1 |
I |
輸入數(shù)據(jù)有效 |
rd_dcod_reg_req_0 |
1 |
O |
讀取解碼標(biāo)志位請求 |
rd_dcod_src_gen_0 |
12 |
O |
要讀取的數(shù)據(jù)包的信源號和代編號 |
req_ack_vld_0 |
1 |
I |
輸入有效 |
alredy_decod_0 |
1 |
I |
解碼標(biāo)志(“1”代表已經(jīng)解碼,“0”代表未解碼) |
Uncod_data |
64 |
O |
未編碼數(shù)據(jù)包的數(shù)據(jù)總線 |
Uncod_ctrl |
8 |
O |
未編碼數(shù)據(jù)包的控制總線 |
Wr_vld |
1 |
O |
寫capsulation數(shù)據(jù)有效 |
Out_rdy |
1 |
I |
輸出capsulation允許信號 |
fwd_rdy |
1 |
I |
輸出fwd_sel允許信號 |
out_vld |
1 |
O |
輸出fwd_sel有效 |
pay_load |
64 |
O |
輸出fwd_sel數(shù)據(jù)(不含包頭) |
eop |
4 |
O |
最后指示一個(gè)有效字節(jié)的指示 |
uncod |
1 |
O |
指明輸出的數(shù)據(jù)包是否編碼 |
src_gen_num |
12 |
O |
Decoder接收到的數(shù)據(jù)包的信源號和代的編號 |
len_0 |
16 |
O |
被編碼的第一個(gè)數(shù)據(jù)包的有效載荷的長度 |
len_1 |
16 |
O |
被編碼的第二個(gè)數(shù)據(jù)包的有效載荷的長度 |
coef_0 |
8 |
O |
被編碼的第一個(gè)數(shù)據(jù)包的編碼系數(shù) |
coef_1 |
8 |
O |
被編碼的第二個(gè)數(shù)據(jù)包的編碼系數(shù) |
hp_info_vld |
1 |
O |
輸出信息有效 |
encod_pkt_trans_fi |
1 |
O |
編碼數(shù)據(jù)包傳輸完畢標(biāo)志 |
oc_info_vld |
1 |
I |
解碼控制輸入信息有效 |
uncod_pkt_need |
1 |
I |
未編碼的數(shù)據(jù)包是/否解碼因子(1=是,0=否) |
圖3.4-17所示為狀態(tài)機(jī)處理流程:
圖3.4-17:header_parser狀態(tài)機(jī)處理流程
② forwd_sel
該模塊功能主要是轉(zhuǎn)發(fā)數(shù)據(jù)包:接收來自header_parser的數(shù)據(jù)包,若uncod=0,則表明數(shù)據(jù)包是編碼后數(shù)據(jù)包,將已經(jīng)編碼后的數(shù)據(jù)包的載荷轉(zhuǎn)換為72bits后,將數(shù)據(jù)發(fā)送到RAM讀寫控制器,否則發(fā)送到decod_operation。當(dāng)有反饋輸入請求時(shí),若輸出到decod_operation 的數(shù)據(jù)線空閑時(shí),將反饋數(shù)據(jù)發(fā)送到decod_operation。
本模塊的端口列表如下:
信號名稱 |
位寬bits |
I/O |
信號描述 |
fwd_rdy |
1 |
O |
輸入fwd_sel允許信號 |
out_vld |
1 |
I |
輸入fwd_sel有效 |
pay_load |
64 |
I |
輸入fwd_sel數(shù)據(jù)總線(不含包頭) |
eop |
4 |
I |
最后指示一個(gè)有效字節(jié)的指示 |
uncod |
1 |
I |
指明輸出的數(shù)據(jù)包是否編碼 |
wr_req |
1 |
O |
寫RAM請求 |
encod_data |
72 |
O |
寫RAM的數(shù)據(jù)總線 |
ram_data_vld |
1 |
O |
數(shù)據(jù)有效 |
encod_data_eop |
4 |
O |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
wr_ack |
1 |
I |
寫RAM響應(yīng) |
uncod_data_vld |
1 |
O |
輸出至dcod_operation的數(shù)據(jù)有效 |
uncod_data_factor |
64 |
O |
輸出至dcod_operation的數(shù)據(jù)總線 |
uncod_data_eop |
4 |
O |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
dcod_rdy |
1 |
I |
輸出至dcod_operation允許信號 |
fd_back_ack |
1 |
O |
接受反饋響應(yīng) |
fd_back_vld |
1 |
I |
反饋數(shù)據(jù)有效標(biāo)志 |
fd_back_req |
1 |
I |
反饋請求 |
fd_back_data |
64 |
I |
反饋數(shù)據(jù)總線 |
fd_back_data_eop |
4 |
I |
反饋數(shù)據(jù)結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
③ RAM讀寫控制器
在寫數(shù)據(jù)時(shí),先從運(yùn)算控制模塊中得出要儲(chǔ)存的RAM號,接著RAM讀寫控制器將從收到forward sel 模塊收到的數(shù)據(jù)存到片內(nèi)RAM里面去。在讀數(shù)據(jù)時(shí),根據(jù)dcod_operation模塊提供的ram號,從相應(yīng)的ram中讀取數(shù)據(jù),由于使用的是雙端口ram,因此讀寫可以同時(shí)進(jìn)行。模塊信號列表如下:
信號名稱 |
位寬bits |
I/O |
信號描述 |
wr_req |
1 |
I |
寫RAM請求 |
encod_data |
72 |
I |
寫RAM的數(shù)據(jù)總線 |
ram_data_vld |
1 |
I |
數(shù)據(jù)有效 |
encod_data_eop |
4 |
I |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
wr_ack |
1 |
O |
寫RAM響應(yīng) |
wr_ram_num |
2 |
I |
要寫入的RAM號 |
info_vld |
1 |
I |
數(shù)據(jù)有效標(biāo)志 |
req_ram_num |
1 |
O |
讀RAM號請求 |
rd_ram_num |
2 |
I |
需要讀取數(shù)據(jù)的RAM號 |
rd_req |
1 |
I |
讀RAM請求 |
ram_data_eop |
4 |
O |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
ram_data |
72 |
O |
讀RAM的數(shù)據(jù)總線 |
ram_vld |
1 |
O |
讀RAM數(shù)據(jù)有效 |
RAM讀寫時(shí)序圖如圖3.4-18:
圖3.4-18:RAM讀寫時(shí)序
每個(gè)RAM由雙端口block RAM組成,位寬為72位,深度為180,因此讀寫的地址位寬均為8位。由于RAM的讀寫控制時(shí)序是固定的,所以在此不再贅述。
④ operation_control
運(yùn)算控制(operation_control)是decoder模塊的控制核心,它和decode_control_panel配合,完成對編碼數(shù)據(jù)包的解碼。
輸入輸出信號列表:
信號名稱 |
位寬bits |
I/O |
信號描述 |
Pkt_vld |
1 |
I |
要解碼的數(shù)據(jù)包輸出有效標(biāo)志 |
Pkt_decoding |
12 |
I |
正在解碼的數(shù)據(jù)包的信源號、代編號 |
Decod_com |
1 |
O |
數(shù)據(jù)包解碼完成標(biāo)志 |
has_other_factor |
1 |
I |
有另外一個(gè)解碼因子 |
Pkt_not_find |
1 |
I |
所需要解碼數(shù)據(jù)包未找到 |
pkt_need_src_gen |
12 |
O |
解碼需要的數(shù)據(jù)包 |
need_pkt_vld |
1 |
O |
所需數(shù)據(jù)包有效 |
src_gen_num |
12 |
I |
Decoder接收到的數(shù)據(jù)包的信源號和代的編號 |
len_0 |
16 |
I |
被編碼的第一個(gè)數(shù)據(jù)包的有效載荷的長度 |
len_1 |
16 |
I |
被編碼的第二個(gè)數(shù)據(jù)包的有效載荷的長度 |
coef_0 |
8 |
I |
被編碼的第一個(gè)數(shù)據(jù)包的編碼系數(shù) |
coef_1 |
8 |
I |
被編碼的第二個(gè)數(shù)據(jù)包的編碼系數(shù) |
hp_info_vld |
1 |
I |
輸入信息有效 |
encod_pkt_trans_fi |
1 |
I |
編碼數(shù)據(jù)包傳輸完畢標(biāo)志 |
oc_info_vld |
1 |
O |
解碼控制輸出信息有效 |
uncod_pkt_need |
1 |
O |
未編碼的數(shù)據(jù)包是/否解碼因子(1=是,0=否) |
wr_ram_num |
2 |
O |
要寫入的RAM號 |
info_vld |
1 |
O |
數(shù)據(jù)有效標(biāo)志 |
req_ram_num |
1 |
I |
讀RAM號請求 |
rd_info_req |
1 |
I |
讀取解碼信息請求 |
dcod_info_vld |
1 |
O |
解碼信息有效 |
ram_num |
2 |
O |
解碼數(shù)據(jù)包的所存儲(chǔ)的RAM號 |
coef_mut |
8 |
O |
乘法系數(shù) |
coef_div |
8 |
O |
除法系數(shù) |
cap_info_req |
1 |
I |
封裝信息請求 |
dcod_comp |
1 |
I |
解碼封裝完成 |
cap_info_vld |
1 |
O |
封裝信息有效 |
need_feed_back |
1 |
O |
需要反饋 |
pkt_len |
16 |
O |
數(shù)據(jù)包長度 |
src_num |
4 |
O |
數(shù)據(jù)包的信源號 |
gen_num |
8 |
O |
數(shù)據(jù)報(bào)的代編號 |
Operation_control模塊的主要功能是:接收header_parser發(fā)送過來的數(shù)據(jù),通過計(jì)算和比較后與decode control panel通信,告訴decode control panel解碼所需要的數(shù)據(jù)包和解碼完成標(biāo)志;給RAM讀寫給出RAM號(即存儲(chǔ)在哪個(gè)RAM中);給decode operation模塊提供解碼所需要的系數(shù)和RAM號;給capsulation模塊提供源IP和是否需要反饋數(shù)據(jù)的命令,其控制狀態(tài)如圖3.4-19下:
圖3.4-19:Operation_control狀態(tài)機(jī)處理流程
⑤ decode operation
decode operation是解碼運(yùn)算模塊,它將來自fwd_sel模塊的未編碼的數(shù)據(jù)和來自RAM的編碼數(shù)據(jù)完成減法和除法運(yùn)算,還原被編碼的數(shù)據(jù)。解碼后將數(shù)據(jù)總線的位寬恢復(fù)為64bits。解碼運(yùn)算模塊的端口列表如下:
信號名稱 |
位寬bits |
I/O |
信號描述 |
dcod_payload |
64 |
O |
解碼后的數(shù)據(jù)包的有效載荷 |
end_payload |
4 |
O |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
payload_vld |
1 |
O |
輸出數(shù)據(jù)有效 |
wr_rdy |
1 |
I |
輸出數(shù)據(jù)允許信號 |
uncod_data_vld |
1 |
I |
輸入至dcod_operation的數(shù)據(jù)有效 |
uncod_data_factor |
64 |
I |
輸入至dcod_operation的數(shù)據(jù)總線 |
uncod_data_eop |
4 |
I |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
dcod_rdy |
1 |
O |
輸入至dcod_operation允許信號 |
rd_ram_num |
2 |
O |
需要讀取數(shù)據(jù)的RAM號 |
rd_req |
1 |
O |
讀RAM請求 |
ram_data_eop |
4 |
I |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
ram_data |
72 |
I |
讀RAM的數(shù)據(jù)總線 |
ram_vld |
1 |
I |
讀RAM數(shù)據(jù)有效 |
rd_info_req |
1 |
O |
讀取解碼信息請求 |
dcod_info_vld |
1 |
I |
解碼信息有效 |
ram_num |
2 |
I |
解碼數(shù)據(jù)包的所存儲(chǔ)的RAM號 |
coef_mut |
8 |
I |
乘法系數(shù) |
coef_div |
8 |
I |
除法系數(shù) |
為了快速完成解碼運(yùn)算,我們在此采取并行除法的方法使之能快速解碼,解碼運(yùn)算的算法圖如圖3.4-20:
圖3.4-20 decoder_operation內(nèi)部的并行除法
⑥ capsulation
Capsulation是解碼運(yùn)算的最后一個(gè)模塊,其主要功能是封裝解碼后的數(shù)據(jù)包。其主要任務(wù)是:(1)接收來自decode operation和header_parser的數(shù)據(jù);(2)將來自header_parser的未編碼的數(shù)據(jù)包去掉NCP包頭;(3)計(jì)算新的包頭校驗(yàn)和,更新TTL;(4)置位解碼標(biāo)志寄存器;(5)將來自decode operation模塊的數(shù)據(jù),先向運(yùn)算控制模塊詢問是否要反饋,若需要,則將數(shù)據(jù)反饋至forward_sel模塊;(6)恢復(fù)IP數(shù)據(jù)包頭;(7)將IP包頭和有效載荷封裝好,并恢復(fù)ctrl_bus和module header,將其一起同步發(fā)送出去。
端口信號列表如下:
信號名稱 |
位寬bits |
I/O |
信號描述 |
decoder_in_rdy |
1 |
I |
輸出至SRAM允許信號 |
decoder_in_wr |
1 |
O |
輸出有效 |
decoder_in_data |
64 |
O |
輸出至SRAM數(shù)據(jù)總線 |
decoder_in_ctrl |
8 |
O |
輸出至SRAM控制總線 |
set_req |
1 |
O |
置位請求 |
set_src_gen |
12 |
O |
需要置位的數(shù)據(jù)包(表示已經(jīng)解碼完畢) |
set_info_vld |
1 |
O |
置位信息有效 |
set_ack |
1 |
I |
置位請求響應(yīng) |
cap_info_req |
1 |
O |
封裝信息請求 |
dcod_comp |
1 |
O |
解碼封裝完成 |
cap_info_vld |
1 |
I |
封裝信息有效 |
need_feed_back |
1 |
I |
需要反饋 |
pkt_len |
16 |
I |
數(shù)據(jù)包長度 |
src_num |
4 |
I |
數(shù)據(jù)包的信源號 |
gen_num |
8 |
I |
數(shù)據(jù)報(bào)的代編號 |
dcod_payload |
64 |
I |
解碼后的數(shù)據(jù)包的有效載荷 |
end_payload |
4 |
I |
數(shù)據(jù)包結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
payload_vld |
1 |
I |
輸入數(shù)據(jù)有效 |
wr_rdy |
1 |
O |
輸入數(shù)據(jù)允許信號 |
fd_back_ack |
1 |
I |
接受反饋響應(yīng) |
fd_back_vld |
1 |
O |
反饋數(shù)據(jù)有效標(biāo)志 |
fd_back_req |
1 |
O |
反饋請求 |
fd_back_data |
64 |
O |
反饋數(shù)據(jù)總線 |
fd_back_data_eop |
4 |
O |
反饋數(shù)據(jù)結(jié)束標(biāo)志,指明最后一個(gè)有效字節(jié) |
Uncod_data |
64 |
I |
未編碼數(shù)據(jù)包的數(shù)據(jù)總線 |
Uncod_ctrl |
8 |
I |
未編碼數(shù)據(jù)包的控制總線 |
Wr_vld |
1 |
I |
寫capsulation數(shù)據(jù)有效 |
Out_rdy |
1 |
O |
輸入數(shù)據(jù)包允許信號 |
封裝過程中的狀態(tài)轉(zhuǎn)換圖如圖3.4-21:
圖3.4-21capsulation封裝包頭流程圖
7、SRAM讀寫控制器
SRAM讀寫控制的作用是:①將capsulation模塊來的數(shù)據(jù)寫入SRAM中,寫入時(shí)按照代的大小和信源號寫入block中。SRAM按照地址分為3個(gè)區(qū)域,每個(gè)區(qū)域存儲(chǔ)對應(yīng)由一個(gè)信源。每個(gè)區(qū)域分為256個(gè)block,每個(gè)block深度是400,寬度為36bits,可以存儲(chǔ)1800字節(jié)的數(shù)據(jù)(即至少可容納一個(gè)正常大小的IP數(shù)據(jù)包)。②讀取數(shù)據(jù)時(shí)按照block逐個(gè)讀取,讀取后的數(shù)據(jù)直接發(fā)送至output_arbiter。在每發(fā)送完一個(gè)數(shù)據(jù)包后,對解碼標(biāo)志寄存器復(fù)位。
SRAM讀寫控制器的端口列表如下:
信號名稱 |
位寬bits |
I/O |
信號描述 |
decoder_in_rdy |
1 |
O |
寫SRAM控制器允許信號 |
decoder_in_wr |
1 |
I |
輸入有效 |
decoder_in_data |
64 |
I |
輸入至SRAM控制器數(shù)據(jù)總線 |
decoder_in_ctrl |
8 |
I |
輸入至SRAM控制器控制總線 |
reset_req |
1 |
O |
復(fù)位請求 |
reset_src_gen |
12 |
O |
需要復(fù)位的數(shù)據(jù)包(表示解碼后已發(fā)送完畢) |
reset_info_vld |
1 |
O |
復(fù)位信息有效 |
reset_ack |
1 |
I |
復(fù)位請求響應(yīng) |
dcod_data_0 |
64 |
O |
輸出的IP數(shù)據(jù)包的數(shù)據(jù)總線 |
dcod_ctrl_0 |
8 |
O |
輸出的IP數(shù)據(jù)包的控制總線 |
wr_vld_0 |
1 |
O |
輸出有效 |
wr_rdy_0 |
1 |
I |
發(fā)送數(shù)據(jù)允許標(biāo)志 |
sram_addr |
19 |
O |
Sram讀/寫地址 |
sram_we |
1 |
O |
Sram寫使能 |
sram_bw |
4 |
O |
SRAM寫入控制信號 |
sram_wr_data |
36 |
O |
SRAM寫數(shù)據(jù)總線 |
sram_rd_data |
36 |
I |
SRAM讀數(shù)據(jù)總線 |
sram_tri_en |
1 |
O |
SRAM寫三態(tài)控制 |
SRAM的讀寫時(shí)序如圖3.4-22:
圖3.4-22 SRAM讀寫時(shí)序