【牛客】VL60 使用握手信号实现跨时钟域数据传输

题目描述

  分别编写一个数据发送模块和一个数据接收模块,模块的时钟信号分别为clk_a,clk_b。两个时钟的频率不相同。数据发送模块循环发送0-7,在每个数据传输完成之后,间隔5个时钟,发送下一个数据。请在两个模块之间添加必要的握手信号,保证数据传输不丢失。
  模块的接口信号图如下:
在这里插入图片描述

data_req和data_ack的作用说明:
  data_req表示数据请求接受信号。当data_out发出时,该信号拉高,在确认数据被成功接收之前,保持为高,期间data应该保持不变,等待接收端接收数据。
  当数据接收端检测到data_req为高,表示该时刻的信号data有效,保存数据,并拉高data_ack。
  当数据发送端检测到data_ack,表示上一个发送的数据已经被接收。撤销data_req,然后可以改变数据data。等到下次发送时,再一次拉高data_req。

输入描述:
   clk_a:发送端时钟信号
   clk_b:接收端时钟信号
   rst_n:复位信号,低电平有效
   data_ack:数据接收确认信号

输出描述:
   data:发送的数据
   data_req:请求接收数据

自解

`timescale 1ns/1ns
// 20240301
module data_driver(input   clk_a,input   rst_n,input           data_ack,output reg [3:0]data    ,output reg      data_req);initial begindata     = 4'b0;data_req = 1'b0;end/*********  CDC processing start  ***********/reg data_ack_d1_r, data_ack_d2_r;always @(posedge clk_a) begindata_ack_d1_r <= data_ack;data_ack_d2_r <= data_ack_d1_r;end/*********  CDC processing end  *************/reg [1:0] cs = 2'h0, ns;reg [3:0] data_r = 4'd0;reg [2:0]   timeout_cnt_r   = 3'd0;reg         timeout_flag_r  = 1'b0;always @(posedge clk_a, negedge rst_n) beginif (~rst_n) begincs <= 2'h0;end else begincs <= ns;endendalways @(*) begincase (cs)2'h0: beginns = 2'h2;end2'h1: beginif (data_req & data_ack_d2_r) beginns = 2'h2;end else beginns = 2'h1;endend2'h2: beginif (timeout_flag_r) beginns = 2'h1;end else beginns = 2'h2;endenddefault: beginns = 2'h0;endendcaseendalways @(posedge clk_a) begincase (ns)default: begindata_req    <= 1'b0;data        <= 4'd0;data_r      <= 4'd0;end2'h1: begindata_req    <= 1'b1;data        <= data_r;if (data_req & data_ack_d2_r) begindata_r  <= data_r + 4'd1;endend2'h2: begindata_req    <= 1'b0;data        <= data;data_r      <= data_r;endendcase        endalways @(posedge clk_a) begincase (ns)default: begintimeout_cnt_r   <= 3'd0;timeout_flag_r  <= 1'b0;end2'h2: begintimeout_cnt_r   <= timeout_cnt_r + 3'd1;if (timeout_cnt_r == 3'd4) begintimeout_flag_r <= 1'b1;end else begintimeout_flag_r <= 1'b0;endendendcaseendendmodulemodule data_receiver(input clk_b,input rst_n,output reg data_ack,input [3:0] data,input data_req);initial begindata_ack = 1'b0;end/***********  CDC processing start  ************/reg [3:0]   data_d1_r, data_d2_r;reg         data_req_d1_r, data_req_d2_r;always @(posedge clk_b) begindata_d1_r <= data;data_d2_r <= data_d2_r;data_req_d1_r <= data_req;data_req_d2_r <= data_req_d1_r;end/***********  CDC processing end  *************/reg [1:0] cs = 2'h0, ns;always @(posedge clk_b, negedge rst_n) beginif (~rst_n) begincs <= 2'h0;end else begincs <= ns;endendalways @(*) begincase (cs)2'h0: beginns = 2'h1;end2'h1: beginns = 2'h1;enddefault: beginns = 2'h0;endendcaseendalways @(posedge clk_b) begincase (ns)default: begindata_ack <= 1'b0;end2'h1: begindata_ack <= 1'b1;endendcaseendalways @(posedge clk_b) begincase (ns)2'h1: beginif (data_ack & data_req_d2_r) begin// data_d2_r validateendendendcaseendendmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Harbor高可用(haproxy和keepalived)

Harbor高可用&#xff08;haproxy和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;haproxy和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设…

【力扣hot100】刷题笔记Day17

前言 今天竟然不用开组会&#xff01;天大的好消息&#xff0c;安心刷题了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

项目整合管理 -2024年高项第4版(附思维导图)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、项目整合管理概述二、 项目整合管理的目标三、项目整合管理的过程组1.制定项目章程2.制定项目管理计划3. 指导与管理项目工作4.管理项目知识5.监控项目工作…

MyBatis 学习(四)之 SQL 映射文件

目录 1 SQL 映射文件介绍 2 select 元素 3 insert 元素 4 update 和 delete 元素 5 sql 元素 6 parameterType 元素 7 resultType 元素 8 resultMap 元素&#xff08;重要&#xff09; 9 参考文档 1 SQL 映射文件介绍 映射器是 MyBatis 中最复杂并且是最重要的…

逆变器专题(16)-构网型逆变器与跟网型逆变器

相应仿真原件请移步资源下载 现如今&#xff0c;常规的逆变器控制方法主要分为跟网型以及构网型逆变器 跟网型逆变器即常规意义上的并网逆变器&#xff0c;即输出电流直接接入大电网&#xff0c;通常为电流源型逆变器&#xff0c;其输出电流的相位与频率时随着电网电压而随时进…

GitHub Copilot extension activation error: ‘No access to GitHub Copilot found‘

好不容易学生认证通过了&#xff0c;打开vscode用copilot结果一直报这个错误。我的原因是&#xff1a;还未给copilot授权&#xff0c; 通过了学生认证后要进入这里进行授权&#xff1a;

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

抽象类与抽象方法

文章目录 抽象类抽象类的特点 抽象方法抽象方法的特点 模板设计模式模板设计模式能解决的问题示例 #抽象类与抽象方法 抽象类 用abstract关键字来修饰一个类时&#xff0c;这个类就叫抽象类。 public abstract 类名{... }抽象类的特点 1&#xff09;抽象类不能被实例化。 2&…

新闻网站封锁AI爬虫 AI与新闻媒体博弈继续

随着ChatGPT等新兴AI模型的兴起&#xff0c;它们所依赖的网络爬虫正面临来自全球主流新闻网站的大规模封锁。Richard Fletcher博士团队对十个国家主流新闻网站的统计发现&#xff0c;到2023年底&#xff0c;48%的网站屏蔽了OpenAI的爬虫&#xff0c;24%屏蔽了Google的爬虫。那么…

批量自动加好友神器!微信快速扩友秘籍!

对于一些个人或者企业来说&#xff0c;传统的人工添加好友方式往往会出现效率低下&#xff0c;费时费力的问题。那么&#xff0c;有没有一种快速、便捷、安全的方式来解决这个问题呢&#xff1f;答案当然是肯定的&#xff0c;那就是通过使用微信管理系统来解决这一问题。 在微…

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在&#xff0c;避免从数据库中查询数据是否存在&#xff0c;减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数&#xff0c;可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时&#xff0c;布隆过滤器会…

收银系统源码-智慧新零售,ERP进销存功能详解

智慧新零售是一套线下线上一体化的收银系统&#xff0c;不仅给门店线下提供了多样化的收款方式&#xff0c;还提供了和线下深度打通的线上小程序商城。有线下又有线上自然需要一套完整的进销存模块能高效的管理商品。 智慧新零售进销存功能涵盖了商品的采购、销售、调拨、盘点…