Browse Source

ttloutput is ok

master
zhaohe 1 year ago
parent
commit
b197afaae9
  1. 66
      led_test.pds
  2. 14
      source/src/config.v
  3. 245
      source/src/output/ttl_output.v
  4. 86
      source/src/spi_reg_bus.v
  5. 460
      source/src/top.v
  6. 3
      source/src/zutils/zsimple_pll.v
  7. 47
      source/src/zutils/zutils_bus32_multi_to_one.v
  8. 2
      source/src/zutils/zutils_clk_parser.v
  9. 87
      source/src/zutils/zutils_freq_detector_v2.v
  10. 47
      source/src/zutils/zutils_multiplexer_8t1.v

66
led_test.pds

@ -1,5 +1,5 @@
(_flow fab_demo "2021.1-SP7"
(_comment "Generated by Fabric Compiler (version on 2021.1-SP7<build 86875>) at Sat Mar 2 22:45:22 2024")
(_comment "Generated by Fabric Compiler (version on 2021.1-SP7<build 86875>) at Mon Mar 4 15:16:02 2024")
(_version "1.0.5")
(_status "initial")
(_project
@ -19,7 +19,7 @@
(_input
(_file "source/src/top.v" + "Top:"
(_format verilog)
(_timespec "2024-03-02T17:50:26")
(_timespec "2024-03-04T10:57:17")
)
(_file "source/src/spi_reg_reader.v"
(_format verilog)
@ -51,7 +51,7 @@
)
(_file "source/src/zutils/zutils_clk_parser.v"
(_format verilog)
(_timespec "2024-02-27T20:28:55")
(_timespec "2024-03-04T10:38:07")
)
(_file "source/src/zutils/zutils_multiplexer_16t1.v"
(_format verilog)
@ -59,7 +59,7 @@
)
(_file "source/src/output/ttl_output.v"
(_format verilog)
(_timespec "2024-03-02T22:23:06")
(_timespec "2024-03-04T14:18:34")
)
(_file "source/src/zutils/zutils_pwm_generator.v"
(_format verilog)
@ -167,11 +167,19 @@
)
(_file "source/src/zutils/zsimple_pll.v"
(_format verilog)
(_timespec "2024-03-02T22:44:30")
(_timespec "2024-03-04T09:54:54")
)
(_file "source/src/zutils/zutils_freq_detector_v2.v"
(_format verilog)
(_timespec "2024-03-02T22:20:27")
(_timespec "2024-03-04T15:12:52")
)
(_file "source/src/zutils/zutils_multiplexer_8t1.v"
(_format verilog)
(_timespec "2024-03-04T10:57:15")
)
(_file "source/src/spi_reg_bus.v"
(_format verilog)
(_timespec "2024-03-04T11:36:33")
)
)
)
@ -243,17 +251,17 @@
(_db_output
(_file "compile/Top_comp.adf"
(_format adif)
(_timespec "2024-03-02T22:44:36")
(_timespec "2024-03-04T15:12:56")
)
)
(_output
(_file "compile/Top.cmr"
(_format verilog)
(_timespec "2024-03-02T22:44:35")
(_timespec "2024-03-04T15:12:56")
)
(_file "compile/cmr.db"
(_format text)
(_timespec "2024-03-02T22:44:36")
(_timespec "2024-03-04T15:12:57")
)
)
)
@ -269,21 +277,21 @@
(_db_output
(_file "synthesize/Top_syn.adf"
(_format adif)
(_timespec "2024-03-02T22:44:44")
(_timespec "2024-03-04T15:13:29")
)
)
(_output
(_file "synthesize/Top_syn.vm"
(_format structural_verilog)
(_timespec "2024-03-02T22:44:45")
(_timespec "2024-03-04T15:13:34")
)
(_file "synthesize/Top.snr"
(_format text)
(_timespec "2024-03-02T22:44:46")
(_timespec "2024-03-04T15:13:38")
)
(_file "synthesize/snr.db"
(_format text)
(_timespec "2024-03-02T22:44:46")
(_timespec "2024-03-04T15:13:39")
)
)
)
@ -304,21 +312,21 @@
(_db_output
(_file "device_map/Top_map.adf"
(_format adif)
(_timespec "2024-03-02T22:44:49")
(_timespec "2024-03-04T15:13:43")
)
)
(_output
(_file "device_map/Top_dmr.prt"
(_format text)
(_timespec "2024-03-02T22:44:48")
(_timespec "2024-03-04T15:13:41")
)
(_file "device_map/Top.dmr"
(_format text)
(_timespec "2024-03-02T22:44:49")
(_timespec "2024-03-04T15:13:43")
)
(_file "device_map/dmr.db"
(_format text)
(_timespec "2024-03-02T22:44:49")
(_timespec "2024-03-04T15:13:43")
)
)
)
@ -327,7 +335,7 @@
(_input
(_file "device_map/led_test.pcf"
(_format pcf)
(_timespec "2024-03-02T22:44:49")
(_timespec "2024-03-04T15:13:43")
)
)
)
@ -342,33 +350,33 @@
(_db_output
(_file "place_route/Top_pnr.adf"
(_format adif)
(_timespec "2024-03-02T22:45:03")
(_timespec "2024-03-04T15:15:24")
)
)
(_output
(_file "place_route/Top.prr"
(_format text)
(_timespec "2024-03-02T22:45:03")
(_timespec "2024-03-04T15:15:24")
)
(_file "place_route/Top_prr.prt"
(_format text)
(_timespec "2024-03-02T22:45:03")
(_timespec "2024-03-04T15:15:23")
)
(_file "place_route/clock_utilization.txt"
(_format text)
(_timespec "2024-03-02T22:45:03")
(_timespec "2024-03-04T15:15:23")
)
(_file "place_route/Top_plc.adf"
(_format adif)
(_timespec "2024-03-02T22:44:55")
(_timespec "2024-03-04T15:13:56")
)
(_file "place_route/Top_pnr.netlist"
(_format text)
(_timespec "2024-03-02T22:45:03")
(_timespec "2024-03-04T15:15:24")
)
(_file "place_route/prr.db"
(_format text)
(_timespec "2024-03-02T22:45:04")
(_timespec "2024-03-04T15:15:25")
)
)
)
@ -403,19 +411,19 @@
(_output
(_file "generate_bitstream/Top.sbit"
(_format text)
(_timespec "2024-03-02T22:45:21")
(_timespec "2024-03-04T15:16:00")
)
(_file "generate_bitstream/Top.smsk"
(_format text)
(_timespec "2024-03-02T22:45:21")
(_timespec "2024-03-04T15:16:00")
)
(_file "generate_bitstream/Top.bgr"
(_format text)
(_timespec "2024-03-02T22:45:21")
(_timespec "2024-03-04T15:16:00")
)
(_file "generate_bitstream/bgr.db"
(_format text)
(_timespec "2024-03-02T22:45:22")
(_timespec "2024-03-04T15:16:02")
)
)
)

14
source/src/config.v

@ -0,0 +1,14 @@
`define REGADDOFF__FPGA_INFO 16'h0020
`define REGADDOFF__TTLIN 16'h0100
`define REGADDOFF__TIMECODE_IN 16'h0120
`define REGADDOFF__GENLOCK_IN 16'h0130
`define REGADDOFF__INTERNAL_TIMECODE 16'h0300
`define REGADDOFF__INTERNAL_GENLOCK 16'h0310
`define REGADDOFF__INTERNAL_CLOCK 16'h0320
`define REGADDOFF__TTLOUT1 16'h0200
`define REGADDOFF__TTLOUT2 16'h0210
`define REGADDOFF__TTLOUT3 16'h0220
`define REGADDOFF__TTLOUT4 16'h0230
`define REGADDOFF__TIMECODE_OUT 16'h0240
`define REGADDOFF__GENLOCK_OUT 16'h0250
`define REGADDOFF__CAMERA_SYNC_OUT 16'h0260

245
source/src/output/ttl_output.v

@ -2,7 +2,7 @@ module ttl_output #(
parameter REG_START_ADD = 0,
parameter SYS_CLOCK_FREQ = 10000000,
parameter ID = 1
) (
) (
input clk, //clock input
input rst_n, //asynchronous reset input, low active
@ -14,117 +14,112 @@ module ttl_output #(
input [31:0] signal_in,
output ttloutput, //ttl输出信号
output ttloutput, //ttl输出信号
output ttloutput_state_led //ttl输出状态信号
);
// 编写注意事项
// 1. 修改配置寄存器时候部分计数需要清空
);
/*******************************************************************************
* 寄存器列表 *
*******************************************************************************/
//!信号处理模式 0:固定输出低电平1:固定输出高电平2:分频倍频模式3:转发模式4:测试模式
reg [31:0] reg_signal_process_mode;
reg [31:0] reg_signal_process_mode;
//!TTLOUT_信号选择器
reg [31:0] reg_input_signal_select;
reg [31:0] reg_input_signal_select;
//!TTLOUT_分频器
reg [31:0] reg_input_freq_division;
reg [31:0] reg_pllout_freq_division_ctrl;
//!TTLOUT_频率倍增器
reg [31:0] reg_input_freq_multiplication;
reg [31:0] reg_pllout_freq_multiplication_ctrl;
//!TTLOUT_极性控制寄存器
reg [31:0] reg_input_polarity_ctrl;
reg [31:0] reg_pllout_polarity_ctrl;
//!TTLOUT_触发信号边沿类型
reg [31:0] reg_input_trigger_edge_select;
//!输出脉冲宽度
reg [31:0] output_pluse_width;
// !频率探测偏差
reg [31:0] freq_detect_bias;
//!输出脉冲延迟
reg [31:0] output_pluse_delay;
reg [31:0] reg_pllout_trigger_edge_select;
//!转发模式下的极性控制
reg [31:0] reg_forward_mode_polarity_ctrl;
//!占位
reg [31:0] reg_placeholder0;
// !频率探测偏差
reg [31:0] reg_freq_detect_bias;
//!输入信号频率探测 read only
reg [31:0] reg_sig_in_freq_detect;
wire [31:0] reg_sig_in_freq_detect;
//!输出信号频率探测 read only
reg [31:0] reg_sig_out_freq_detect;
wire [31:0] reg_sig_out_freq_detect;
wire [31:0] reg_wr_index;//!寄存器写入时相对地址
reg signal_in_choose; //!原始信号
wire signal_in_pll;//!倍频后的信号
wire signal_in_polarity_ctrl;//!极性翻转后的信号
wire [31:0] reg_wr_index; //!寄存器写入时相对地址
wire signal_in_choose; //!原始信号
wire signal_in_af_pll; //!倍频后的信号
wire signal_af_pll_af_polarity_ctrl; //!极性翻转后的信号
wire signal_in_af_forward_mode_polarity_ctrl; //!转发模式下的输入信号
wire signal_test; //!测试信号
//信号流转图
//
// signal_in[]
// ---> signal_in_choose
// --->
// signal_in[](原始信号)
// ---> reg_input_signal_select -->signal_in_choose(信号选择器)
// -->
// reg_pllout_trigger_edge_select
// reg_pllout_freq_division_ctrl ---> signal_in_af_pll(经分频倍频后的信号)
// reg_pllout_freq_multiplication_ctrl
// ---> signal_af_pll_af_polarity_ctrl
//
//
// 0:0 ---|
// 1:1 ---|
// 2:signal_af_pll_af_polarity_ctrl ---|-->
// 3:signal_in_af_forward_mode_polarity_ctrl ---|
// 4:test_sig ---|
//
//!TTLOUT_寄存器自动赋值选择器
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),
.reg0(reg_signal_process_mode),
.reg1(reg_input_signal_select),
.reg2(reg_input_freq_division),
.reg3(reg_input_freq_multiplication),
.reg4(reg_input_polarity_ctrl),
.reg5(reg_input_trigger_edge_select),
.reg6(output_pluse_width),
.reg7(output_pluse_delay),
.reg8(freq_detect_bias),
.regE(reg_sig_in_freq_detect),
.regF(reg_sig_out_freq_detect),
.reg_wr_sig(reg_wr_sig),
.reg_index(reg_wr_index)
);
.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),
.reg0 (reg_signal_process_mode),
.reg1 (reg_input_signal_select),
.reg2 (reg_pllout_freq_division_ctrl),
.reg3 (reg_pllout_freq_multiplication_ctrl),
.reg4 (reg_pllout_polarity_ctrl),
.reg5 (reg_pllout_trigger_edge_select),
.reg6 (reg_forward_mode_polarity_ctrl),
.reg7 (reg_placeholder0),
.reg8 (reg_freq_detect_bias),
.regE (reg_sig_in_freq_detect),
.regF (reg_sig_out_freq_detect),
.reg_wr_sig(reg_wr_sig),
.reg_index (reg_wr_index)
);
//!寄存器写入逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
reg_signal_process_mode<=0;
reg_input_signal_select<=0;
reg_input_freq_division<=0;
reg_input_freq_multiplication<=0;
reg_input_polarity_ctrl<=0;
reg_input_trigger_edge_select<=1; //上升沿触发
output_pluse_width<= 1000; // 100us
output_pluse_delay<=0;
freq_detect_bias<= 32'd10;
end
else begin
reg_signal_process_mode <= 0;
reg_input_signal_select <= 0;
reg_pllout_freq_division_ctrl <= 0;
reg_pllout_freq_multiplication_ctrl <= 0;
reg_pllout_polarity_ctrl <= 0;
reg_pllout_trigger_edge_select <= 1;
reg_forward_mode_polarity_ctrl <= 0;
reg_placeholder0 <= 0;
reg_freq_detect_bias <= 32'd10;
end else begin
if (reg_wr_sig) begin
case (reg_wr_index)
0:
reg_signal_process_mode <= wr_data;
1:
reg_input_signal_select <= wr_data;
2:
reg_input_freq_division <= wr_data;
3:
reg_input_freq_multiplication <= wr_data;
4:
reg_input_polarity_ctrl <= wr_data;
5:
reg_input_trigger_edge_select <= wr_data;
6:
output_pluse_width <= wr_data;
7:
output_pluse_delay <= wr_data;
8:
freq_detect_bias <= wr_data;
0: reg_signal_process_mode <= wr_data;
1: reg_input_signal_select <= wr_data;
2: reg_pllout_freq_division_ctrl <= wr_data;
3: reg_pllout_freq_multiplication_ctrl <= wr_data;
4: reg_pllout_polarity_ctrl <= wr_data;
5: reg_pllout_trigger_edge_select <= wr_data;
6: reg_forward_mode_polarity_ctrl <= wr_data;
7: reg_placeholder0 <= wr_data;
8: reg_freq_detect_bias <= wr_data;
default: begin
end
endcase
@ -133,31 +128,73 @@ module ttl_output #(
end
//!信号选择器
always @(*) begin
if(reg_input_signal_select <= 31) begin
signal_in_choose <= signal_in[reg_input_signal_select];
end
else begin
signal_in_choose <= 0;
end
end
zutils_multiplexer_32t1 signal_in_multiplexer (
.chooseindex(reg_input_signal_select),
.signal (signal_in),
.signalout (signal_in_choose)
);
//!pll信号处理
zsimple_pll _simple_pll (
.clk(clk),
.rst_n(rst_n),
.insignal(signal_in[2]),
.trigger_eage_type(reg_input_trigger_edge_select[0]),
.freq_detect_bias(freq_detect_bias),
.freq_division(reg_input_freq_division),
.freq_multiplication(3),
.cfg_change(reg_wr_sig),
.outsignal(signal_in_pll)
);
.clk (clk),
.rst_n (rst_n),
.insignal (signal_in_choose),
.trigger_eage_type (reg_pllout_trigger_edge_select[0]),
.freq_detect_bias (reg_freq_detect_bias),
.freq_division (reg_pllout_freq_division_ctrl),
.freq_multiplication(reg_pllout_freq_multiplication_ctrl),
.polarity_ctrl (reg_pllout_polarity_ctrl[0]),
.cfg_change (reg_wr_sig),
.outsignal (signal_in_af_pll)
);
assign ttloutput_state_led = 1;
assign ttloutput = signal_in_pll;
//!100HZ测试信号发生器
zutils_pwm_generator #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ(100)
) pwm100hz_gen (
.clk (clk),
.rst_n (rst_n),
.output_signal(signal_test)
);
assign signal_in_af_forward_mode_polarity_ctrl = signal_in_choose ^ reg_forward_mode_polarity_ctrl[0];
//!信号输出选择器
zutils_multiplexer_8t1 signal_output_multiplexer (
.chooseindex(reg_signal_process_mode),
.signal0 (1'b0),
.signal1 (1'b1),
.signal2 (signal_in_af_pll),
.signal3 (signal_in_af_forward_mode_polarity_ctrl),
.signal4 (signal_test),
.signal5 (1'b0),
.signal6 (1'b0),
.signal7 (1'b0),
.signalout (ttloutput)
);
//
//
zutils_freq_detector_v2 in_freq_detector (
.clk (clk),
.rst_n (rst_n),
.freq_detect_bias(reg_freq_detect_bias),
.pluse_input (signal_in_choose),
.pluse_width_cnt (reg_sig_in_freq_detect)
);
zutils_freq_detector_v2 output_freq_detector (
.clk (clk),
.rst_n (rst_n),
.freq_detect_bias(reg_freq_detect_bias),
.pluse_input (ttloutput),
.pluse_width_cnt (reg_sig_out_freq_detect)
);
assign ttloutput_state_led = 1;
endmodule

86
source/src/spi_reg_bus.v

@ -0,0 +1,86 @@
`include "config.v"
module spi_reg_bus (
input clk, //clock input
input rst_n, //asynchronous reset input, low active
//regbus interface
output [31:0] addr,
output [31:0] wr_data,
output wr_en,
//
input wire spi_cs_pin, //
input wire spi_clk_pin, //
input wire spi_rx_pin, //
output wire spi_tx_pin,
input [31:0] rd_data_module_fpga_info,
input [31:0] rd_data_module_ttlin,
input [31:0] rd_data_module_timecode_in,
input [31:0] rd_data_module_genlock_in,
input [31:0] rd_data_module_internal_timecode,
input [31:0] rd_data_module_internal_genlock,
input [31:0] rd_data_module_internal_clock,
input [31:0] rd_data_module_ttlout1,
input [31:0] rd_data_module_ttlout2,
input [31:0] rd_data_module_ttlout3,
input [31:0] rd_data_module_ttlout4,
input [31:0] rd_data_module_timecode_out,
input [31:0] rd_data_module_genlock_out,
input [31:0] rd_data_module_camera_sync_out
);
reg [31:0] rd_data;
spi_reg_reader spi_reg_reader_inst (
.clk (clk),
.rst_n (rst_n),
.addr (addr),
.wr_data (wr_data),
.wr_en (wr_en),
.rd_data (rd_data),
.spi_cs_pin (spi_cs_pin),
.spi_clk_pin(spi_clk_pin),
.spi_rx_pin (spi_rx_pin),
.spi_tx_pin (spi_tx_pin)
);
// 数据路由
wire [31:0] addr_group;
assign addr_group = addr & 31'hFFFF_FFF0;
always @(*) begin
case (addr_group)
`REGADDOFF__FPGA_INFO:
rd_data <= rd_data_module_fpga_info;
`REGADDOFF__TTLIN:
rd_data <= rd_data_module_ttlin;
`REGADDOFF__TIMECODE_IN:
rd_data <= rd_data_module_timecode_in;
`REGADDOFF__GENLOCK_IN:
rd_data <= rd_data_module_genlock_in;
`REGADDOFF__INTERNAL_TIMECODE:
rd_data <= rd_data_module_internal_timecode;
`REGADDOFF__INTERNAL_GENLOCK:
rd_data <= rd_data_module_internal_genlock;
`REGADDOFF__INTERNAL_CLOCK:
rd_data <= rd_data_module_internal_clock;
`REGADDOFF__TTLOUT1:
rd_data <= rd_data_module_ttlout1;
`REGADDOFF__TTLOUT2:
rd_data <= rd_data_module_ttlout2;
`REGADDOFF__TTLOUT3:
rd_data <= rd_data_module_ttlout3;
`REGADDOFF__TTLOUT4:
rd_data <= rd_data_module_ttlout4;
`REGADDOFF__TIMECODE_OUT:
rd_data <= rd_data_module_timecode_out;
`REGADDOFF__GENLOCK_OUT:
rd_data <= rd_data_module_genlock_out;
`REGADDOFF__CAMERA_SYNC_OUT:
rd_data <= rd_data_module_camera_sync_out;
default:
rd_data <= 0;
endcase
end
endmodule

460
source/src/top.v

@ -1,4 +1,5 @@
`timescale 1ns / 1ns
`include "config.v"
module Top (
input ex_clk,
input ex_rst_n,
@ -71,30 +72,16 @@ module Top (
output [15:0] debug_signal_output,
output wire core_board_debug_led
);
);
localparam REGADDOFF__FPGA_INFO = 16'h0020;
localparam REGADDOFF__TTLIN = 16'h0100;
localparam REGADDOFF__TIMECODE_IN = 16'h0120;
localparam REGADDOFF__GENLOCK_IN = 16'h0130;
localparam REGADDOFF__INTERNAL_TIMECODE = 16'h0200;
localparam REGADDOFF__INTERNAL_GENLOCK = 16'h0210;
localparam REGADDOFF__INTERNAL_CLOCK = 16'h0220;
localparam REGADDOFF__TTLOUT1 = 16'h0200;
localparam REGADDOFF__TTLOUT2 = 16'h0210;
localparam REGADDOFF__TTLOUT3 = 16'h0220;
localparam REGADDOFF__TTLOUT4 = 16'h0230;
localparam REGADDOFF__TIMECODE_OUT = 16'h0240;
localparam REGADDOFF__GENLOCK_OUT = 16'h0250;
localparam REGADDOFF__CAMERA_SYNC_OUT = 16'h0260;
localparam SYS_CLOCK_FREQ = 10000000;
localparam SYS_CLOCK_FREQ = 10000000;
wire sys_clk; //! 系统时钟
wire sys_rst_n; //! 系统复位
wire sys_clk; //! 系统时钟
wire sys_rst_n; //! 系统复位
//寄存器读写总线
wire [31:0] RegReaderBus_addr; //!寄存器读写-地址总线
@ -110,179 +97,156 @@ module Top (
wire [31:0] rd_data_module_internal_timecode; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_internal_genlock; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_internal_clock; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout1;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout2;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout3;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout4;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_timecode_out;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_genlock_out;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_camera_sync_out;//! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout1; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout2; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout3; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_ttlout4; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_timecode_out; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_genlock_out; //! 模块寄存器数据总线读数据
wire [31:0] rd_data_module_camera_sync_out; //! 模块寄存器数据总线读数据
//内部信号
wire signal_logic0; //! 逻辑0
wire signal_logic1; //! 逻辑1
wire signal_ttlin1; //! TTL输入1
wire signal_ttlin2; //! TTL输入2
wire signal_ttlin3; //! TTL输入3
wire signal_ttlin4; //! TTL输入4
wire signal_ext_genlock_freq; //! 外部GENLOCK频率信号
wire signal_ext_timecode_freq; //! 外部时间码频率信号
wire signal_internal_timecode_freq;//! 内部时间码频率信号
wire signal_internal_genlock_freq;//! 内部GENLOCK频率信号
wire signal_internal_freq_sig;//! 内部频率信号
wire signal_sys_clk_output;//! 系统时钟输出
wire signal_sys_genlock_output;//! 系统GENLOCK输出
wire signal_sys_timecode_freq_output;//! 系统时间码频率输出
wire signal_business_record_sig; //! 业务摄影状态信号
wire signal_business_record_exposure_sig;//! 业务摄影拍照曝光信号
wire [31:0] sig_src; // 系统内部信号总线
assign sig_src[0] = signal_logic0;
assign sig_src[1] = signal_logic1;
assign sig_src[2] = signal_ttlin1;
assign sig_src[3] = signal_ttlin2;
assign sig_src[4] = signal_ttlin3;
assign sig_src[5] = signal_ttlin4;
assign sig_src[6] = signal_ext_genlock_freq;
assign sig_src[7] = signal_ext_timecode_freq;
assign sig_src[8] = signal_internal_timecode_freq;
assign sig_src[9] = signal_internal_genlock_freq;
assign sig_src[10] = signal_internal_freq_sig;
assign sig_src[11] = signal_sys_clk_output;
assign sig_src[12] = signal_sys_genlock_output;
assign sig_src[13] = signal_sys_timecode_freq_output;
assign sig_src[14] = signal_business_record_sig;
assign sig_src[15] = signal_business_record_exposure_sig;
wire signal_logic0; //! 逻辑0
wire signal_logic1; //! 逻辑1
wire signal_ttlin1; //! TTL输入1
wire signal_ttlin2; //! TTL输入2
wire signal_ttlin3; //! TTL输入3
wire signal_ttlin4; //! TTL输入4
wire signal_ext_genlock_freq; //! 外部GENLOCK频率信号
wire signal_ext_timecode_freq; //! 外部时间码频率信号
wire signal_internal_timecode_freq; //! 内部时间码频率信号
wire signal_internal_genlock_freq; //! 内部GENLOCK频率信号
wire signal_internal_freq_sig; //! 内部频率信号
wire signal_sys_clk_output; //! 系统时钟输出
wire signal_sys_genlock_output; //! 系统GENLOCK输出
wire signal_sys_timecode_freq_output; //! 系统时间码频率输出
wire signal_business_record_sig; //! 业务摄影状态信号
wire signal_business_record_exposure_sig; //! 业务摄影拍照曝光信号
wire [31:0] sig_src; // 系统内部信号总线
assign sig_src[0] = signal_logic0;
assign sig_src[1] = signal_logic1;
assign sig_src[2] = signal_ttlin1;
assign sig_src[3] = signal_ttlin2;
assign sig_src[4] = signal_ttlin3;
assign sig_src[5] = signal_ttlin4;
assign sig_src[6] = signal_ext_genlock_freq;
assign sig_src[7] = signal_ext_timecode_freq;
assign sig_src[8] = signal_internal_timecode_freq;
assign sig_src[9] = signal_internal_genlock_freq;
assign sig_src[10] = signal_internal_freq_sig;
assign sig_src[11] = signal_sys_clk_output;
assign sig_src[12] = signal_sys_genlock_output;
assign sig_src[13] = signal_sys_timecode_freq_output;
assign sig_src[14] = signal_business_record_sig;
assign sig_src[15] = signal_business_record_exposure_sig;
assign signal_logic0 = 1'b0;
assign signal_logic1 = 1'b1;
//系统时钟源
SPLL spll (
.clkin1 (ex_clk),
.pll_lock(pll_lock),
.clkout0 (sys_clk_25m),
.clkout1 (sys_clk_10m),
.clkout2 (sys_clk_5m)
);
.clkin1 (ex_clk),
.pll_lock(pll_lock),
.clkout0 (sys_clk_25m),
.clkout1 (sys_clk_10m),
.clkout2 (sys_clk_5m)
);
assign sys_clk = sys_clk_10m;
assign sys_rst_n = ex_rst_n & pll_lock;
spi_reg_bus _spi_reg_bus (
.clk (sys_clk),
.rst_n (sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data (RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.spi_cs_pin (spi2_cs_pin),
.spi_clk_pin(spi2_clk_pin),
.spi_rx_pin (spi2_rx_pin),
.spi_tx_pin (spi2_tx_pin),
.rd_data_module_fpga_info (rd_data_module_fpga_info),
.rd_data_module_ttlin (rd_data_module_ttlin),
.rd_data_module_timecode_in (rd_data_module_timecode_in),
.rd_data_module_genlock_in (rd_data_module_genlock_in),
.rd_data_module_internal_timecode(rd_data_module_internal_timecode),
.rd_data_module_internal_genlock (rd_data_module_internal_genlock),
.rd_data_module_internal_clock (rd_data_module_internal_clock),
.rd_data_module_ttlout1 (rd_data_module_ttlout1),
.rd_data_module_ttlout2 (rd_data_module_ttlout2),
.rd_data_module_ttlout3 (rd_data_module_ttlout3),
.rd_data_module_ttlout4 (rd_data_module_ttlout4),
.rd_data_module_timecode_out (rd_data_module_timecode_out),
.rd_data_module_genlock_out (rd_data_module_genlock_out),
.rd_data_module_camera_sync_out (rd_data_module_camera_sync_out)
);
spi_reg_reader spi_reg_reader_inst (
.clk (sys_clk),
.rst_n (sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data (RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data (RegReaderBus_rd_data),
.spi_cs_pin (spi2_cs_pin),
.spi_clk_pin(spi2_clk_pin),
.spi_rx_pin (spi2_rx_pin),
.spi_tx_pin (spi2_tx_pin)
);
// 数据路由
wire [31:0] addr_group;
assign addr_group = RegReaderBus_addr & 31'hFFFF_FFF0;
always @(*) begin
case (addr_group)
REGADDOFF__FPGA_INFO:
RegReaderBus_rd_data <= rd_data_module_fpga_info;
REGADDOFF__TTLIN:
RegReaderBus_rd_data <= rd_data_module_ttlin;
REGADDOFF__TIMECODE_IN:
RegReaderBus_rd_data <= rd_data_module_timecode_in;
REGADDOFF__GENLOCK_IN:
RegReaderBus_rd_data <= rd_data_module_genlock_in;
REGADDOFF__INTERNAL_TIMECODE:
RegReaderBus_rd_data <= rd_data_module_internal_timecode;
REGADDOFF__INTERNAL_GENLOCK:
RegReaderBus_rd_data <= rd_data_module_internal_genlock;
REGADDOFF__INTERNAL_CLOCK:
RegReaderBus_rd_data <= rd_data_module_internal_clock;
REGADDOFF__TTLOUT1:
RegReaderBus_rd_data <= rd_data_module_ttlout1;
REGADDOFF__TTLOUT2:
RegReaderBus_rd_data <= rd_data_module_ttlout2;
REGADDOFF__TTLOUT3:
RegReaderBus_rd_data <= rd_data_module_ttlout3;
REGADDOFF__TTLOUT4:
RegReaderBus_rd_data <= rd_data_module_ttlout4;
REGADDOFF__TIMECODE_OUT:
RegReaderBus_rd_data <= rd_data_module_timecode_out;
REGADDOFF__GENLOCK_OUT:
RegReaderBus_rd_data <= rd_data_module_genlock_out;
REGADDOFF__CAMERA_SYNC_OUT:
RegReaderBus_rd_data <= rd_data_module_camera_sync_out;
default:
RegReaderBus_rd_data <= 0;
endcase
end
/*******************************************************************************
* FPGA_INFO *
*******************************************************************************/
zutils_register16 #(
.REG_START_ADD(REGADDOFF__FPGA_INFO),
.REG0_INIT(1),
.REG1_INIT(2),
.REG2_INIT(3),
.REG3_INIT(4),
.REG4_INIT(5),
.REG5_INIT(6),
.REG6_INIT(7),
.REG7_INIT(8),
.REG8_INIT(9),
.REG9_INIT(10),
.REGA_INIT(11),
.REGB_INIT(12),
.REGC_INIT(13),
.REGD_INIT(14),
.REGE_INIT(15),
.REGF_INIT(16)
) test_reg (
.clk(sys_clk),
.rst_n(sys_rst_n),
.addr(RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en(RegReaderBus_wr_en),
.rd_data(rd_data_module_fpga_info)
);
.REG_START_ADD(`REGADDOFF__FPGA_INFO),
.REG0_INIT(1),
.REG1_INIT(2),
.REG2_INIT(3),
.REG3_INIT(4),
.REG4_INIT(5),
.REG5_INIT(6),
.REG6_INIT(7),
.REG7_INIT(8),
.REG8_INIT(9),
.REG9_INIT(10),
.REGA_INIT(11),
.REGB_INIT(12),
.REGC_INIT(13),
.REGD_INIT(14),
.REGE_INIT(15),
.REGF_INIT(16)
) test_reg (
.clk (sys_clk),
.rst_n (sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data(rd_data_module_fpga_info)
);
/*******************************************************************************
* TTL输入模块 *
*******************************************************************************/
ttl_input #(
.REG_START_ADD (REGADDOFF__TTLIN),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ)
) ttl_inputr_ins (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr(RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en(RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlin),
.ttlin1_raw(sync_ttl_in1),
.ttlin2_raw(sync_ttl_in2),
.ttlin3_raw(sync_ttl_in3),
.ttlin4_raw(!sync_ttl_in4), //in4电路上进行了反向
//指示灯
.ttlin1_state_led(sync_ttl_in1_state_led),
.ttlin2_state_led(sync_ttl_in2_state_led),
.ttlin3_state_led(sync_ttl_in3_state_led),
.ttlin4_state_led(sync_ttl_in4_state_led),
//原始信号
.sig_ttlin1(signal_ttlin1),
.sig_ttlin2(signal_ttlin2),
.sig_ttlin3(signal_ttlin3),
.sig_ttlin4(signal_ttlin4)
);
.REG_START_ADD (`REGADDOFF__TTLIN),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ)
) ttl_inputr_ins (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlin),
.ttlin1_raw(sync_ttl_in1),
.ttlin2_raw(sync_ttl_in2),
.ttlin3_raw(sync_ttl_in3),
.ttlin4_raw(!sync_ttl_in4), //in4电路上进行了反向
//指示灯
.ttlin1_state_led(sync_ttl_in1_state_led),
.ttlin2_state_led(sync_ttl_in2_state_led),
.ttlin3_state_led(sync_ttl_in3_state_led),
.ttlin4_state_led(sync_ttl_in4_state_led),
//原始信号
.sig_ttlin1(signal_ttlin1),
.sig_ttlin2(signal_ttlin2),
.sig_ttlin3(signal_ttlin3),
.sig_ttlin4(signal_ttlin4)
);
/*******************************************************************************
* TTL_OUTPUT *
@ -292,91 +256,91 @@ module Top (
ttl_output #(
.REG_START_ADD(REGADDOFF__TTLOUT1),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(1)
) ttl_output_1 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr(RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en(RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout1),
.signal_in(sig_src),
.ttloutput(sync_ttl_out1),
.ttloutput_state_led(sync_ttl_out1_state_led)
);
.REG_START_ADD(`REGADDOFF__TTLOUT1),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(1)
) ttl_output_1 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout1),
.signal_in(sig_src),
.ttloutput (sync_ttl_out1),
.ttloutput_state_led(sync_ttl_out1_state_led)
);
ttl_output #(
.REG_START_ADD(REGADDOFF__TTLOUT2),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(2)
) ttl_output_2 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr(RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en(RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout2),
.signal_in(sig_src),
.ttloutput(sync_ttl_out2),
.ttloutput_state_led(sync_ttl_out2_state_led)
);
.REG_START_ADD(`REGADDOFF__TTLOUT2),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(2)
) ttl_output_2 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout2),
.signal_in(sig_src),
.ttloutput (sync_ttl_out2),
.ttloutput_state_led(sync_ttl_out2_state_led)
);
ttl_output #(
.REG_START_ADD(REGADDOFF__TTLOUT3),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(3)
) ttl_output_3 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr(RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en(RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout3),
.REG_START_ADD(`REGADDOFF__TTLOUT3),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(3)
) ttl_output_3 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout3),
.signal_in(sig_src),
.ttloutput (sync_ttl_out3),
.ttloutput_state_led(sync_ttl_out3_state_led)
);
.signal_in(sig_src),
ttl_output #(
.REG_START_ADD(`REGADDOFF__TTLOUT4),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(4)
) ttl_output_4 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr (RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en (RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout4),
.signal_in(sig_src),
.ttloutput (sync_ttl_out4),
.ttloutput_state_led(sync_ttl_out4_state_led)
);
.ttloutput(sync_ttl_out3),
.ttloutput_state_led(sync_ttl_out3_state_led)
);
ttl_output #(
.REG_START_ADD(REGADDOFF__TTLOUT4),
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.ID(4)
) ttl_output_4 (
.clk (sys_clk),
.rst_n(sys_rst_n),
.addr(RegReaderBus_addr),
.wr_data(RegReaderBus_wr_data),
.wr_en(RegReaderBus_wr_en),
.rd_data(rd_data_module_ttlout4),
.signal_in(sig_src),
.ttloutput(sync_ttl_out4),
.ttloutput_state_led(sync_ttl_out4_state_led)
);
assign debug_signal_output[0] = sys_clk;
assign debug_signal_output[1] = sync_ttl_in1;
assign debug_signal_output[2] = sync_ttl_in2;
assign debug_signal_output[3] = sync_ttl_in3;
assign debug_signal_output[4] = sync_ttl_in4;
assign debug_signal_output[5] = sync_ttl_out1;
assign debug_signal_output[6] = sync_ttl_out2;
assign debug_signal_output[7] = sync_ttl_out3;
assign debug_signal_output[8] = sync_ttl_out4;
assign debug_signal_output[9] = genlock_in_fsync;
assign debug_signal_output[0] = sys_clk;
assign debug_signal_output[1] = sync_ttl_in1;
assign debug_signal_output[2] = sync_ttl_in2;
assign debug_signal_output[3] = sync_ttl_in3;
assign debug_signal_output[4] = sync_ttl_in4;
assign debug_signal_output[5] = sync_ttl_out1;
assign debug_signal_output[6] = sync_ttl_out2;
assign debug_signal_output[7] = sync_ttl_out3;
assign debug_signal_output[8] = sync_ttl_out4;
assign debug_signal_output[9] = genlock_in_fsync;
assign debug_signal_output[10] = timecode_headphone_in;
assign debug_signal_output[11] = timecode_bnc_in;
assign debug_signal_output[12] = timecode_out_headphone;

3
source/src/zutils/zsimple_pll.v

@ -7,6 +7,7 @@ module zsimple_pll (
input wire [31:0] freq_detect_bias, //! 频率偏差计数
input wire [31:0] freq_division,
input wire [31:0] freq_multiplication,
input wire polarity_ctrl,
input wire cfg_change,
output wire outsignal
);
@ -144,5 +145,5 @@ module zsimple_pll (
end
assign outsignal = insignal_multiplication;
assign outsignal = insignal_multiplication ^ polarity_ctrl;
endmodule

47
source/src/zutils/zutils_bus32_multi_to_one.v

@ -0,0 +1,47 @@
module zutils_multiplexer_8t1 (
input [31:0] chooseindex,
input wire signal0,
input wire signal1,
input wire signal2,
input wire signal3,
input wire signal4,
input wire signal5,
input wire signal6,
input wire signal7,
input wire signal8,
output reg signalout
);
always @(*) begin
case (chooseindex)
0: begin
signalout = signal0;
end
1: begin
signalout = signal1;
end
2: begin
signalout = signal2;
end
3: begin
signalout = signal3;
end
4: begin
signalout = signal4;
end
5: begin
signalout = signal5;
end
6: begin
signalout = signal6;
end
7: begin
signalout = signal7;
end
default: begin
signalout = 0;
end
endcase
end
endmodule

2
source/src/zutils/zutils_clk_parser.v

@ -1,6 +1,4 @@
//
//
//
// cs : ----______________________________________________
// clk : ----------____----____----____----____----____----
// bitcnt : 0 1 2 ... 7 0

87
source/src/zutils/zutils_freq_detector_v2.v

@ -4,30 +4,28 @@
// 2. 频率探测
// 3. 输出灯光控制
//
module zutils_freq_detector_v2
(
input clk, //! 时钟输入
input rst_n, //! 复位输入
input pluse_input, //! 输入信号1
input wire [31:0] freq_detect_bias, //! 频率偏差计数
output reg [31:0]pluse_width_cnt, //! 输出捕获到的脉冲宽度
output wire pluse_width_cnt_lock //! 输出捕获到的脉冲宽度锁定信号
);
module zutils_freq_detector_v2 (
input clk, //! 时钟输入
input rst_n, //! 复位输入
input pluse_input, //! 输入信号1
input wire [31:0] freq_detect_bias, //! 频率偏差计数
output reg [31:0] pluse_width_cnt, //! 输出捕获到的脉冲宽度
output wire pluse_width_cnt_lock //! 输出捕获到的脉冲宽度锁定信号
);
reg in_signal_last;
reg in_signal_rising_edge; //! 上升沿
reg [31:0] state; //! 频率捕获状态
reg [31:0] freq_detect; //! 探测到频率cache1
reg [31:0] freq_detect_cnt;//! 实时频率探测计数
reg in_signal_last;
reg in_signal_rising_edge; //! 上升沿
reg [31:0] state; //! 频率捕获状态
reg [31:0] freq_detect; //! 探测到频率cache1
reg [31:0] freq_detect_cnt; //! 实时频率探测计数
//!in_signal_last 捕获
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
in_signal_last <= 0;
end
else begin
end else begin
in_signal_last <= pluse_input;
end
end
@ -35,63 +33,60 @@ module zutils_freq_detector_v2
//!边沿捕获
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
in_signal_rising_edge <= 0;
end
else begin
in_signal_rising_edge <= 0;
end else begin
if (in_signal_last == 0 && pluse_input == 1) begin
in_signal_rising_edge <= 1;
end
else if (in_signal_last == 1 && pluse_input == 0) begin
in_signal_rising_edge <= 0;
end
else begin
in_signal_rising_edge <= 0;
in_signal_rising_edge <= 1;
end else if (in_signal_last == 1 && pluse_input == 0) begin
in_signal_rising_edge <= 0;
end else begin
in_signal_rising_edge <= 0;
end
end
end
assign freq_detect_stable = (freq_detect <= freq_detect_cnt + freq_detect_bias + 1 && freq_detect >= freq_detect_cnt - freq_detect_bias - 1);
assign freq_detect_stable = ((freq_detect <= freq_detect_cnt + freq_detect_bias + 1 )&& (freq_detect >= freq_detect_cnt - freq_detect_bias - 1));
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= 0;
freq_detect <=0;
state <= 0;
freq_detect <= 0;
pluse_width_cnt <= 32'hffff_ffff;
end
else begin
end else begin
case (state)
0: begin
// 频率探测中
if(in_signal_rising_edge) begin
freq_detect <= freq_detect_cnt;
if (in_signal_rising_edge) begin
freq_detect <= freq_detect_cnt;
freq_detect_cnt <= 0;
if(freq_detect_stable) begin
state <= 1;
if (freq_detect_stable) begin
state <= 1;
pluse_width_cnt <= freq_detect;
end
else begin
pluse_width_cnt <= 32'hffff_ffff;
end
end
else begin
end else begin
pluse_width_cnt <= 32'hffff_ffff;
freq_detect_cnt <= freq_detect_cnt + 1;
end
end
1: begin
// 判断频率是否发生变化如果频率发生变化则重新探测
if(in_signal_rising_edge || freq_detect_cnt> freq_detect+ 1) begin
if (in_signal_rising_edge) begin
freq_detect_cnt <= 0;
if(!freq_detect_stable) begin
state <= 0;
if (!freq_detect_stable) begin
state <= 0;
freq_detect <= 32'hffff_ffff;
pluse_width_cnt <= 32'hffff_ffff;
end
end
else begin
end else if(freq_detect_cnt > freq_detect + freq_detect_bias + 1 )begin
freq_detect_cnt <= 0;
state <= 0;
freq_detect <= 32'hffff_ffff;
pluse_width_cnt <= 32'hffff_ffff;
end else begin
freq_detect_cnt <= freq_detect_cnt + 1;
end
end
default: begin
state <= 0;

47
source/src/zutils/zutils_multiplexer_8t1.v

@ -0,0 +1,47 @@
module zutils_multiplexer_8t1 (
input [31:0] chooseindex,
input wire signal0,
input wire signal1,
input wire signal2,
input wire signal3,
input wire signal4,
input wire signal5,
input wire signal6,
input wire signal7,
input wire signal8,
output reg signalout
);
always @(*) begin
case (chooseindex)
0: begin
signalout = signal0;
end
1: begin
signalout = signal1;
end
2: begin
signalout = signal2;
end
3: begin
signalout = signal3;
end
4: begin
signalout = signal4;
end
5: begin
signalout = signal5;
end
6: begin
signalout = signal6;
end
7: begin
signalout = signal7;
end
default: begin
signalout = 0;
end
endcase
end
endmodule
Loading…
Cancel
Save