/*异步复位同步释放:在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步
同步复位:复位信号只有在时钟上升沿到来时,才能有效 (增加fpga内部的资源消耗,降低亚稳态出现的概率)
异步复位:无论时钟是否到来:只要复位信号有效,就对信号进行复位(存在隐患,会产生不定态)*/
module reset_clk( input clk, input rst_n, input data_a, input data_b, output out_a, output out_b ); reg reg1,reg2; reg reg3,reg4; wire reset_n; assign out_a=reg1; assign out_b=reg2; assign reset_n=reg4; //生成同步复位输出reset_n,reset_n作为第二个模块的异步复位 always@(posedge clk or negedge rst_n) if(!rst_n) begin reg3<=0; reg4<=0; end else begin reg3<=1; reg4<=reg3; end //将同步的复位当异步复位使用 always@(posedge clk or negedge reset_n) if(!reset_n) begin reg1<=0; reg2<=0; end else begin reg1<=data_a; reg2<=data_b; end endmodule
`timescale 1ns/1ns module reset_clk_tb; reg clk; reg rst_n; reg data_a; reg data_b; wire out_a; wire out_b; initial begin clk=0; rst_n=0; data_a=1; data_b=0; #100.4; rst_n=1; #100 ; #10; rst_n=0; #10; #100 data_a=1;data_b=0; #100 data_a=0;data_b=1; rst_n=1; #100 data_a=0;data_b=0; end always #10 clk=~clk; reset_clk reset_clk( .clk(clk), .rst_n(rst_n), .data_a(data_a), .data_b(data_b), .out_a(out_a), .out_b(out_b) ); endmodule
异步复位同步释放
最新推荐文章于 2024-06-07 16:17:18 发布