题解 | #使用握手信号实现跨时钟域数据传输#

使用握手信号实现跨时钟域数据传输

https://www.nowcoder.com/practice/2bf1b28a4e634d1ba447d3495134baac

`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_r1,data_ack_r2;
always @(posedge clk_a or negedge rst_n) begin
	if (!rst_n) begin
		data_ack_r1 <= 'b0;
		data_ack_r2 <= 'b0;
	end
	else begin
		data_ack_r1 <= data_ack;
		data_ack_r2 <= data_ack_r1;
	end
end
always @(posedge clk_a or negedge rst_n) begin
	if (!rst_n) begin
		data <= 'b0;
	end
	else if (data_ack_r1 && !data_ack_r2)begin
		data <= data + 'd1;
	end
end

//同时在data_ack有效之后,开始计数五个时钟,之后发送新的数据,也就是再一次拉高data_req.
reg [2:0] cnt;
always @(posedge clk_a or negedge rst_n) begin
	if (!rst_n) begin
		cnt <= 'd0;
	end
	else if (data_ack_r1 && !data_ack_r2) begin
		cnt <= 'd0;
	end
	else if (data_req)begin
		cnt <= cnt;
	end
	else begin
		cnt <= cnt +'d1;
	end
end

always @(posedge clk_a or negedge rst_n) begin
	if (!rst_n) begin
		data_req <= 'b0;
	end
	else if (cnt == 'd4) begin
		data_req <= 'b1;
	end
	else if (data_ack_r1 && !data_ack_r2)begin
		data_req <= 'b0;
	end
end
endmodule

module data_receiver(
	input clk_b,
	input rst_n,
	input data_req,
	input [3:0] data,
	output reg data_ack
);

reg data_req_r1,data_req_r2;
always @(posedge clk_b or negedge rst_n) begin
	if (!rst_n) begin
		data_req_r1 <= 'b0;
		data_req_r2 <= 'b0;
	end
	else begin
		data_req_r1 <= data_req;
		data_req_r2 <= data_req_r1;
	end
end
reg [2:0] data_o;
always @(posedge clk_b or negedge rst_n) begin
	if (!rst_n) begin
		data_o <= 'b0;
		data_ack <= 'b0;
	end
	else if (data_req_r1 && !data_req_r2 )begin
		data_o <= data;
		data_ack <= 'b1;
	end
	else begin
		data_ack <= 'd0;
		data_o <= data_o;
	end
end

endmodule

关键点在于data信号和控制信号是分开变化考虑的,而不是同时变化。

可以这样想,如果控制信号和data信号的变化趋势相同,那么就不需要使用控制信号来指示了。

全部评论
还有就是打拍之后使用边沿进行判断,这样发送一个数据其实需要6个cycle
点赞 回复 分享
发布于 2024-10-10 13:25 北京

相关推荐

看牛客上感觉牛油都是985/211硕,本科生都很少见呀。现在秋招有佬拿到offer了嘛
职场水母:大多数本科生都在急着谈恋爱吧,能上牛客的少之又少,倒是硕士在这里有很多,这部分人群走的路及其相似,当年都选择了考研,到现在找工作都喜欢上牛客,不得不说还是挺有远见的大家。大家都是有远见的牛马
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务