最近看了握手机制的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 握手机制学习记录相关推荐

  1. Alarm机制-学习记录

    整理自<第一行代码> 由于手机的休眠策略,Android会在长时间不操作的情况下自动让CPU进入到睡眠状态. Alrarm具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时 ...

  2. Attention机制学习记录(四)之Transformer

    前言 注意力(Attention)机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或 ...

  3. 【Python学习记录】Numpy广播机制(broadcast)

    ✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Python学习记录 文章目录 一.什么是Numpy广播机制 二.Numpy广播应用 三.Numpy广播规则 一.什么是Numpy广播机制 在Numpy. ...

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

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

  5. AMBA总线协议之AHB学习记录(1)—ahb_bus(附verilog代码)

    目录 0.前言 1.AHB简介 2.ahb_bus实现(verilog) 3.总结反思 & 后面学习计划 0.前言 前段时间粗略过了一下riscv指令集相关内容,并对开源项目tinyriscv ...

  6. 全握手机制verilog实现

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

  7. 关于ATIS以及基于注意力机制的递归神经网络模型 的学习记录

    关于ATIS以及基于注意力机制的递归神经网络模型 的学习记录 此为本人学习的类笔记,主要内容为借助Google翻译机译的论文WHAT IS LEFT TO BE UNDERSTOOD IN ATIS? ...

  8. 【FPGA Verilog】如何捕获信号Posedge和Negedge?学习记录

    这是一个学习记录: Posedge: 在clk时钟上升沿对信号signal打两拍: signal_1和signal_2,然后将第二拍取反和第一拍相与 && module get_pos ...

  9. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  10. 《SysML精粹》学习记录--第六章

    <SysML精粹>学习记录 第六章:活动图 活动图简介 活动图外框 活动图的关键元素   动作   对象节点   边   动作详述   控制节点 活动分区 小结 第六章:活动图 活动图简介 ...

最新文章

  1. 中国移动雄安研究院 2020校园招聘笔试JAVA方向(二)
  2. 操作系统的中断和异常
  3. 前端学习(1293):系统模块path路径操作
  4. 怎么用python进行回归预测_使用Python训练回归模型并进行预测
  5. 行政区域村级划分数据库_最新行政区划代码省市区三级 乡镇街道四级 村五级 数据库(2020年11月版 )...
  6. python中的单例模式_Python单例模式
  7. oracle数据库等级,[数据库]Oracle数据库建表并用SQL编程分等级
  8. ubuntu命令查询版本和内核版本
  9. OSPF基础内容与网络类型实验
  10. Lanproxy任意文件读取漏洞复现(CVE-2021-3019)
  11. 马士兵Java自学之路
  12. 在xml添加红色的星号android,在文本输入框中输入编辑文本(红色星号)的必填符号...
  13. 源支付源码三网免挂带云端协议源码搭建
  14. html设置word页脚,Word页码从任意页开始如何设置?
  15. win7家庭版升级win7旗舰版
  16. antv,图表和地图
  17. python和java就业对比_Python,Java和JavaScript哪个更容易就业?
  18. java程序设计之炮打飞机
  19. ftp 工具 绿色,这6款ftp 工具 绿色是站长们不可或缺的必备工具
  20. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之 Response Selection

热门文章

  1. 警惕!!类似的QQ诈骗手段层出不穷
  2. 在使用tr的时候经常遇到的错误1
  3. 2015中考计算机考试时间,2015年中考考试科目安排
  4. 华为手机摄影入门到精通pdf_华为手机摄影从入门到精通
  5. 3DMark2001 SE + 汉化包 下载
  6. ICommand、ITool中调用要素闪烁/定位的方法
  7. #CSDN软件工程师能力认证学习精选# NoSql是什么?
  8. 学习costmap代价地图
  9. LeetCode - 1175 - 质数排列(prime-arrangements)
  10. android格式化SD卡,获取其它程序的缓存大小,清理数据