基于网络编码的多信源组播通信系统,包括源代码,原理图等 (三)
③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读写时序
评论