用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
分布式数据库
›
[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-06 UDP层程 ...
[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-06 UDP层程序设计 ...
商道如狼道
论坛元老
|
2024-8-10 18:12:09
|
显示全部楼层
|
阅读模式
楼主
主题
1819
|
帖子
1819
|
积分
5457
软件版本:Anlogic -TD5.9.1-DR1_ES1.1
操作体系:WIN10 64bit
硬件平台:适用安路(Anlogic)FPGA
实行平台:米联客-MLK-L1-CZ06-DR1M90G
开发
板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
目录
3.5 UDP层
3.5.1 UDP吸收模块
3.5.2 UDP发送模块
3.5 UDP层
该层实现用户数据和UDP报文的互转,相比于其它层次的设计,该层的逻辑相对简朴。
3.5.1 UDP吸收模块
通过计数器将UDP报文头部信息拆解,提取出端标语和长度信息。通过提取的长度对有效数据进行计数,从而得到有效数据并发送给用户端。
always@(posedge I_R_udp_clk or posedge I_reset) begin
if(I_reset) begin
cnt <= 4'd0;
O_R_udp_valid <= 1'b0;
O_R_udp_data <= 8'd0;
O_R_udp_len <= 16'd0;
udp_src_port <= 16'd0;
udp_dest_port <= 16'd0;
udp_pkg_len <= 16'd0;
udp_data_cnt <= 16'd0;
end
else if(I_udp_ip_rvalid) begin
udp_data_cnt <= udp_data_cnt + 1'b1;
case(cnt)
0 :begin udp_src_port[15:8] <= I_udp_ip_rdata; cnt <= cnt + 1'b1;end //UDP接收源端口(远程主机端口)
1 :begin udp_src_port[7:0] <= I_udp_ip_rdata; cnt <= cnt + 1'b1;end //UDP接收源端口(远程主机端口)
2 :begin udp_dest_port[15:8] <= I_udp_ip_rdata; cnt <= cnt + 1'b1;end //UDP接收目的端口(本地主机端口)
3 :begin udp_dest_port[7:0] <= I_udp_ip_rdata; cnt <= cnt + 1'b1;end //UDP接收目的端口(本地主机端口)
4 :begin udp_pkg_len[15:8] <= I_udp_ip_rdata; cnt <= cnt + 1'b1;end //UDP数据包长度
5 :begin udp_pkg_len[7:0] <= I_udp_ip_rdata; cnt <= cnt + 1'b1;end //UDP数据包长度
6 :begin cnt <= cnt + 1'b1;end //跳过检验和
7 :begin cnt <= cnt + 1'b1;end //跳过校验和
8 :begin
O_R_udp_valid <= 1'b1; //UDP接收数据有效
O_R_udp_data <= I_udp_ip_rdata;
O_R_udp_len <= udp_pkg_len - 16'd8;
cnt <= cnt + 1'b1;
end
9 :begin
if(udp_pkg_len < 16'd26) begin
if(udp_data_cnt == udp_pkg_len) begin
O_R_udp_valid <= 1'b0;
O_R_udp_data <= 8'd0;
cnt <= cnt + 1'b1;
end
else begin
O_R_udp_valid <= 1'b1;
O_R_udp_data <= I_udp_ip_rdata;
cnt <= cnt;
end
end
else begin
O_R_udp_valid <= 1'b1;
O_R_udp_data <= I_udp_ip_rdata;
cnt <= cnt;
end
end
10 :begin
O_R_udp_valid <= 1'b0;
O_R_udp_data <= 8'd0;
cnt <= cnt;
end
default: cnt <= 4'd0;
endcase
end
else if(!I_udp_ip_rvalid) begin
udp_pkg_len <= 16'd0;
udp_src_port <= 16'd0;
udp_dest_port <= 16'd0;
udp_data_cnt <= 16'd0;
O_R_udp_len <= 16'd0;
O_R_udp_data <= 8'd0;
O_R_udp_valid <= 1'b0;
cnt <= 4'd0;
end
end
复制代码
3.5.2 UDP发送模块
状态机转换图如下:
IDLE:当用户端发送写请求,且uiip_tx模块不忙时,进入WAIT_ACK状态。
WAIT_ACK:等候uiip_tx模块将udp_ip_tbusy信号拉高,完成握手,进入SEND_UDP_HEADER状态,开始发送UDP报文头部。
SEND_UDP_HEADER:将8个字节的UDP报文头部添加在有效数据之前,头部数据发送完成后,进入SEND_UDP_PACKET状态。
SEND_UDP_PACKET:将经过shift_ram移位8位的数据拼接在包头之后,通过计数器判断发送数据的数量,待数据发送完成后,回到IDLE状态,等候下一次发送请求。
always@(posedge I_W_udp_clk or posedge I_reset) begin
if(I_reset) begin
cnt <= 4'd0;
O_udp_ip_tvalid <= 1'b0;
O_udp_ip_tdata <= 8'd0;
O_udp_ip_tpkg_len <= 16'd0;
trans_data_cnt <= 16'd0;
STATE <= IDLE;
end
else begin
case(STATE)
IDLE:begin
if(I_W_udp_req & (~I_udp_ip_tbusy)) //当有写UDP请求,并且ip_tx模块不忙(当I_udp_ip_tbusy=1代表正在ip层正在传输数据)
STATE <= WAIT_ACK; //进入WAIT_ACK
else
STATE <= IDLE;
end
WAIT_ACK:begin
if(I_udp_ip_tbusy) //如果ip_tx模块准备好,代表udp_layer可以发送数据
STATE <= SEND_UDP_HEADER;
else
STATE <= WAIT_ACK;
end
SEND_UDP_HEADER:begin
case(cnt)
0 :begin
if(I_W_udp_valid) begin
O_udp_ip_tvalid <= 1'b1; //udp包数据有效
O_udp_ip_tdata <= I_udp_local_port[15:8]; //UDP报文源端口
O_udp_ip_tpkg_len <= I_W_udp_len + 16'h0008; //UDP报文长度,其中8bytes为udp首部
cnt <= cnt + 1'b1;
end
else
cnt <= 0;
end
1 :begin
O_udp_ip_tdata <= I_udp_local_port[7:0]; //UDP报文源端口
cnt <= cnt + 1'b1;
end
2 :begin
O_udp_ip_tdata <= I_udp_dest_port[15:8]; //UDP报文目的端口
cnt <= cnt + 1'b1;
end
3 :begin
O_udp_ip_tdata <= I_udp_dest_port[7:0]; //UDP报文目的端口
cnt <= cnt + 1'b1;
end
4 :begin
O_udp_ip_tdata <= O_udp_ip_tpkg_len[15:8];//UDP报文长度
cnt <= cnt + 1'b1;
end
5 :begin
O_udp_ip_tdata <= O_udp_ip_tpkg_len[7:0]; //UDP报文长度
cnt <= cnt + 1'b1;
end
6 :begin
O_udp_ip_tdata <= CHECKSUM[7:0]; //校验和
cnt <= cnt + 1'b1;
end
7 :begin
O_udp_ip_tdata <= CHECKSUM [7:0]; //校验和
cnt <= 0;
STATE <= SEND_UDP_PACKET;
end
default: cnt <= 0;
endcase
end
SEND_UDP_PACKET:begin
if(trans_data_cnt != (O_udp_ip_tpkg_len - 16'd8)) begin
O_udp_ip_tvalid <= 1'b1;
O_udp_ip_tdata <= shift_data_out;
trans_data_cnt <= trans_data_cnt + 1'b1;
STATE <= SEND_UDP_PACKET;
end
else begin
trans_data_cnt <= 16'd0;
O_udp_ip_tdata <= 8'd0;
O_udp_ip_tvalid <= 1'b0;
O_udp_ip_tpkg_len <= 16'd0;
cnt <= 0;
STATE <= IDLE;
end
end
default: STATE <= IDLE;
endcase
end
end
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
商道如狼道
论坛元老
这个人很懒什么都没写!
楼主热帖
【python】实现文章同步csdn社区自动化 ...
SQLI-LABS(Less-5)
Scrum 框架的四个会议还适用于哪些敏捷 ...
Django生产环境静态资源404问题 ...
容器化 | 在 Rancher 中部署 MySQL 集 ...
如何利用ipad随时随地开发代码 ...
django 报错 'set' object is ...
SAP集成技术(十)混合集成平台 ...
MySQL数据库安装
2022 Delphi 11开发苹果IOS证书等详细 ...
标签云
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
人工智能
登录参与点评抽奖加入IT实名职场社区
下次自动登录
忘记密码?点此找回!
登陆
新用户注册
用其它账号登录:
关闭
快速回复
返回顶部
返回列表