保持寄存器+握手

“一种解决总线同步问题的方法是使用一个保持寄存器和握手信号”,这也就是“先异步暂存,后同步写入”的方法

分别编写了发送时钟域和接收时钟域的代码进行测试,用到两组MEM,以便于观察实验结果:
//发送端代码//接收域应答信号ack采用两级寄存器同步,便于时序收敛module woshou_tx(input rst_n,input t_clk,input ack,output [7:0] dout,output reg req
);reg ack_reg1,ack_reg2;
reg [7:0] data_buf;
reg [2:0]tr_state;
reg [7:0] TR_MEM_Addr;
reg [7:0] TR_MEM [255:0];parameter TR_IDLE=3'b000, SND_DATA_REQ=3'b001, CHK_ACK_ACTIVE=3'b010, CHK_COMM_END=3'b100;always@(negedge rst_n or posedge t_clk)
beginif(!rst_n)beginack_reg1 <= 1'b0;ack_reg2 <= 1'b0;endelse beginack_reg1 <= ack;ack_reg2 <= ack_reg1;end
end//
always@(posedge t_clk or negedge rst_n)
beginif(!rst_n)begindata_buf <= 1'b0;tr_state <= TR_IDLE;TR_MEM_Addr <= 1'b0;endelse case(tr_state)TR_IDLE:             //初始化状态beginreq <= 1'b0;TR_MEM_Addr <= 1'b0;tr_state <= SND_DATA_REQ;endSND_DATA_REQ:       //送数据到总线上和发送请求信号 begindata_buf <= TR_MEM[TR_MEM_Addr];req <= 1'b1;                  //发送请求信号,请求信号为高,表示请求接收TR_MEM_Addr <= TR_MEM_Addr + 1;tr_state <= CHK_ACK_ACTIVE;endCHK_ACK_ACTIVE:           //检测应答信号为高,释放请求信号beginif(ack_reg2 == 1'b1)   //便于时序收敛beginreq <= 1'b0;             //释放请求信号tr_state <= CHK_COMM_END;endelse tr_state <= CHK_ACK_ACTIVE;endCHK_COMM_END:            //检测握手通信结束,如果应答信号被释放,一次握手结束  beginif(ack_reg2 == 1'b0)tr_state <= SND_DATA_REQ;elsetr_state <= CHK_COMM_END;enddefault:tr_state <= TR_IDLE;    endcase
endassign dout = data_buf;
endmodule
module woshou_rx(input rst_n,input r_clk,input req,input [7:0] din,output reg ack);reg req_reg1,req_reg2;reg [2:0] re_state;
reg [7:0] RE_MEM_Addr;
reg [7:0] RE_MEM[255:0];parameter RE_IDLE=3'b000, CHK_REQ_ACTIVE=3'b001, CHK_REQ_RELEASE=3'b010;always@(posedge r_clk or negedge rst_n)
beginif(!rst_n)beginreq_reg1 <= 1'b0;req_reg2 <= 1'b0;endelse beginreq_reg1 <= req;req_reg2 <= req_reg1;endend//
always@(posedge r_clk or negedge rst_n)
beginif(!rst_n)beginre_state <= RE_IDLE;ack <= 1'b0;RE_MEM_Addr <= 1'b0;endelse case(re_state)RE_IDLE:                 //初始化状态beginRE_MEM_Addr <= 0;re_state <= CHK_REQ_ACTIVE;endCHK_REQ_ACTIVE:            //检测发送端的数据发送请求信号beginif(req_reg2 == 1)          //如果有请求信号,接收数据beginre_state <= CHK_REQ_RELEASE;RE_MEM_Addr <= RE_MEM_Addr + 1;RE_MEM[RE_MEM_Addr] <= din;    //接收数据存放到MEMack <= 1'b1;                  //检测到请求信号,发送接收端应答信号endelse re_state <= CHK_REQ_ACTIVE;endCHK_REQ_RELEASE:                    //检测请求信号释放,释放应答信号beginif(req_reg2 == 0)beginack <= 1'b0;                    //释放应答信号,一次握手通信结束re_state <= CHK_REQ_ACTIVE;endelse re_state <= RE_IDLE;enddefault: re_state <= RE_IDLE;endcase
endendmodule

握手机制的verilog实现相关推荐

  1. 全握手机制verilog实现

    全握手机制verilog实现 PART1:基本原理 在不同时钟域之间进行数据传输时,可以考虑使用握手同步机制. 握手同步机制分为半握手和全握手.当从低频时钟域向高频时钟域传输数据时,半握手机制比较适用 ...

  2. 【AXI】解读AXI协议双向握手机制的原理

    解读AXI协议双向握手机制的原理 一.写在前面 二.AXI 双向握手机制简介 2.1 信号列表 2.2 双向握手目的 2.3 握手过程 2.3.1 CASE1(READY信号先于VALID信号改变) ...

  3. 深入AXI4总线- [一] 握手机制

    知乎用户ljgibbs授权转发 本系列我想深入探寻 AXI4 总线.不过事情总是这样,不能我说想深入就深入.当前我对 AXI总线的理解尚谈不上深入.但我希望通过一系列文章,让读者能和我一起深入探寻 A ...

  4. AXI4协议学习:架构、信号定义、工作时序和握手机制

    目录 1 AXI是什么? 2 AXI怎么工作? 3 AXI协议 3.1 架构 3.1.1 通道定义 3.1.2 接口与互连(interconnect) 3.1.3 Register slices 3. ...

  5. 深入 AXI4 总线(一)握手机制

    VALID/READY 握手机制 AXI 总线共有 5 个独立的通道,分别为写地址,写数据,写回应,读地址,读数据通道.5 条通道相互独立,有一些细小的差别,但共同使用一套握手机制:VALID/REA ...

  6. AXI协议(3):AXI架构的握手机制和实现细节

    握手机制 6.1 握手机制概念介绍 以上5条独立的通道(AR,R,AW,W,B)都相互独立,且包含自身通道对应的一个信息信号和一个双路的VALID.READY信号(比如ARVALID/AWREAADY ...

  7. 数字IC验证:总线握手协议(VALID/READY握手机制)

    写在前面: 最近学习总线协议,涉及握手,因此整理本文.若内容有疑惑或错误之处,请在评论区指出,感谢! 文章目录 1 什么是"握手"? 2 VALID/READY握手机制 3 Cas ...

  8. TCP握手机制、TCP长连接和短连接、TCP 保活机制 、心跳机制

    参考: https://www.cnblogs.com/Andya/p/7272462.html 1. TCP连接(3次握手建立连接.4次挥手关闭连接) 当网络通信时采用TCP协议时,在真正的读写操作 ...

  9. HTTPS 工作原理和 TCP 握手机制

    1.HTTPS的工作原理 HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息.TLS/SSL协议不仅仅是一套加密传输的协议,更是 ...

最新文章

  1. QTableWidget控件总结
  2. 4.Python的不堪一击到初学乍练(列表,元组)
  3. 提高Java的锁性能
  4. Linux笔记-grep -v功能相关说明
  5. 2018/12/18 Mac 版 VMWare配置VMNet8 成功版
  6. 车险对方全责理赔要自己垫付吗?
  7. daemonset怎么读_DaemonSet 与 StatefulSet的使用
  8. [原]gimp的python控制台以及python的PIL图像处理库
  9. 数据库sql操作实验报告
  10. vue实现全国省市下拉联动菜单,适用于收货地址
  11. 基于FPGA的DHT11数字温湿度传感器测试
  12. 海思(六)如何在ubuntu20.04上搭建caffe环境
  13. 斑马打印机怎么设置标签纸
  14. 云计算工程师面试题集锦,云计算面试题及答案
  15. javascript+css实现走马灯图片轮播器
  16. mysql 中auto_mysql中的auto_increment
  17. expect 自动输入密码
  18. 游戏手柄计算机,win7系统怎么设置连接手柄 win7电脑连接游戏手柄的方法
  19. 宝塔邮局邮箱设置成功后能发送不能接收问题处理
  20. 老路《用得上的商学课》学习笔记(21-25课)

热门文章

  1. python基础学习笔记13:面向对象的三大特性
  2. vue开发android tv,vue-tv-focusable中文文档
  3. MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)
  4. 芝加哥大学有计算机专业吗,芝加哥大学计算机专业
  5. 利用虚拟机安装并配置Debian Linux系统的总结
  6. 期权新手学习常见问题
  7. Convolutional Radio ModulationRecognition Networks阅读2016
  8. 异步多线程C/S框架gko_pool
  9. Javaweb在线拍卖管理系统买家卖家mysql
  10. BMP文件格式详解(BMP file format)