verilog 握手机制学习记录
最近看了握手机制的verilog实验方式,对全握手半握手有了初步的理解,但是还有很多疑问:
我学习的来源是《verilog 数字系统设计技术与实例分析》、全握手机制verilog实现_数字小白的博客-CSDN博客_握手机制。
疑问1 :我认为握手的模块想一个adapter 放在两个需要同步数据,但是时钟域不同的模块之间,两个模块一个接收数据,一个发送数据,那么握手的模块应该receiver端连接发送数据模块,transmitter端连接接收数据模块,但是书中相反。
疑问2:有些信号要在时钟下降沿输出,但是我认为上升沿输出也没问题。
因此我写了我理解中的verilog 全握手代码:
变量名 |
IO |
描述 |
所在时钟域 |
rclk |
I |
时钟域 |
r |
rdata |
I |
rclk域前信号 |
r |
rready |
I |
信号有效 |
r |
tclk |
I |
时钟域 |
t |
tdata |
O |
tclk域信号 |
t |
tready |
O |
信号有效 |
t |
en |
O |
转换工作状态 |
r |
rrst_n |
I |
异步复位 |
r |
trst_n |
I |
异步复位 |
t |
在en为0时,拉高rready,保持一个rclk周期,完成rclk域信号输入,模块进入工作,状态en拉高,经过同步后在tdata端输出,同时拉高tready信号保持一个tclk周期,完信号跨时钟域传输后,en拉低。
module handshake
(
input wire rclk ,
input wire[7:0] rdata ,
input wire rready ,
input wire tclk ,
output reg [7:0] tdata ,
output reg tready ,
output reg en ,
input wire rrst_n ,
input wire trst_n
);
reg [7:0] rdata_sd ;
reg [7:0] rdata_sd_1 ;
reg rready_sd;
reg rready_sd_1 ;reg [7:0]rdata_sd_2 ;
reg rready_sd_2 ;
reg tready_sd ;
reg tready_sd_1 ;
reg tready_sd_2 ;reg en_next ;
reg rready_sd_next ;
reg [7:0]rdata_sd_next ;
reg tready_sd_1_next ;
reg tready_sd_2_next ;reg rready_sd_1_next ;
reg rready_sd_2_next ;
reg [7:0]rdata_sd_1_next ;
reg [7:0]rdata_sd_2_next ;
reg tready_next ;
reg [7:0]tdata_next ;
reg tready_sd_next ;always@*beginrready_sd_1_next = rready_sd;rready_sd_2_next = rready_sd_1;rdata_sd_1_next[7:0]= rdata_sd[7:0];rdata_sd_2_next[7:0]= rdata_sd_1[7:0];tready_sd_1_next = tready_sd;tready_sd_2_next = tready_sd_1;en_next = en;rready_sd_next = rready_sd;rdata_sd_next[7:0] = rdata_sd[7:0];tready_next = tready;tdata_next[7:0] = tdata[7:0];tready_sd_next = tready_sd;if((~en)&&rready)beginen_next= 1'b1;rdata_sd_next[7:0]= rdata[7:0];rready_sd_next = 1'b1;endif((~tready_sd)&&(rready_sd_2))begintready_next= 1'b1;tdata_next= rdata_sd_2;tready_sd_next= 1'b1;endif(tready)begintready_next = 1'b0; endif((tready_sd_2)&&(rready_sd))beginrready_sd_next= 1'b0;endif((tready_sd)&&(~rready_sd_2))tready_sd_next= 1'b0;if(en&&(~tready_sd_2)&&(~rready_sd))en_next= 1'b0;endalways@(posedge rclk or negedge rrst_n)if(~rrst_n)beginen <= 1'b0 ;rready_sd <= 1'b0 ;rdata_sd[7:0] <= 8'b0 ;tready_sd_1 <= 1'b0 ;tready_sd_2 <= 1'b0 ;end else beginen <= en_next ;rready_sd <= rready_sd_next ;rdata_sd[7:0] <= rdata_sd_next[7:0] ;tready_sd_1 <= tready_sd_1_next ;tready_sd_2 <= tready_sd_2_next ;endalways@(posedge tclk or negedge trst_n)if(~trst_n)beginrready_sd_1 <= 1'b0 ;rready_sd_2 <= 1'b0 ;rdata_sd_1[7:0] <= 8'b0 ;rdata_sd_2[7:0] <= 8'b0 ;tready <= 1'b0 ;tdata[7:0] <= 8'b0 ;tready_sd <= 1'b0;end else beginrready_sd_1 <= rready_sd_1_next ;rready_sd_2 <= rready_sd_2_next ;rdata_sd_1[7:0] <= rdata_sd_1_next[7:0] ;rdata_sd_2[7:0] <= rdata_sd_2_next[7:0] ;tready <= tready_next ;tdata[7:0] <= tdata_next[7:0] ;tready_sd <= tready_sd_next;end
endmodule
`timescale 1ns/1ns
module tb_handshake();
reg rclk ;
reg [7:0] rdata ;
reg rready ;
reg tclk ;
wire [7:0] tdata;
wire tready ;
wire en ;
reg rrst_n ;
reg trst_n ;initial beginrrst_n <= 1'b0 ;trst_n <= 1'b0 ;rclk<=1'b1;tclk<= 1'b1;rdata<= 8'b0;rready<= 1'b0;#10;rrst_n<= 1'b1;
#3;trst_n<= 1'b1;
#27;rdata<= 8'b1000_0010;rready<= 1'b1;
#20;rready<= 1'b0;rdata<= 8'b0;end
always#10 rclk= ~rclk;
always#13 tclk=~tclk;handshake handshanke_inst
(
.rclk (rclk ),
.rdata (rdata ),
.rready (rready ),
.tclk (tclk ),
.tdata (tdata ),
.tready (tready ),
.en (en ),
.rrst_n (rrst_n ),
.trst_n (trst_n )
);
endmodule
疑问3:如何解决需要两个复位信号的问题?同步复位在两个时钟域中,两个时钟域肯定会有时间差,异步复位要求同步释放,在同步释放上面需要做点文章,下面是我的复位的方法:
module rst
(
input wire tclk ,
input wire rrst_n ,
output reg trst_n
);
always@(negedge rrst_n or posedge tclk)if(~rrst_n)trst_n <= 1'b0;else trst_n<= 1'b1;
endmodule
verilog 握手机制学习记录相关推荐
- Alarm机制-学习记录
整理自<第一行代码> 由于手机的休眠策略,Android会在长时间不操作的情况下自动让CPU进入到睡眠状态. Alrarm具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时 ...
- Attention机制学习记录(四)之Transformer
前言 注意力(Attention)机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或 ...
- 【Python学习记录】Numpy广播机制(broadcast)
✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Python学习记录 文章目录 一.什么是Numpy广播机制 二.Numpy广播应用 三.Numpy广播规则 一.什么是Numpy广播机制 在Numpy. ...
- AXI4协议学习:架构、信号定义、工作时序和握手机制
目录 1 AXI是什么? 2 AXI怎么工作? 3 AXI协议 3.1 架构 3.1.1 通道定义 3.1.2 接口与互连(interconnect) 3.1.3 Register slices 3. ...
- AMBA总线协议之AHB学习记录(1)—ahb_bus(附verilog代码)
目录 0.前言 1.AHB简介 2.ahb_bus实现(verilog) 3.总结反思 & 后面学习计划 0.前言 前段时间粗略过了一下riscv指令集相关内容,并对开源项目tinyriscv ...
- 全握手机制verilog实现
全握手机制verilog实现 PART1:基本原理 在不同时钟域之间进行数据传输时,可以考虑使用握手同步机制. 握手同步机制分为半握手和全握手.当从低频时钟域向高频时钟域传输数据时,半握手机制比较适用 ...
- 关于ATIS以及基于注意力机制的递归神经网络模型 的学习记录
关于ATIS以及基于注意力机制的递归神经网络模型 的学习记录 此为本人学习的类笔记,主要内容为借助Google翻译机译的论文WHAT IS LEFT TO BE UNDERSTOOD IN ATIS? ...
- 【FPGA Verilog】如何捕获信号Posedge和Negedge?学习记录
这是一个学习记录: Posedge: 在clk时钟上升沿对信号signal打两拍: signal_1和signal_2,然后将第二拍取反和第一拍相与 && module get_pos ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- 《SysML精粹》学习记录--第六章
<SysML精粹>学习记录 第六章:活动图 活动图简介 活动图外框 活动图的关键元素 动作 对象节点 边 动作详述 控制节点 活动分区 小结 第六章:活动图 活动图简介 ...
最新文章
- 中国移动雄安研究院 2020校园招聘笔试JAVA方向(二)
- 操作系统的中断和异常
- 前端学习(1293):系统模块path路径操作
- 怎么用python进行回归预测_使用Python训练回归模型并进行预测
- 行政区域村级划分数据库_最新行政区划代码省市区三级 乡镇街道四级 村五级 数据库(2020年11月版 )...
- python中的单例模式_Python单例模式
- oracle数据库等级,[数据库]Oracle数据库建表并用SQL编程分等级
- ubuntu命令查询版本和内核版本
- OSPF基础内容与网络类型实验
- Lanproxy任意文件读取漏洞复现(CVE-2021-3019)
- 马士兵Java自学之路
- 在xml添加红色的星号android,在文本输入框中输入编辑文本(红色星号)的必填符号...
- 源支付源码三网免挂带云端协议源码搭建
- html设置word页脚,Word页码从任意页开始如何设置?
- win7家庭版升级win7旗舰版
- antv,图表和地图
- python和java就业对比_Python,Java和JavaScript哪个更容易就业?
- java程序设计之炮打飞机
- ftp 工具 绿色,这6款ftp 工具 绿色是站长们不可或缺的必备工具
- Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之 Response Selection