「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
相关推荐
请你喝好果汁6415 分钟前
Conda_bashrc 初始化机制学习笔记
笔记·学习·conda
maxruan1 小时前
PyTorch学习
人工智能·pytorch·python·学习
MYX_3091 小时前
第三章 线型神经网络
深度学习·神经网络·学习·算法
_李小白1 小时前
【Android Gradle学习笔记】第八天:NDK的使用
android·笔记·学习
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 遍历 笔记40
spring boot·笔记·thymeleaf
Jose_lz3 小时前
C#开发学习杂笔(更新中)
开发语言·学习·c#
Chloeis Syntax3 小时前
接10月12日---队列笔记
java·数据结构·笔记·队列
QT 小鲜肉3 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
A9better3 小时前
嵌入式开发学习日志41——stm32之SPI总线基本结构
stm32·单片机·嵌入式硬件·学习