module flip_flop (
input wire sys_clk ,
input wire rst_n ,
input wire data_in ,
output reg data_out
);
// 时序逻辑 异步复位 data_out
always @(posedge sys_clk or negedge rst_n) begin
if(~rst_n) begin
data_out <= 1'b0 ;
end else begin
data_out <= data_in ;
end
end
// // 时序逻辑 同步复位
// always @(posedge sys_clk) begin
// if(~rst_n) begin
// data_out <= 1'b0 ;
// end else begin
// data_out <= data_in ;
// end
// end
endmodule
`timescale 1ns/1ps
module test ();
reg sys_clk_tb ;
reg rst_n_tb ;
reg data_in_tb ;
wire data_out_tb ;
flip_flop flip_flop_insert (
.sys_clk ( sys_clk_tb ) ,
.rst_n ( rst_n_tb ) ,
.data_in ( data_in_tb ) ,
.data_out ( data_out_tb )
);
parameter CYCLE = 20 ;
initial begin
sys_clk_tb = 1'b1 ;
rst_n_tb <= 1'b0 ;
data_in_tb <= 1'b0 ;
#(20) ;
rst_n_tb <= 1'b1 ;
#(210) ;
rst_n_tb <= 1'b0 ;
#(40) ;
rst_n_tb <= 1'b1 ;
#( CYCLE * 1000 ) ;
$stop ;
end
always #( CYCLE / 2 ) sys_clk_tb = ~sys_clk_tb ;
always #( CYCLE + 2 ) data_in_tb = ($random) % 2 ;
endmodule