verilog中的32位下降沿检测
今天在刷HDL bits的时候刷到一道题,记录一下学习过程。
题目:
对于32位向量中的每一位,当输入信号从一个时钟周期的1变为下一个时钟周期的0时进行捕获。“捕获”意味着输出将保持1,直到寄存器被重置(同步置位)。
每个输出位的行为类似于SR触发器:在发生1到0的转换之后,应该将输出位设置为1。当复位reset高的时候,输出位应该在时钟上升沿复位(到0)。如果上述两个事件同时发生,则置位reset具有优先级。在下面的示例波形的最后4个周期中,“reset”事件比“set”事件早发生一个周期,因此这里不存在冲突。
提供两种解决办法:
方法一
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] temp;
wire [31:0] capture;
always @(posedge clk) begin
temp <= in;
end
assign capture = ~in & temp;
always @(posedge clk) begin
if (reset)
out <= 32'b0;
else
begin
for (int i=0; i<32; i=i+1)
begin
if(capture[i] == 1'b1)
out[i] <= 1'b1;
end
end
end
endmodule
方法二
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] in_reg;
always@(posedge clk)begin
in_reg <= in;
end
always@(posedge clk)begin
if(reset)begin
out <= 32'd0;
end
else begin
out <= (~in & in_reg) | out;
end
end
endmodule