「Verilog学习笔记」使用握手信号实现跨时钟域数据传输

专栏前言

本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

复制代码
`timescale 1ns/1ns
module data_driver(
	input clk_a,
	input rst_n,
	input data_ack,
	output reg [3:0]data,
	output reg data_req
	);

	reg data_ack_reg_1, data_ack_reg_2 ; 
	reg [9:0] cnt ; 

	always @ (posedge clk_a or negedge rst_n) begin 
		if (~rst_n) begin 
			data_ack_reg_1 <= 0 ;
			data_ack_reg_2 <= 0 ; 
		end
		else begin 
			data_ack_reg_1 <= data_ack ; 
			data_ack_reg_2 <= data_ack_reg_1 ;
		end
	end

	always @ (posedge clk_a or negedge rst_n) begin 
		if (~rst_n) data <= 0 ; 
		else if (data_ack_reg_1 && !data_ack_reg_2) data <= data + 1 ; 
		else data <= data ; 
	end

	always @ (posedge clk_a or negedge rst_n) begin 
		if (~rst_n) cnt <= 0 ; 
		else if (data_ack_reg_1 && !data_ack_reg_2) cnt <= 0 ; 
		else if (data_req) cnt <= cnt ; 
		else cnt <= cnt + 1 ;
	end

	always @ (posedge clk_a or negedge rst_n) begin 
		if (~rst_n) data_req <= 0 ; 
		else if (cnt == 4) data_req <= 1 ; 
		else if (data_ack_reg_1 && !data_ack_reg_2) data_req <= 0 ; 
		else data_req <= data_req ; 
	end

endmodule

module data_receiver (
	input clk_b, 
	input rst_n,
	input data_req,
	input [3:0] data,
	output reg data_ack
);
	reg [3:0] data_in_reg ; 
	reg data_req_reg_1, data_req_reg_2 ; 
	always @ (posedge clk_b or negedge rst_n) begin 
		if (~rst_n) begin 
			data_req_reg_1 <= 0 ;
			data_req_reg_2 <= 0 ; 
		end
		else begin
			data_req_reg_1 <= data_req ; 
			data_req_reg_2 <= data_req_reg_1 ; 
		end
	end

	always @ (posedge clk_b or negedge rst_n) begin 
		if (~rst_n) data_ack <= 0 ;
		else if (data_req_reg_1) data_ack <= 1 ; 
		else data_ack <= 0 ;
	end

	always @ (posedge clk_b or negedge rst_n) begin 
		if (~rst_n) data_in_reg <= 0 ; 
		else if (data_req_reg_1 && !data_req_reg_2) data_in_reg <= data ; 
		else data_in_reg <= data_in_reg ;
	end

endmodule
相关推荐
叶小鸡2 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
我的xiaodoujiao3 小时前
API 接口自动化测试详细图文教程学习系列16--项目实战演练3
python·学习·测试工具·pytest
复利人生 复利日知录 赋能循环3 小时前
2026年复利精进:我的每日觉醒与成长密码
学习·思维模型·知识复利·复利·独立
尤老师FPGA3 小时前
HDMI数据的接收发送实验(十)
fpga开发
sakiko_4 小时前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
晓梦林4 小时前
MAZESEC-X1靶场学习笔记
笔记·学习
逻辑诗篇5 小时前
破核拆解:PCIE719——基于Xilinx Zynq UltraScale+的高性能SAS扩展卡设计
fpga开发·架构
我的xiaodoujiao5 小时前
API 接口自动化测试详细图文教程学习系列15--项目实战演练2
python·学习·测试工具·pytest
TImCheng06095 小时前
职场人AI学习周期评估:不同学习路径的时间成本
人工智能·学习
周末也要写八哥5 小时前
C4D/Cinema 4D 2026超详细下载与安装教程(附资源包)
学习·数学建模