「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

相关推荐

  1. 使用什么实现的?

    2023-12-23 02:52:02       65 阅读
  2. 时钟学习记录(二)——XPM_CDC

    2023-12-23 02:52:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-23 02:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-23 02:52:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-23 02:52:02       82 阅读
  4. Python语言-面向对象

    2023-12-23 02:52:02       91 阅读

热门阅读

  1. 【大数据面试】Kafka面试题与答案

    2023-12-23 02:52:02       56 阅读
  2. GO设计模式——19、中介者模式(行为型)

    2023-12-23 02:52:02       73 阅读
  3. Centos 7.6 gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)

    2023-12-23 02:52:02       54 阅读
  4. TypeScript 常见配置项

    2023-12-23 02:52:02       70 阅读
  5. python异常之try/else分句

    2023-12-23 02:52:02       57 阅读
  6. EASYEXCEL导出表格(有标题、单元格合并)

    2023-12-23 02:52:02       53 阅读
  7. 信息学奥赛一本通 2068:【例2.6】鸡兔同笼

    2023-12-23 02:52:02       70 阅读
  8. 详解Qt的底层实现机制

    2023-12-23 02:52:02       53 阅读
  9. Pandas实践_分类数据

    2023-12-23 02:52:02       43 阅读
  10. 基于NSGA2算法求解多目标优化问题的Matlab代码

    2023-12-23 02:52:02       60 阅读