当前位置: 首页 > web >正文

集成电路流片随笔19:full_handshake

全双工握手接收模块 (full_handshake_rx),它的功能是接收来自发送端 (tx) 的数据,并对发送端进行应答(ACK)。模块实现了基于握手的通信机制,以确保数据的可靠传输。模块的输入输出分别连接于发送端和接收端,并通过状态机来控制数据的接收和确认。

代码解析

1. 模块参数与输入输出信号
module full_handshake_rx #(parameter DW = 32)(             // RX要接收数据的位宽input wire clk,                 // RX端时钟信号input wire rst_n,               // RX端复位信号// from txinput wire req_i,               // TX端请求信号input wire[DW-1:0] req_data_i,  // TX端输入数据// to txoutput wire ack_o,              // RX端应答TX端信号// to rxoutput wire[DW-1:0] recv_data_o,// RX端接收到的数据output wire recv_rdy_o          // RX端是否接收到数据信号
);
  • DW:接收数据的位宽,默认为 32 位。
  • clk:时钟信号,用于同步操作。
  • rst_n:复位信号,低电平有效,复位模块。
  • req_i:发送端的请求信号,表示发送端准备好发送数据。
  • req_data_i:发送端要发送的数据。
  • ack_o:接收端的应答信号,向发送端确认数据已经收到。
  • recv_data_o:接收的数据输出。
  • recv_rdy_o:接收数据准备好信号,表示接收端已经准备好接收数据。
2. 状态机的定义
localparam STATE_IDLE     = 2'b01;
localparam STATE_DEASSERT = 2'b10;
  • STATE_IDLE:表示接收端空闲状态,等待接收数据。
  • STATE_DEASSERT:表示接收端准备好状态,等待请求信号撤销。
3. 状态机转换
always @ (posedge clk or negedge rst_n) beginif (!rst_n) beginstate <= STATE_IDLE;end else beginstate <= state_next;end
endalways @ (*) begincase (state)STATE_IDLE: beginif (req == 1'b1) beginstate_next = STATE_DEASSERT;end else beginstate_next = STATE_IDLE;endendSTATE_DEASSERT: beginif (req) beginstate_next = STATE_DEASSERT;end else beginstate_next = STATE_IDLE;endenddefault: beginstate_next = STATE_IDLE;endendcase
end
  • 状态机逻辑
    • STATE_IDLE 状态,接收端等待 req 信号的到来。当 req == 1 时,表示发送端已经准备好数据,接收端将转到 STATE_DEASSERT 状态,准备接收数据。
    • STATE_DEASSERT 状态,接收端等待 req 信号撤销。当 req == 0 时,表示接收结束,回到 STATE_IDLE 状态。
4. 同步请求信号
reg req_d;
reg req;always @ (posedge clk or negedge rst_n) beginif (!rst_n) beginreq_d <= 1'b0;req <= 1'b0;end else beginreq_d <= req_i;req <= req_d;end
end
  • req 信号是对 req_i 信号的同步处理,确保 req 信号稳定,消除时钟不同时的亚稳态问题。
5. 接收数据处理
reg[DW-1:0] recv_data;
reg recv_rdy;
reg ack;always @ (posedge clk or negedge rst_n) beginif (!rst_n) beginack <= 1'b0;recv_rdy <= 1'b0;recv_data <= {(DW){1'b0}};end else begincase (state)STATE_IDLE: beginif (req == 1'b1) beginack <= 1'b1;recv_rdy <= 1'b1;           // 这个信号只会持续一个时钟recv_data <= req_data_i;    // 这个信号只会持续一个时钟endendSTATE_DEASSERT: beginrecv_rdy <= 1'b0;recv_data <= {(DW){1'b0}};if (req == 1'b0) beginack <= 1'b0;endendendcaseend
end
  • STATE_IDLE 状态,接收端在收到 req == 1 时:

    • ack 信号设为 1,表示接收端已准备好接收数据。
    • recv_rdy 设为 1,表示接收端准备好接收数据,且仅在该时钟周期有效。
    • recv_data 设置为 req_data_i,即接收的数据。
  • STATE_DEASSERT 状态,接收端等待 req == 0,表示接收完成,此时 recv_rdy 被清零,recv_data 被重置。

6. 输出信号赋值
assign ack_o = ack;
assign recv_rdy_o = recv_rdy;
assign recv_data_o = recv_data;
  • ack_o:表示接收端的应答信号,确认数据接收。
  • recv_rdy_o:表示接收端是否准备好接收数据。
  • recv_data_o:接收到的数据。

总结:

  • 该模块实现了通过 JTAG 协议进行数据的接收,并通过握手信号确保接收端和发送端的数据交互可靠。
  • 它基于 状态机,根据接收到的请求信号来控制接收过程:
    • STATE_IDLE 状态时,接收端等待接收请求;
    • STATE_DEASSERT 状态时,接收端确认接收到数据并准备接收下一批数据。
  • 同时通过应答信号(ack)向发送端确认数据接收状态,并通过 recv_rdyrecv_data 输出接收到的数据。
http://www.xdnf.cn/news/2779.html

相关文章:

  • Web技术与HTTP协议
  • 【linux】一文掌握 Tmux 的各种指令(Tmux备忘清单)
  • mtrace和memleak源码分析
  • 游戏盾与高防CDN的协同防御策略分析
  • element-ui carousel 组件源码分享
  • 深入剖析二叉树家族:二叉树、平衡二叉树、满二叉树与搜索二叉树
  • 系统架构-软件可靠性
  • 【前端】1h 搞定 TypeScript 教程_只说重点
  • RK3576遇到的坑
  • 基于RSSI原理的Wi-Fi定位程序,N个锚点(数量可自适应)、三维空间,轨迹使用CKF进行滤波,附完整的代码,可复制粘贴
  • 将有序数组转换为高度平衡二叉搜索树 | 详解与Java实现
  • 第11章 安全网络架构和组件(二)
  • 《Astro 3.0岛屿架构让内容网站“脱胎换骨”》
  • 基于 Spring Boot 瑞吉外卖系统开发(八)
  • 如何实现Redis和Mysql中数据双写一致性
  • Golang|工厂模式
  • nigx屏蔽无用爬虫
  • 【数据可视化-42】杂货库存数据集可视化分析
  • C 语言函数指针与指针函数详解
  • 轻舟系列FPGA加速卡:大模型分布式训练中的高效协同者
  • 因特网和万维网
  • 下载同时返回其他参数
  • 数据分析1
  • Python 3如何用pygetwindow包将指定窗口顶到最上层(激活窗口)
  • MuJoCo 仿真注意事项
  • Deepseek-v3+cline+vscode java自动化编程
  • C语言指针
  • 2015, JLink,下载安装步骤
  • AI技术落地实战指南:从核心突破到产业赋能
  • iPhone闹钟无法识别调休致用户迟到,苹果客服称会记录反馈