基于网络编码的多信源组播通信系统,包括源代码,原理图等 (三)
扫描二维码
随时随地手机看文章
3 系统的详细设计方案
3.1 概述
在组播网络的拓扑图中,编码路由器、转发路由器和解码路由器是三个独立的系统,各自完成编码、转发和解码的任务。前面讲过,分组的编码、解码主要在网络层完成。在网络层中数据通道中,data bus和ctrl bus是同步传输的,二者之间的关系和格式如图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 数据通道中的data bus和ctrl bus
Ctrl为ff时,表明为一个数据包的包头,xy为非零数据,指明最后一个有效的字节所在的位置,如01000000指明是第7个,即data[63:48]为有效数据。模块之间数据传输的过程是:若上一个模块已经处理完毕,想把数据传输到下一个模块,首先判断输入信号rdy是否有效,当rdy = 1时,将数据和控制信号同步发送出去,同时wr_vld信号有效,时序如图3.1-2所示:
图3.1-2 有效的数据传输时序
3.2 编码路由器详细设计方案
3.2.1编码系统整体模块如图3.2-1所示
图3.2-1:编码系统整体模块图
3.2.2系统中各单元模块的功能与时序
(1)Input arbiter
① Input arbiter内部结构如图3.2-2所示:
图3.2-2 Input arbiter内部结构图
② 本模块输入输出信号列表及说明
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 |
③ 功能描述及数据流
本模块执行输入仲裁功能。两个独立的input arbiter模块分别从两个输入FIFO读出数据包,判断数据包类型,决定输出端口(非IP包直接送往output arbiter,IP包送往control),输出数据。
为了判断数据包类型,需要获取16-bit Ether Type信息,该信息位于每个数据包第二个double word中的31:16位,若Ether Type为0x0080,则说明此数据包为IP数据包,若Ether Type值不是0x0080,则说明此数据包不是IP数据包,将被直接送往output arbiter模块。
④ 关键时序及状态机
本模块的状态机的状态转化如图3.2-3所示
图3.2-3:input arbiter状态转换图
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 |
② 内部结构如图3.2-4
图3.2-4:control模块内部结构
③ 本模块输入输出信号列表及说明
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 |
④ 功能描述及数据流
本模块为主控制模块。子模块control arbiter通过监控两条输入通道的ctrl bus,控制子模块head_spliter的两个独立的例化。具体控制操作如下:
若两条输入通道同时进来新的IP包,则同时处理两条通道。
若输入通道1进来新IP包时,通道2中IP包已经在处理中,则阻塞通道1,直至通道2处理完毕再重新判决。
若同时处理两条通道时,两条通道中的数据包深度相同,则无需“PADDING”操作。若通道1中数据包发送完毕时(ctrl bus用one-hot-code标明结尾字节),通道2中数据包尚未发送完毕,则需对通道1中数据包补零,并在ctrl bus中用0b11110000标明此为padding数据。
子模块head_spliter分离包头和负载,并分别发往head_info_extractor提取封装信息和FIFO_ctrl_payload暂存负载。
子模块head_info_extractor提取包头中的源IP地址,并由此生成4-bit信源编号(source number)和10-bit代编号(generation number),将生成的封装信息存入FIFO_ctrl_packinginfo,将原始包头存入FIFO_ctrl_legacy。
⑤ 关键时序及状态机
Head_spliter状态机如图3.2-5
图3.2-5:Head_spliter状态机
Control arbiter时序图
Head spliter时序图
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模块的内部结构如图3.2-6
图3.2-6:coding模块内部结构
③ 本模块输入输出信号列表及说明
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 |
④ 功能描述及数据流
本模块为主运算模块。子模块paylaod router构建与上游模块control的接口,从control的子模块FIFO ctrl payload中读取数据。若两FIFO都非空,则说明control模块同时处理了两条通道,也即需要进行编码操作。Paylpad router同时读取两个FIFO中的数据,送往由m64×8 multiplier、m72×72 adder以及m72to64 converter组成的“编码流水线”进行编码运算,并向下游packing模块发送编码过的数据包。
子模块prng tap16是8位伪随机数产生器。使能信号rand_num_en有效时,产生一个8位伪随机数。子模块m64×8 multiplier是64乘8位乘法器,该模块将负载与随即系数相乘,得到72位结果。m72×72 adder是72位全加器,将两个乘法器得到的结果相加得到编码输出。m72to64 converter是位宽转换器,由于coding模块输出的数据总线仍需保持64位,所以需要该转换器将72位编码输出转换为64为编码数据。由于是同步电路,采用同一时钟,该位宽转换将产生一定的数据囤积,需要较大缓存。
⑤ 关键时序与状态机
- Payload router状态机
图3.2-7 Payload router状态机[!--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 |
② 内部结构图
图3.2-8 Packing内部结构图
③ 本模块输入输出信号列表及说明
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 |
④ 功能描述及数据流
本模块为封装模块。子模块packing FIFO构建与coding模块的数据接口,将接收并缓存编码数据包以及未编码数据包(使用额外第64位数据标志该包是否编码,该位为“1”说明编码,该位为“0”说明未编码)。
子模块packing center是主封装模块。它根据packing FIFO中读出的数据判断需要哪些包头信息,然后向control模块中相应FIFO读取需要的包头信息,并依次封装成NCP数据包,发送到output arbiter。
⑤ 关键时序及状态机
Packing center状态机
第一层状态机:packing_center_status
图3 .2-9 packing_center_status状态机
第二层状态机:
coded_process
图3 .2-10coded_process状态机
uncoded_process
图3.2-11 uncoded_process 状态机
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 |
② 功能描述及数据流
本模块为输出仲裁模块。为协调多路输出通道,避免冲突而设计。入端构建与input arbiter通信的两路端口和与packing通信的一路端口,出端构建与MAC层通信的输出端口。将选通并维护唯一一条输入通道直至该数据包全部发送完毕。采用轮询方式检查三路输入通道以避免冲突。
③ 关键时序及状态机
图3.2-12 Output arbiter状态机
3.3 转发路由器详细设计方案
3.3.1转发路由器系统整体模块图
图3.3-1总体模块图
系统模块功能说明:该模块有两个子模块input_arbiter模块和forward模块构成,其中前者为标准模块;后者为自定义模块,接受来自MAC层的数据包,经过相关处理输出数据包,实现将未编码的IP数据包封装成NCP数据包并进行转发以及将其它非IP数据包或NCP数据包进行直接转发的功能。
3.3.2系统中各单元模块的功能与时序
Input_arbiter模块
① Input_arbiter模块的内部结构图如图3.3-2
图3.3-2 input_arbiter模块
② 本模块的输入输出信号列表及说明(如下例)
信号名称 |
位宽 bits |
I/O |
描述 |
in_data_n(n:0、1、2、3) |
64 |
input |
从MAC层输入的data数据 |
in_ctrl_n(n:0、1、2、3) |
8 |
input |
从MAC层输入的ctrlbus数据 |
in_wr_n(n:0、1、2、3) |
1 |
input |
从MAC层输入的数据写使能信号(1为有效) |
in_rdy_n(n:0、1、2、3) |
1 |
output |
输出至MAC层的准备信号(1为准备完毕,可以写入) |
out_data |
64 |
output |
输出至forward模块的data数据 |
out_ctrl |
8 |
output |
输出至froward模块的ctrl数据 |
out_wr |
1 |
output |
输出至forward模块的写使能信号(1为写使能有效) |
out_rdy |
1 |
input |
从forward模块输入的准备信号(1为准备好,可以写入)
|
本模块的功能描述以及内部数据处理的过程
功能描述:从MAC层的接口传来的数据信号写入到receivefifo中,每个接口接一个fifo,通过本模块的仲裁,循环查询每个fifo,如果每个fifo不为空则输出该fifo的数据到forward 模块。本次实验只用到接口1,其他接口实际上是没有数据输入,然而为了以后的可拓展设计,采取循环查询每个fifo,这样可以从每个接口进行数据读入数据,更合理。
④ 关键时序和状态机转化图
图3.3-3 input_arbiter时序图
2、forward模块
① forward模块的内部结构图如图3.3-4
图3.3-4
②本模块的输入输出信号列表及说明(如下例)
信号名称 |
位宽 bits |
I/O |
描述 |
out_data |
64 |
input |
从input_arbiter模块输出的data数据 |
out_ctrl |
8 |
input |
从input_arbiter模块输出的ctrl数据 |
out_wr |
1 |
input |
从input_arbiter模块输出的写使能信号(1为写使能有效) |
out_rdy |
1 |
input |
输出至input_arbiter模块的准备使能信号(1为准备使能有效) |
out_data_n(n:0、1、2、3) |
64 |
output |
输出至MAC层的data数据 |
out_ctrl_n(n:0、1、2、3) |
8 |
output |
输出至MAC层的ctrlbus数据 |
out_wr_n(n:0、1、2、3) |
1 |
output |
输出至MAC层的数据写使能信号(1为有效) |
out_rdy_n(n:0、1、2、3) |
1 |
intput |
从MAC层输入的准备信号(1为准备完毕,可以写入) |
③ 本模块的功能描述以及内部数据处理的过程
(1)Forward模块下子模块Ip_Packet_Arbiter 定义6个寄存器变量分别为:Reg_0—Reg_5 宽度为64bit, 6个寄存器变量:Ctrl_0—Ctrl_5宽度为8bit.分别存储数据包的前48个字节数据和CtrlBus信息。以便对包头进行解析,并进行判断所属的类型。
(2)判断属于哪一类型的数据包,如果是非IP数据包则从Ip_packet_Arbiter模块发送一个信号Ip_Packet_Check的信号到Transmit模块,通过data信号线和ctrl信号线将数据传送到Transmit模块并转发到各个接口;
(3)如果属于iP数据包则进一步判断是属于编码后的数据包还是未编码的数据包,如果是编码后的数据包则和①做同样处理,如果是未编码的数据包,则进行相应的处理(更改modulheader、MAC的目标地址、Ip包头、添加NCP包头操作),然后将组合好的数据包头和Ctrlbus 和Ip_Packet_Check信号一起送到Transmit模块。在Transmit模块通过收到的Ip_Packet_Check信号进行判断是否需要对存放数据进行重新的封装并进行相应处理,然后进行转发操作。整个过程的流程图如图3.3-5
图3.3-5
④关键时序和状态机转化图
图3.3-6
⑤ froward模块下子模块Transmit的状态机以及描述如图3.3-7
图3.3-7
对整个状态机工作条件进行详细的描述如下:
当满足满足计数器counter=0的条件时,进入IDLE状态;counter计数器不改变并且不是包头的起始信号时则保持在该状态;如果counter=1,发现包头起始信号则保存该字段的值,并设置counter=2;
当满足计数器counter=2时,并且是包的中间值信号时则跳转到READ状态;根据counter计数器的值有条件的保存在该状态;counter自加;
当满足计数器counter=3时,判断MAC字段中上层协议的类型标志,如果为IP数据包继续保持在READ状态,counter+1;当counter=4时 进行判断数据包中协议字段的如果为未编码的IP数据包则保存在该状态,counter+1;
当满足counter=3时判断上层协议类型标志为非IP数据包,则直接跳转到SEND状态;如果为已经编码的IP数据包既NCP数据包,则调整到SEND状态;
当counter=7的时候,跳转到ADDNCPHEADER状态;数据处理完毕后state=SEND;
当暂存的数据包没有发送完之前则保持在该状态;
当state=SEND时,跳转到SEND状态;
当暂存的数据包的字段发送完毕后,跳转到CONSENCTIVEPASS(持续发包)状态时;
判断包尾的结束标志,如果不是包尾的结束标志则保持在该状态;
判断包尾的结束标志,如果是包尾的结束标志,则发最后一个字段,并跳转到IDLE(起始状态);[!--empirenews.page--]
3.4 解码路由器详细设计方案
3.4.1 解码路由器系统整体模块图
如下图3.4-1所示,为解码路由器的整体模块图
3.4-1 解码路由器系统整体模块图
3.4.2系统中各单元模块的功能与时序
1、Input_arbiter:采用轮询策略,当fifo非空时从fifo接收数据,根据mac header判断数据是否为IP数据包,若是,则将数据发送到DRAM读写控制模块,同时将信源号、代编号发送到CAM读写控制模块。
可用一个两状态的状态机实现:即轮询判断输入和数据输出:在FIFO非空时读数据,并根据数据包的类型发送到DRAM读写控制器或output fifo中,若是IP数据包,同时将信源号、代编号发送给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的作用是将解码后的数据发送到MAC层。由于对于非IP数据包我们并没有对其进行编码,所以在解码路由器中由input_arbiter判断后直接输出output_arbiter;对于编码后的IP数据包,在解码后先暂存到SRAM中,再发送出去。本模块就是轮流判断并接收来自SRAM和input_arbiter的数据,并将数据包发送到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 |
需要复位的数据包(表示解码后已发送完毕) |
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将一个数据包发送出去后,再将相应的解码标志位置0,以置位为例,解码标志位的写时序如图3.4-5:
图3.4-5:置位解码标志寄存器
4、DRAM控制器:接收数据,并顺序存储到DRAM中去。
注意:我们将DRAM分为三块,分别对应于数据接收的三个信道,即第0个信道的数据存储到DRAM的第0块,第1个信道的数据存储到DRAM的第1块……信道号由port_num给出。由于DRAM是按照block读写的,因此每个block大小为2034字节,位宽为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的区域 |
wr_rdy_arb |
1 |
O |
写空闲信号 |
port_num_rd |
2 |
I |
读取数据包的区域 |
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地址发送至DRAM控制器,接着DRAM控制器从DRAM中读取数据,当decoder空闲时将数据发送出去,时序图如3.4-9所示:
图3.4-9 对DRAM控制器的读操作
(2)当DRAM控制器进行写操作时,将按照input_arbiter发送过来的端口号,按照地址大小顺序写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读写过程[!--empirenews.page--]
③decode_control_sm
该模块的功能是按照轮询策略,控制decoder解码储存在DRAM中的数据包。通过查询CAM中的数据包的存储地址,将查询到的地址输出给DRAM读写控制模块,从而找到解码所需要的数据,同时将要查询的数据包的信源号和代的编号发送给解码模块。若不能查找到解码因子,则将信号Pkt_not_find置为有效电平,通知decoder无法解码,同时将状态转到解码下一个数据包的状态上。在开始查找CAM时,要等待储存一定数量的数据包,在我们的系统里面,暂定为32。
状态机处理控制流程如图3.4-13:
图3.4-13:decode_control_sm状态机及数据处理流程
6、decoder
decoder是整个解码路由器的核心之一,它的主要功能是接收来自DRAM的编码后的IP数据包,在decode_control_panel模块的控制下对数据包进行解码,它包括多个小模块,其整体图和内部结构图如3.4-14和3.4-15所示:
图3.4-14 decoder整体结构图
图3.4-15:decoder内部结构图
① header_parser
分析接收到的数据包,如果已经被编码,根据包头提取信源号、代号、长度和系数给运算控制模块,如果没有被编码,则查询解码标志寄存器,如果已经解码并储存在二级缓存中,则该数据包只是一个解码因子,把数据发送到fwd_sel,若没有解码,则同时发送到capsulation和forward sel。如果数据是编码后的数据包,则将数据包去掉包头后将数据发送给forward sel模块。当发送到最后的64位数据时,eop信号有效,指明是数据包的最后有效字节。
下图所示为输入输出接口图3.4-16:
图3.4-16:header_parser模块图
其输入输出端口列表如下:
信号名称 |
位宽bits |
I/O |
描述 |
in_rdy |
1 |
O |
数据输出输入允许信号 |
out_data |
64 |
I |
输入的数据包的data_bus |
out_ctrl |
8 |
I |
输入数据包的ctrl_bus |
data_vld |
1 |
I |
输入数据有效 |
rd_dcod_reg_req_0 |
1 |
O |
读取解码标志位请求 |
rd_dcod_src_gen_0 |
12 |
O |
要读取的数据包的信源号和代编号 |
req_ack_vld_0 |
1 |
I |
输入有效 |
alredy_decod_0 |
1 |
I |
解码标志(“1”代表已经解码,“0”代表未解码) |
Uncod_data |
64 |
O |
未编码数据包的数据总线 |
Uncod_ctrl |
8 |
O |
未编码数据包的控制总线 |
Wr_vld |
1 |
O |
写capsulation数据有效 |
Out_rdy |
1 |
I |
输出capsulation允许信号 |
fwd_rdy |
1 |
I |
输出fwd_sel允许信号 |
out_vld |
1 |
O |
输出fwd_sel有效 |
pay_load |
64 |
O |
输出fwd_sel数据(不含包头) |
eop |
4 |
O |
最后指示一个有效字节的指示 |
uncod |
1 |
O |
指明输出的数据包是否编码 |
src_gen_num |
12 |
O |
Decoder接收到的数据包的信源号和代的编号 |
len_0 |
16 |
O |
被编码的第一个数据包的有效载荷的长度 |
len_1 |
16 |
O |
被编码的第二个数据包的有效载荷的长度 |
coef_0 |
8 |
O |
被编码的第一个数据包的编码系数 |
coef_1 |
8 |
O |
被编码的第二个数据包的编码系数 |
hp_info_vld |
1 |
O |
输出信息有效 |
encod_pkt_trans_fi |
1 |
O |
编码数据包传输完毕标志 |
oc_info_vld |
1 |
I |
解码控制输入信息有效 |
uncod_pkt_need |
1 |
I |
未编码的数据包是/否解码因子(1=是,0=否) |
图3.4-17所示为状态机处理流程:
图3.4-17:header_parser状态机处理流程
② forwd_sel
该模块功能主要是转发数据包:接收来自header_parser的数据包,若uncod=0,则表明数据包是编码后数据包,将已经编码后的数据包的载荷转换为72bits后,将数据发送到RAM读写控制器,否则发送到decod_operation。当有反馈输入请求时,若输出到decod_operation 的数据线空闲时,将反馈数据发送到decod_operation。
本模块的端口列表如下:
信号名称 |
位宽bits |
I/O |
信号描述 |
fwd_rdy |
1 |
O |
输入fwd_sel允许信号 |
out_vld |
1 |
I |
输入fwd_sel有效 |
pay_load |
64 |
I |
输入fwd_sel数据总线(不含包头) |
eop |
4 |
I |
最后指示一个有效字节的指示 |
uncod |
1 |
I |
指明输出的数据包是否编码 |
wr_req |
1 |
O |
写RAM请求 |
encod_data |
72 |
O |
写RAM的数据总线 |
ram_data_vld |
1 |
O |
数据有效 |
encod_data_eop |
4 |
O |
数据包结束标志,指明最后一个有效字节 |
wr_ack |
1 |
I |
写RAM响应 |
uncod_data_vld |
1 |
O |
输出至dcod_operation的数据有效 |
uncod_data_factor |
64 |
O |
输出至dcod_operation的数据总线 |
uncod_data_eop |
4 |
O |
数据包结束标志,指明最后一个有效字节 |
dcod_rdy |
1 |
I |
输出至dcod_operation允许信号 |
fd_back_ack |
1 |
O |
接受反馈响应 |
fd_back_vld |
1 |
I |
反馈数据有效标志 |
fd_back_req |
1 |
I |
反馈请求 |
fd_back_data |
64 |
I |
反馈数据总线 |
fd_back_data_eop |
4 |
I |
反馈数据结束标志,指明最后一个有效字节 |
③ RAM读写控制器
在写数据时,先从运算控制模块中得出要储存的RAM号,接着RAM读写控制器将从收到forward sel 模块收到的数据存到片内RAM里面去。在读数据时,根据dcod_operation模块提供的ram号,从相应的ram中读取数据,由于使用的是双端口ram,因此读写可以同时进行。模块信号列表如下:
信号名称 |
位宽bits |
I/O |
信号描述 |
wr_req |
1 |
I |
写RAM请求 |
encod_data |
72 |
I |
写RAM的数据总线 |
ram_data_vld |
1 |
I |
数据有效 |
encod_data_eop |
4 |
I |
数据包结束标志,指明最后一个有效字节 |
wr_ack |
1 |
O |
写RAM响应 |
wr_ram_num |
2 |
I |
要写入的RAM号 |
info_vld |
1 |
I |
数据有效标志 |
req_ram_num |
1 |
O |
读RAM号请求 |
rd_ram_num |
2 |
I |
需要读取数据的RAM号 |
rd_req |
1 |
I |
读RAM请求 |
ram_data_eop |
4 |
O |
数据包结束标志,指明最后一个有效字节 |
ram_data |
72 |
O |
读RAM的数据总线 |
ram_vld |
1 |
O |
读RAM数据有效 |
RAM读写时序图如图3.4-18:
图3.4-18:RAM读写时序
每个RAM由双端口block RAM组成,位宽为72位,深度为180,因此读写的地址位宽均为8位。由于RAM的读写控制时序是固定的,所以在此不再赘述。
④ operation_control
运算控制(operation_control)是decoder模块的控制核心,它和decode_control_panel配合,完成对编码数据包的解码。
输入输出信号列表:
信号名称 |
位宽bits |
I/O |
信号描述 |
Pkt_vld |
1 |
I |
要解码的数据包输出有效标志 |
Pkt_decoding |
12 |
I |
正在解码的数据包的信源号、代编号 |
Decod_com |
1 |
O |
数据包解码完成标志 |
has_other_factor |
1 |
I |
有另外一个解码因子 |
Pkt_not_find |
1 |
I |
所需要解码数据包未找到 |
pkt_need_src_gen |
12 |
O |
解码需要的数据包 |
need_pkt_vld |
1 |
O |
所需数据包有效 |
src_gen_num |
12 |
I |
Decoder接收到的数据包的信源号和代的编号 |
len_0 |
16 |
I |
被编码的第一个数据包的有效载荷的长度 |
len_1 |
16 |
I |
被编码的第二个数据包的有效载荷的长度 |
coef_0 |
8 |
I |
被编码的第一个数据包的编码系数 |
coef_1 |
8 |
I |
被编码的第二个数据包的编码系数 |
hp_info_vld |
1 |
I |
输入信息有效 |
encod_pkt_trans_fi |
1 |
I |
编码数据包传输完毕标志 |
oc_info_vld |
1 |
O |
解码控制输出信息有效 |
uncod_pkt_need |
1 |
O |
未编码的数据包是/否解码因子(1=是,0=否) |
wr_ram_num |
2 |
O |
要写入的RAM号 |
info_vld |
1 |
O |
数据有效标志 |
req_ram_num |
1 |
I |
读RAM号请求 |
rd_info_req |
1 |
I |
读取解码信息请求 |
dcod_info_vld |
1 |
O |
解码信息有效 |
ram_num |
2 |
O |
解码数据包的所存储的RAM号 |
coef_mut |
8 |
O |
乘法系数 |
coef_div |
8 |
O |
除法系数 |
cap_info_req |
1 |
I |
封装信息请求 |
dcod_comp |
1 |
I |
解码封装完成 |
cap_info_vld |
1 |
O |
封装信息有效 |
need_feed_back |
1 |
O |
需要反馈 |
pkt_len |
16 |
O |
数据包长度 |
src_num |
4 |
O |
数据包的信源号 |
gen_num |
8 |
O |
数据报的代编号 |
Operation_control模块的主要功能是:接收header_parser发送过来的数据,通过计算和比较后与decode control panel通信,告诉decode control panel解码所需要的数据包和解码完成标志;给RAM读写给出RAM号(即存储在哪个RAM中);给decode operation模块提供解码所需要的系数和RAM号;给capsulation模块提供源IP和是否需要反馈数据的命令,其控制状态如图3.4-19下:
图3.4-19:Operation_control状态机处理流程
⑤ decode operation
decode operation是解码运算模块,它将来自fwd_sel模块的未编码的数据和来自RAM的编码数据完成减法和除法运算,还原被编码的数据。解码后将数据总线的位宽恢复为64bits。解码运算模块的端口列表如下:
信号名称 |
位宽bits |
I/O |
信号描述 |
dcod_payload |
64 |
O |
解码后的数据包的有效载荷 |
end_payload |
4 |
O |
数据包结束标志,指明最后一个有效字节 |
payload_vld |
1 |
O |
输出数据有效 |
wr_rdy |
1 |
I |
输出数据允许信号 |
uncod_data_vld |
1 |
I |
输入至dcod_operation的数据有效 |
uncod_data_factor |
64 |
I |
输入至dcod_operation的数据总线 |
uncod_data_eop |
4 |
I |
数据包结束标志,指明最后一个有效字节 |
dcod_rdy |
1 |
O |
输入至dcod_operation允许信号 |
rd_ram_num |
2 |
O |
需要读取数据的RAM号 |
rd_req |
1 |
O |
读RAM请求 |
ram_data_eop |
4 |
I |
数据包结束标志,指明最后一个有效字节 |
ram_data |
72 |
I |
读RAM的数据总线 |
ram_vld |
1 |
I |
读RAM数据有效 |
rd_info_req |
1 |
O |
读取解码信息请求 |
dcod_info_vld |
1 |
I |
解码信息有效 |
ram_num |
2 |
I |
解码数据包的所存储的RAM号 |
coef_mut |
8 |
I |
乘法系数 |
coef_div |
8 |
I |
除法系数 |
为了快速完成解码运算,我们在此采取并行除法的方法使之能快速解码,解码运算的算法图如图3.4-20:
图3.4-20 decoder_operation内部的并行除法
⑥ capsulation
Capsulation是解码运算的最后一个模块,其主要功能是封装解码后的数据包。其主要任务是:(1)接收来自decode operation和header_parser的数据;(2)将来自header_parser的未编码的数据包去掉NCP包头;(3)计算新的包头校验和,更新TTL;(4)置位解码标志寄存器;(5)将来自decode operation模块的数据,先向运算控制模块询问是否要反馈,若需要,则将数据反馈至forward_sel模块;(6)恢复IP数据包头;(7)将IP包头和有效载荷封装好,并恢复ctrl_bus和module header,将其一起同步发送出去。
端口信号列表如下:
信号名称 |
位宽bits |
I/O |
信号描述 |
decoder_in_rdy |
1 |
I |
输出至SRAM允许信号 |
decoder_in_wr |
1 |
O |
输出有效 |
decoder_in_data |
64 |
O |
输出至SRAM数据总线 |
decoder_in_ctrl |
8 |
O |
输出至SRAM控制总线 |
set_req |
1 |
O |
置位请求 |
set_src_gen |
12 |
O |
需要置位的数据包(表示已经解码完毕) |
set_info_vld |
1 |
O |
置位信息有效 |
set_ack |
1 |
I |
置位请求响应 |
cap_info_req |
1 |
O |
封装信息请求 |
dcod_comp |
1 |
O |
解码封装完成 |
cap_info_vld |
1 |
I |
封装信息有效 |
need_feed_back |
1 |
I |
需要反馈 |
pkt_len |
16 |
I |
数据包长度 |
src_num |
4 |
I |
数据包的信源号 |
gen_num |
8 |
I |
数据报的代编号 |
dcod_payload |
64 |
I |
解码后的数据包的有效载荷 |
end_payload |
4 |
I |
数据包结束标志,指明最后一个有效字节 |
payload_vld |
1 |
I |
输入数据有效 |
wr_rdy |
1 |
O |
输入数据允许信号 |
fd_back_ack |
1 |
I |
接受反馈响应 |
fd_back_vld |
1 |
O |
反馈数据有效标志 |
fd_back_req |
1 |
O |
反馈请求 |
fd_back_data |
64 |
O |
反馈数据总线 |
fd_back_data_eop |
4 |
O |
反馈数据结束标志,指明最后一个有效字节 |
Uncod_data |
64 |
I |
未编码数据包的数据总线 |
Uncod_ctrl |
8 |
I |
未编码数据包的控制总线 |
Wr_vld |
1 |
I |
写capsulation数据有效 |
Out_rdy |
1 |
O |
输入数据包允许信号 |
封装过程中的状态转换图如图3.4-21:
图3.4-21capsulation封装包头流程图
7、SRAM读写控制器
SRAM读写控制的作用是:①将capsulation模块来的数据写入SRAM中,写入时按照代的大小和信源号写入block中。SRAM按照地址分为3个区域,每个区域存储对应由一个信源。每个区域分为256个block,每个block深度是400,宽度为36bits,可以存储1800字节的数据(即至少可容纳一个正常大小的IP数据包)。②读取数据时按照block逐个读取,读取后的数据直接发送至output_arbiter。在每发送完一个数据包后,对解码标志寄存器复位。
SRAM读写控制器的端口列表如下:
信号名称 |
位宽bits |
I/O |
信号描述 |
decoder_in_rdy |
1 |
O |
写SRAM控制器允许信号 |
decoder_in_wr |
1 |
I |
输入有效 |
decoder_in_data |
64 |
I |
输入至SRAM控制器数据总线 |
decoder_in_ctrl |
8 |
I |
输入至SRAM控制器控制总线 |
reset_req |
1 |
O |
复位请求 |
reset_src_gen |
12 |
O |
需要复位的数据包(表示解码后已发送完毕) |
reset_info_vld |
1 |
O |
复位信息有效 |
reset_ack |
1 |
I |
复位请求响应 |
dcod_data_0 |
64 |
O |
输出的IP数据包的数据总线 |
dcod_ctrl_0 |
8 |
O |
输出的IP数据包的控制总线 |
wr_vld_0 |
1 |
O |
输出有效 |
wr_rdy_0 |
1 |
I |
发送数据允许标志 |
sram_addr |
19 |
O |
Sram读/写地址 |
sram_we |
1 |
O |
Sram写使能 |
sram_bw |
4 |
O |
SRAM写入控制信号 |
sram_wr_data |
36 |
O |
SRAM写数据总线 |
sram_rd_data |
36 |
I |
SRAM读数据总线 |
sram_tri_en |
1 |
O |
SRAM写三态控制 |
SRAM的读写时序如图3.4-22:
图3.4-22 SRAM读写时序