官厌 发表于 2025-6-5 09:22:14

valid/ready握手机制及verilog代码

目录

[*]valid/ready握手协议
[*]valid/ready状态机
[*]verilog实现代码
[*]波形文件

valid/ready握手协议

在两个模块之间传输数据时候,可以使用valid/ready握手协议,保证数据传输的有效性。
发送方准备发送数据时,它发送valid信号给接收方,接收方准备好可以接收数据时候,他发送ready信号给发送方,在valid和ready信号都置高的时钟上升沿,开始传送数据。


valid/ready状态机

发送方接收方都会处于下图所示四个状态之一,它们的状态转化图如下

verilog实现代码

发送模块,文件名称:transmitter.sv
`timescale 1ns/1ns        module transmitter #(parameter DATA_WIDTH=8)    (input wire clk,input wire rst_n,output logic vld,output logic data,input wire rdy);//下一个valid信号logic next_vld;//下一个数据及hold的数据logic next_data;reg hold_data;//内部valid信号logici_vld;//内部data信号logic i_data;//发送数据队列,记录发送的数据,便于debug显示logic sent_data[$];    typedef enum {IDLE, WAIT_RDY, WAIT_VLD, TRANSFER} ff_state;ff_state current_state = IDLE;ff_state next_state    = IDLE;    //根据现在状态,更新下一个状态always_comb begin    case (current_state)      IDLE: begin      if (i_vld == 1 && rdy == 0) begin          next_state = WAIT_RDY;      end else if (i_vld == 0 && rdy == 1) begin          next_state = WAIT_VLD;      end else if (i_vld == 1 && rdy == 1) begin          next_state = TRANSFER;          end else begin          next_state = current_state;      end      end            WAIT_RDY: begin      if (i_vld == 1 && rdy == 1) begin          next_state = TRANSFER;          end else begin          next_state = current_state;      end      end            WAIT_VLD: begin      if (i_vld == 1 && rdy == 1) begin          next_state = TRANSFER;          end else begin          next_state = current_state;      end            end            TRANSFER: begin      if (i_vld == 1 && rdy == 0) begin          next_state = WAIT_RDY;      end else if (i_vld == 0 && rdy == 1) begin          next_state = WAIT_VLD;      end else if (i_vld == 0 && rdy == 0) begin          next_state = IDLE;          end else begin          next_state = current_state;      end            end          endcase      end    always_ff @(posedge clk or negedge rst_n) begin      // Next state here is the previous state from the previous cycle    $display(" next_vld: %d, next_state: %d, current_state: %d", $time, next_vld, next_state, current_state);      if (!rst_n) begin      current_state

羔迪 发表于 2025-10-15 11:23:53

热心回复!

东门清心 发表于 2025-10-24 08:01:02

新版吗?好像是停更了吧。

拙因 发表于 2025-12-9 10:00:53

收藏一下   不知道什么时候能用到

扒钒 发表于 2025-12-28 06:04:06

感谢发布原创作品,程序园因你更精彩

站竣凰 发表于 2026-1-1 12:53:42

新版吗?好像是停更了吧。

求几少 发表于 2026-1-8 15:04:06

东西不错很实用谢谢分享

越蔓蔓 发表于 2026-1-9 07:40:50

东西不错很实用谢谢分享

驳嗦 发表于 2026-1-14 05:32:09

收藏一下   不知道什么时候能用到

咸和璧 发表于 2026-1-17 14:13:48

东西不错很实用谢谢分享

山真柄 发表于 2026-1-18 02:05:17

这个有用。

鞍汉 发表于 2026-1-18 12:42:35

用心讨论,共获提升!

锺冰洁 发表于 2026-1-20 09:33:49

东西不错很实用谢谢分享

幽淆 发表于 2026-1-20 13:49:16

不错,里面软件多更新就更好了

芮梦月 发表于 2026-1-20 17:24:54

不错,里面软件多更新就更好了

豹筒生 发表于 2026-1-21 05:58:44

谢谢分享,辛苦了

仇华乐 发表于 2026-1-22 22:17:26

用心讨论,共获提升!

邰怀卉 发表于 6 天前

喜欢鼓捣这些软件,现在用得少,谢谢分享!

利怡悦 发表于 5 天前

懂技术并乐意极积无私分享的人越来越少。珍惜

福清婉 发表于 5 天前

感谢分享,学习下。
页: [1] 2
查看完整版本: valid/ready握手机制及verilog代码