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

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

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 [2:0] cnt;
	reg data_ack_r1,data_ack_r2;

	always @(posedge clk_a or negedge rst_n) begin
		if(rst_n == 1'b0)begin
			data_ack_r1 <= 1'b0;
			data_ack_r2 <= 1'b0;
		end
		else
			data_ack_r1 <= data_ack;
			data_ack_r2 <= data_ack_r1;
	end

	always @(posedge clk_a or negedge rst_n) begin
		if(rst_n == 1'b0)
			data_req <= 1'b0;
		else if(cnt == 'd4)
			data_req <= 1'b1;
		else if(data_ack_r1 & !data_ack_r2)
			data_req <= 1'b0; //我的貌似延迟一拍,没有对齐
		else
			data_req <= data_req;
	end

	always @(posedge clk_a or negedge rst_n) begin
		if(rst_n == 1'b0)
			data <= 4'd0;
		else if(data_ack_r1 & !data_ack_r2)begin
			if(data == 'd7)
				data <= 'd0;
			else
				data <= data + 1'b1;
		end
		else
			data <= data;
	end

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

endmodule

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

);

reg data_req_r1,data_req_r2;
reg [3:0] data_r;

always @(posedge clk_b or negedge rst_n) begin
		if(rst_n == 1'b0)begin
			data_req_r1 <= 1'b0;
			data_req_r2 <= 1'b0;
		end
		else
			data_req_r1 <= data_req;
			data_req_r2 <= data_req_r1;
	end

always @(posedge clk_b or negedge rst_n) begin
	if(rst_n == 1'b0)
		data_ack <= 1'b0;
	else if(data_req_r1 & !data_req_r2)
		data_ack <= 1'b1;
	else if(!data_req_r1 & data_req_r2)
		data_ack <= 1'b0;
	else
	    data_ack <= data_ack;
end

always @(posedge clk_b or negedge rst_n) begin
	if(rst_n == 1'b0)
		data_r <= 4'd0;
	else if(data_req_r1 & !data_req_r2)
		data_r <= data;
	else
	   data_r <= data_r;
end

endmodule

全部评论

相关推荐

03-22 14:51
已编辑
复旦大学 前端工程师
之前做过的项目都是和前端有关的,本人也比较喜欢设计和所见即所得的编程体验。css&nbsp;学的比较好,Vue,&nbsp;html,&nbsp;网络属于还凑合能应付面试,但是&nbsp;js&nbsp;没有系统学过,现在在暑期实习面试中狠狠被拷打。现在大三,后续考虑出国读研,感觉现在&nbsp;all&nbsp;in&nbsp;前端是不是有点把路走窄了?求广大牛友指路btw:两周可以把&nbsp;js&nbsp;学好莫?能过笔试面试的水平(差不多用两周的1/3的时间)
股真人:1. 朋友,你bg fdu,而且可以读美研,这个平台绝大多数人的认知指导不了你,在这里问能得到什么呢?(而且光看你提的这个问题,无法让人看出你是fdu这个水平的学生)2. 如果是确认了喜欢前端,那么就all in;如果只是有点感兴趣,那找个实习来玩玩,让自己认识更清楚;如果是畏难心理选的,那只能说思维方式有问题。3. 强调自己是女生是什么意思?自己看不起自己?你要去的美国认可这种文化吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务