题意理解:
观察题目给出的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
如果关于此次题单有问题或者反馈意见,欢迎加入牛客用户反馈群沟通~