题意理解:

    观察题目给出的RTL图,主要的器件是两个D触发器,一个与门。D触发器含有异步复位信号,且为低电平有效。data_in输入到D触发器,D触发器的输出Q是前一时刻的data_in,即data_in打一拍得到data_in_reg。与门表示data_out = data_in && !data_in_reg。再通过一个D触发器输出,这样子处理使data_in上升沿出现的时候,data_out保持一个时钟的高电平。由此可见,RTL实现了求data_in上升沿的功能。

解题过程:

    首先对data_in进行缓存。

    always @ (posedge clk or negedge rst_n)

        if (!rst_n)

            data_in_reg <= 1'b0;

        else

            data_in_reg <= data_in;

    然后,将data_in_reg取非,然后和data_in相与后输出作为输出信号有效的条件。

    always @ (posedge clk or negedge rst_n)

        if (!rst_n)

            data_out <= 1'b0;

        else if(data_in && !data_in_reg)

            data_out <= 1'b1;

        else data_out <= 1'b0;

    或者将输出结果打一拍,都可以实现相同的RTL结构,

    always @ (posedge clk or negedge rst_n)

        if (!rst_n)

            data_out <= 1'b0;

        else 

data_out <= data_in && !data_in_reg

仿真结果:

 

可以看到,当data_in出现上升沿时,data_out为1,其余情况下,data_out为0.

 


参考答案
`timescale 1ns/1ns

module RTL(
	input clk,
	input rst_n,
	input data_in,
	output reg data_out
	);
	reg data_in_reg;
	always @ (posedge clk or negedge rst_n)
		if (!rst_n)
			data_in_reg <= 1'b0;
		else 
			data_in_reg <= data_in;
	always @ (posedge clk or negedge rst_n)
		if (!rst_n)
			data_out <= 1'b0;
		else if(data_in && !data_in_reg)
			data_out <= 1'b1;
		else data_out <= 1'b0;
endmodule


如果关于此次题单有问题或者反馈意见,欢迎加入牛客用户反馈群沟通~