You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 lines
1.9 KiB

module zutils_trigger_sig_gen (
input clk, //clock input
input rst_n, //asynchronous reset input, low active
input start_sig,
input stop_sig,
input [31:0] cfg_freq_cnt,
input [31:0] cfg_pluse_cnt,
output reg output_signal
);
reg [31:0] cfg_freq_cnt_cache;
reg [31:0] cfg_pluse_cnt_cache;
reg work_state;
reg [31:0] freq_cnt;
reg [31:0] pluse_cnt;
reg first_start;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cfg_freq_cnt_cache <= 0;
cfg_pluse_cnt_cache <= 0;
work_state <= 0;
work_state <= 0;
freq_cnt <= 0;
pluse_cnt <= 0;
output_signal <= 0;
first_start <= 1;
end else begin
case (work_state)
0: begin
if (start_sig || first_start) begin
work_state <= 1;
cfg_freq_cnt_cache <= cfg_freq_cnt;
cfg_pluse_cnt_cache <= cfg_pluse_cnt_cache;
freq_cnt <= 0;
pluse_cnt <= 0;
output_signal <= 0;
first_start <= 0;
end else begin
output_signal <= 0;
end
end
1: begin
if (!stop_sig) begin
if (freq_cnt >= cfg_freq_cnt_cache) begin
freq_cnt <= 0;
output_signal <= 1;
if (cfg_pluse_cnt_cache != 0) begin
if (pluse_cnt == cfg_pluse_cnt_cache - 1) begin
work_state <= 0;
end else begin
pluse_cnt <= pluse_cnt + 1;
end
end
end else begin
freq_cnt <= freq_cnt + 1;
output_signal <= 0;
end
end else begin
work_state <= 0;
end
end
default: work_state <= 0;
endcase
end
end
endmodule