HDLBbits Edgecapture
题目描述
对于32位向量中的每一位,当输入信号从一个时钟周期的1变化到下一个时钟周期的0时捕获(捕捉下降沿),“捕获”意味着输出将保持1直到被reset(同步重置)。
1.输出位应该在发生1到0转换后的周期被设置(为1)。
2.当复位为1时,输出位应该在正时钟边缘复位(为0)。
3.如果上述两个事件同时发生,则reset具有优先级。
在下面示例波形的最后4个周期中,“reset”事件比“set”事件早一个周期发生,因此这里不存在冲突。
正确结果
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] temp_in;
always @(posedge clk) begin
temp_in <= in;
if(reset)
out <=32'b0;
else
out <= temp_in & ~in |out;
end
endmodule
之前的错误结果
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] temp_in;
always @(posedge clk) begin
if(reset)
out <=32'b0;
else
temp_in <= in;
out <= temp_in & ~in |out;
end
endmodule
其实只是把temp_in <= in这句挪到了下面的else语句中,但由于always语句块里都是并行执行,会导致输出时产生时钟不匹配的问题。