握手机制的verilog实现
保持寄存器+握手
“一种解决总线同步问题的方法是使用一个保持寄存器和握手信号”,这也就是“先异步暂存,后同步写入”的方法
分别编写了发送时钟域和接收时钟域的代码进行测试,用到两组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实现相关推荐
- 全握手机制verilog实现
全握手机制verilog实现 PART1:基本原理 在不同时钟域之间进行数据传输时,可以考虑使用握手同步机制. 握手同步机制分为半握手和全握手.当从低频时钟域向高频时钟域传输数据时,半握手机制比较适用 ...
- 【AXI】解读AXI协议双向握手机制的原理
解读AXI协议双向握手机制的原理 一.写在前面 二.AXI 双向握手机制简介 2.1 信号列表 2.2 双向握手目的 2.3 握手过程 2.3.1 CASE1(READY信号先于VALID信号改变) ...
- 深入AXI4总线- [一] 握手机制
知乎用户ljgibbs授权转发 本系列我想深入探寻 AXI4 总线.不过事情总是这样,不能我说想深入就深入.当前我对 AXI总线的理解尚谈不上深入.但我希望通过一系列文章,让读者能和我一起深入探寻 A ...
- AXI4协议学习:架构、信号定义、工作时序和握手机制
目录 1 AXI是什么? 2 AXI怎么工作? 3 AXI协议 3.1 架构 3.1.1 通道定义 3.1.2 接口与互连(interconnect) 3.1.3 Register slices 3. ...
- 深入 AXI4 总线(一)握手机制
VALID/READY 握手机制 AXI 总线共有 5 个独立的通道,分别为写地址,写数据,写回应,读地址,读数据通道.5 条通道相互独立,有一些细小的差别,但共同使用一套握手机制:VALID/REA ...
- AXI协议(3):AXI架构的握手机制和实现细节
握手机制 6.1 握手机制概念介绍 以上5条独立的通道(AR,R,AW,W,B)都相互独立,且包含自身通道对应的一个信息信号和一个双路的VALID.READY信号(比如ARVALID/AWREAADY ...
- 数字IC验证:总线握手协议(VALID/READY握手机制)
写在前面: 最近学习总线协议,涉及握手,因此整理本文.若内容有疑惑或错误之处,请在评论区指出,感谢! 文章目录 1 什么是"握手"? 2 VALID/READY握手机制 3 Cas ...
- TCP握手机制、TCP长连接和短连接、TCP 保活机制 、心跳机制
参考: https://www.cnblogs.com/Andya/p/7272462.html 1. TCP连接(3次握手建立连接.4次挥手关闭连接) 当网络通信时采用TCP协议时,在真正的读写操作 ...
- HTTPS 工作原理和 TCP 握手机制
1.HTTPS的工作原理 HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息.TLS/SSL协议不仅仅是一套加密传输的协议,更是 ...
最新文章
- QTableWidget控件总结
- 4.Python的不堪一击到初学乍练(列表,元组)
- 提高Java的锁性能
- Linux笔记-grep -v功能相关说明
- 2018/12/18 Mac 版 VMWare配置VMNet8 成功版
- 车险对方全责理赔要自己垫付吗?
- daemonset怎么读_DaemonSet 与 StatefulSet的使用
- [原]gimp的python控制台以及python的PIL图像处理库
- 数据库sql操作实验报告
- vue实现全国省市下拉联动菜单,适用于收货地址
- 基于FPGA的DHT11数字温湿度传感器测试
- 海思(六)如何在ubuntu20.04上搭建caffe环境
- 斑马打印机怎么设置标签纸
- 云计算工程师面试题集锦,云计算面试题及答案
- javascript+css实现走马灯图片轮播器
- mysql 中auto_mysql中的auto_increment
- expect 自动输入密码
- 游戏手柄计算机,win7系统怎么设置连接手柄 win7电脑连接游戏手柄的方法
- 宝塔邮局邮箱设置成功后能发送不能接收问题处理
- 老路《用得上的商学课》学习笔记(21-25课)
热门文章
- python基础学习笔记13:面向对象的三大特性
- vue开发android tv,vue-tv-focusable中文文档
- MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)
- 芝加哥大学有计算机专业吗,芝加哥大学计算机专业
- 利用虚拟机安装并配置Debian Linux系统的总结
- 期权新手学习常见问题
- Convolutional Radio ModulationRecognition Networks阅读2016
- 异步多线程C/S框架gko_pool
- Javaweb在线拍卖管理系统买家卖家mysql
- BMP文件格式详解(BMP file format)