forked from p_lusterinc_xsync/xsync_fpge
4 changed files with 327 additions and 73 deletions
-
96led_test.pds
-
251source/src/business/record_sig_generator.v
-
4source/src/output/camera_sync_signal_output.v
-
49source/src/top.v
@ -0,0 +1,251 @@ |
|||||
|
module record_sig_generator #( |
||||
|
parameter REG_START_ADD = 0, |
||||
|
parameter SYS_CLOCK_FREQ = 10000000, |
||||
|
parameter TEST = 0 |
||||
|
) ( |
||||
|
input clk, |
||||
|
input rst_n, |
||||
|
|
||||
|
input [31:0] addr, |
||||
|
input [31:0] wr_data, |
||||
|
input wr_en, |
||||
|
output wire [31:0] rd_data, |
||||
|
|
||||
|
input wire ttlin1_sig, |
||||
|
input wire ttlin2_sig, |
||||
|
input wire ttlin3_sig, |
||||
|
input wire ttlin4_sig, |
||||
|
|
||||
|
input wire frame_freq_sig, |
||||
|
input wire sys_timecode_tigger_sig, |
||||
|
input wire [63:0] sys_timecode_data, |
||||
|
|
||||
|
output reg out_record_en_sig, //!录制使能信号 |
||||
|
output reg out_record_exposure_sig //!录制曝光信号 |
||||
|
|
||||
|
); |
||||
|
|
||||
|
|
||||
|
|
||||
|
reg [31:0] reg1_ctrl_control_mode; //! 控制模式选择寄存器 |
||||
|
|
||||
|
reg [31:0] reg2_timecode_start0; //! 时码启动寄存器0 |
||||
|
reg [31:0] reg3_timecode_start1; //! 时码启动寄存器1 |
||||
|
reg [31:0] reg4_timecode_stop0; //! 时码停止寄存器0 |
||||
|
reg [31:0] reg5_timecode_stop1; //! 时码停止寄存器1 |
||||
|
reg [31:0] reg6_timecode_control_flag; //! 使能时码控制启动,使能使能时码控制停止 |
||||
|
|
||||
|
reg [31:0] reg7_ttlin_trigger_sig_source; //! TTL触发信号选择 |
||||
|
reg [31:0] reg8_ttlin_trigger_level; //! TTL输入信号极性反转 |
||||
|
|
||||
|
reg [31:0] reg9_exposure_time; //! 曝光时长 |
||||
|
reg [31:0] regA_exposure_delay; //! 曝光信号延迟 |
||||
|
|
||||
|
reg [31:0] regB_manual_ctrl; //! 手动控制 |
||||
|
localparam REGA_MANUAL_CTRL_REG_INDEX = 32'd11; |
||||
|
|
||||
|
reg [31:0] regD_start_timecode_snapshot0; //! |
||||
|
reg [31:0] regE_start_timecode_snapshot1; //! |
||||
|
reg [31:0] regF_record_state; //!工作状态 read only |
||||
|
|
||||
|
wire [31:0] reg_wr_index; |
||||
|
|
||||
|
zutils_register_advanced #( |
||||
|
.REG_START_ADD(REG_START_ADD) |
||||
|
) _register ( |
||||
|
.clk (clk), |
||||
|
.rst_n (rst_n), |
||||
|
.addr (addr), |
||||
|
.wr_data(wr_data), |
||||
|
.wr_en (wr_en), |
||||
|
.rd_data(rd_data), |
||||
|
|
||||
|
.reg1(reg1_ctrl_control_mode), |
||||
|
.reg2(reg2_timecode_start0), |
||||
|
.reg3(reg3_timecode_start1), |
||||
|
.reg4(reg4_timecode_stop0), |
||||
|
.reg5(reg5_timecode_stop1), |
||||
|
.reg6(reg6_timecode_control_flag), |
||||
|
.reg7(reg7_ttlin_trigger_sig_source), |
||||
|
.reg8(reg8_ttlin_trigger_level), |
||||
|
.reg9(reg9_exposure_time), |
||||
|
.regA(regA_exposure_delay), |
||||
|
|
||||
|
.regB(regB_manual_ctrl), |
||||
|
.regD(regD_start_timecode_snapshot0), |
||||
|
.regE(regE_start_timecode_snapshot1), |
||||
|
.regF(regF_record_state), |
||||
|
|
||||
|
.reg_wr_sig(reg_wr_sig), |
||||
|
.reg_index (reg_wr_index) |
||||
|
); |
||||
|
|
||||
|
always @(posedge clk or negedge rst_n) begin |
||||
|
if (!rst_n) begin |
||||
|
reg1_ctrl_control_mode <= 1; |
||||
|
reg2_timecode_start0 <= 0; |
||||
|
reg3_timecode_start1 <= 0; |
||||
|
reg4_timecode_stop0 <= 0; |
||||
|
reg5_timecode_stop1 <= 0; |
||||
|
reg6_timecode_control_flag <= 32'hFFFF_FFFF; |
||||
|
reg7_ttlin_trigger_sig_source <= 1; |
||||
|
reg8_ttlin_trigger_level <= 1; |
||||
|
reg9_exposure_time <= 32'd1000; //100us |
||||
|
regA_exposure_delay <= 0; |
||||
|
regB_manual_ctrl <= 0; |
||||
|
end else begin |
||||
|
if (reg_wr_sig) begin |
||||
|
case (reg_wr_index) |
||||
|
1: reg1_ctrl_control_mode <= wr_data; |
||||
|
2: reg2_timecode_start0 <= wr_data; |
||||
|
3: reg3_timecode_start1 <= wr_data; |
||||
|
4: reg4_timecode_stop0 <= wr_data; |
||||
|
5: reg5_timecode_stop1 <= wr_data; |
||||
|
6: reg6_timecode_control_flag <= wr_data; |
||||
|
7: reg7_ttlin_trigger_sig_source <= wr_data; |
||||
|
8: reg8_ttlin_trigger_level <= wr_data; |
||||
|
9: reg9_exposure_time <= wr_data; |
||||
|
10: regA_exposure_delay <= wr_data; |
||||
|
default: begin |
||||
|
end |
||||
|
endcase |
||||
|
end |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
|
||||
|
wire ttl_in_choose; //! 选中的ttl触发信号,(已经经过电平翻转) |
||||
|
wire timecode_start_trigger_sig; //!timecode启动信号 |
||||
|
wire timecode_stop_trigger_sig; //!timecode停止信号 |
||||
|
wire record_exposure_sig; //!曝光信号 |
||||
|
wire frame_freq_sig_rising_edge; |
||||
|
|
||||
|
|
||||
|
zutils_multiplexer_32t1_v2 ttlin_level_trigger_multi ( |
||||
|
.chooseindex(reg7_ttlin_trigger_sig_source), |
||||
|
//in |
||||
|
.in1 (ttlin1_sig ^ (!reg8_ttlin_trigger_level[0])), |
||||
|
.in2 (ttlin2_sig ^ (!reg8_ttlin_trigger_level[0])), |
||||
|
.in3 (ttlin3_sig ^ (!reg8_ttlin_trigger_level[0])), |
||||
|
.in4 (ttlin4_sig ^ (!reg8_ttlin_trigger_level[0])), |
||||
|
//out |
||||
|
.out (ttl_in_choose) |
||||
|
); |
||||
|
|
||||
|
/******************************************************************************* |
||||
|
* StartSig输出 * |
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
timecode_comparator timecode_comparator_inst0 ( |
||||
|
.timecodeA0(sys_timecode_data[31:0]), |
||||
|
.timecodeA1(sys_timecode_data[63:32]), |
||||
|
.timecodeB0(reg2_timecode_start0), |
||||
|
.timecodeB1(reg3_timecode_start1), |
||||
|
.eq (timecode_start_trigger_sig) |
||||
|
); |
||||
|
|
||||
|
timecode_comparator timecode_comparator_inst1 ( |
||||
|
.timecodeA0(sys_timecode_data[31:0]), |
||||
|
.timecodeA1(sys_timecode_data[63:32]), |
||||
|
.timecodeB0(reg4_timecode_stop0), |
||||
|
.timecodeB1(reg5_timecode_stop1), |
||||
|
.eq (timecode_stop_trigger_sig) |
||||
|
); |
||||
|
|
||||
|
|
||||
|
zutils_edge_detecter _signal_in ( |
||||
|
.clk (clk), |
||||
|
.rst_n (rst_n), |
||||
|
.in_signal (frame_freq_sig), |
||||
|
.in_signal_rising_edge(frame_freq_sig_rising_edge) |
||||
|
); |
||||
|
|
||||
|
zutils_pluse_generator _pluse_generator ( |
||||
|
.clk (clk), |
||||
|
.rst_n (rst_n), |
||||
|
.pluse_width (reg9_exposure_time), |
||||
|
.pluse_delay (regA_exposure_delay), |
||||
|
.trigger (frame_freq_sig_rising_edge), |
||||
|
.output_signal(record_exposure_sig) |
||||
|
); |
||||
|
|
||||
|
reg en_state; |
||||
|
always @(posedge clk or negedge rst_n) begin |
||||
|
if (!rst_n) begin |
||||
|
en_state <= 0; |
||||
|
end else begin |
||||
|
case (reg1_ctrl_control_mode) |
||||
|
1: begin |
||||
|
//手动控制触发启动停止 |
||||
|
if (reg_wr_sig && reg_wr_index == REGA_MANUAL_CTRL_REG_INDEX) begin |
||||
|
if (wr_data[0] == 1) begin |
||||
|
en_state <= 1; |
||||
|
end else begin |
||||
|
en_state <= 0; |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
end |
||||
|
2: begin |
||||
|
//TIMECODE控制启动 |
||||
|
if (timecode_start_trigger_sig && sys_timecode_tigger_sig && reg6_timecode_control_flag[0]) begin |
||||
|
en_state <= 1; |
||||
|
end else if (timecode_stop_trigger_sig && sys_timecode_tigger_sig && reg6_timecode_control_flag[1]) begin |
||||
|
en_state <= 0; |
||||
|
end else if (reg_wr_sig && reg_wr_index == REGA_MANUAL_CTRL_REG_INDEX) begin |
||||
|
if (wr_data[0] == 1) begin |
||||
|
en_state <= 1; |
||||
|
end else begin |
||||
|
en_state <= 0; |
||||
|
end |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
3: begin |
||||
|
//外部电平控制 |
||||
|
if (ttl_in_choose == 1) begin |
||||
|
en_state <= 1; |
||||
|
end else begin |
||||
|
en_state <= 0; |
||||
|
end |
||||
|
end |
||||
|
default: begin |
||||
|
end |
||||
|
endcase |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
|
||||
|
reg en_state_af_sync; |
||||
|
always @(posedge clk or negedge rst_n) begin |
||||
|
if (!rst_n) begin |
||||
|
en_state_af_sync <= 0; |
||||
|
end else begin |
||||
|
case (en_state) |
||||
|
0: begin |
||||
|
if (en_state_af_sync != en_state) begin |
||||
|
en_state_af_sync <= 0; |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
1: begin |
||||
|
if (en_state_af_sync == 0) begin |
||||
|
if (frame_freq_sig_rising_edge) begin |
||||
|
regD_start_timecode_snapshot0 <= sys_timecode_data[31:0]; |
||||
|
regE_start_timecode_snapshot1 <= sys_timecode_data[63:32]; |
||||
|
en_state_af_sync <= 1; |
||||
|
end |
||||
|
end |
||||
|
end |
||||
|
endcase |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
|
||||
|
always @(*) begin |
||||
|
regF_record_state[0] <= en_state_af_sync; |
||||
|
out_record_en_sig <= en_state_af_sync; |
||||
|
out_record_exposure_sig <= out_record_en_sig & record_exposure_sig; |
||||
|
end |
||||
|
|
||||
|
endmodule |
Write
Preview
Loading…
Cancel
Save
Reference in new issue