diff --git a/ip_backup/20240321095414/ShiftRegister/.last_generated b/ip_backup/20240321095414/ShiftRegister/.last_generated new file mode 100644 index 0000000..9395fed --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/.last_generated @@ -0,0 +1,2 @@ +2024-03-20 17:08 +rev_1 \ No newline at end of file diff --git a/ip_backup/20240321095414/ShiftRegister/ShiftRegister.idf b/ip_backup/20240321095414/ShiftRegister/ShiftRegister.idf new file mode 100644 index 0000000..c2d79c8 --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/ShiftRegister.idf @@ -0,0 +1,92 @@ + + +
+ Pango + 06100103 + Distributed Shift Register + Distributed Shift Register + 1.2 + ShiftRegister + Logos + PGL22G + MBG324 + -6 + IP Compiler +
+ + + DATA_WIDTH + 1 + + + SHIFT_REG_TYPE + dynamic_latency + + + VARIABLE_MAX_DEPTH + 1024 + + + RST_TYPE + ASYNC + + + FIXED_DEPTH + 1024 + + + SHIFT_REG_TYPE_BOOL + true + + + + + din + din + input + left + + + addr + addr + input + left + 9 + 0 + + + clk + clk + input + left + + + rst + rst + input + left + + + dout + dout + output + right + + + + + + + + + + + + + + + + + + +
diff --git a/ip_backup/20240321095414/ShiftRegister/ShiftRegister.v b/ip_backup/20240321095414/ShiftRegister/ShiftRegister.v new file mode 100644 index 0000000..013fc56 --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/ShiftRegister.v @@ -0,0 +1,83 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) + + + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 PANGO MICROSYSTEMS, INC +// ALL RIGHTS REVERVED. +// +// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC. +// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY +// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER. +// +////////////////////////////////////////////////////////////////////////////// +// +// Library: +// Filename:ShiftRegister.v +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1 ns / 1 ps +module ShiftRegister + ( + din , + + addr , + + clk , + rst , + dout + ); + + localparam FIXED_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam VARIABLE_MAX_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam DATA_WIDTH = 1 ; // @IPC int 1,256 + + localparam SHIFT_REG_TYPE = "dynamic_latency" ; // @IPC enum fixed_latency,dynamic_latency + + localparam SHIFT_REG_TYPE_BOOL = 1 ; // @IPC bool + + localparam RST_TYPE = "ASYNC" ; // @IPC enum ASYNC,SYNC + + + localparam DEPTH = (SHIFT_REG_TYPE=="fixed_latency" ) ? FIXED_DEPTH : + (SHIFT_REG_TYPE=="dynamic_latency") ? VARIABLE_MAX_DEPTH : 0; + + + localparam ADDR_WIDTH = (DEPTH<=16) ? 4 : + (DEPTH<=32) ? 5 : + (DEPTH<=64) ? 6 : + (DEPTH<=128) ? 7 : + (DEPTH<=256) ? 8 : + (DEPTH<=512) ? 9 : 10 ; + + + input wire [DATA_WIDTH-1:0] din ; + + input wire [ADDR_WIDTH-1:0] addr ; + + input wire clk ; + input wire rst ; + output wire [DATA_WIDTH-1:0] dout ; + + +ipm_distributed_shiftregister_v1_2_ShiftRegister + #( + .FIXED_DEPTH (FIXED_DEPTH ) , + .VARIABLE_MAX_DEPTH (VARIABLE_MAX_DEPTH ) , + .DATA_WIDTH (DATA_WIDTH ) , + .SHIFT_REG_TYPE (SHIFT_REG_TYPE ) , + .RST_TYPE (RST_TYPE ) + )u_ipm_distributed_shiftregister_ShiftRegister + ( + .din (din ) , + + .addr (addr ) , + + .clk (clk ) , + .rst (rst ) , + .dout (dout ) + ); +endmodule diff --git a/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tb.v b/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tb.v new file mode 100644 index 0000000..614acae --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tb.v @@ -0,0 +1,168 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) + + + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 PANGO MICROSYSTEMS, INC +// ALL RIGHTS REVERVED. +// +// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC. +// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY +// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER. +// +////////////////////////////////////////////////////////////////////////////// +// +// Library: +// Filename:TB ShiftRegister_tb.v +////////////////////////////////////////////////////////////////////////////// + +`timescale 1ns / 1ps + +module ShiftRegister_tb (); + + localparam T_CLK_PERIOD = 10 ; //clock a half perid + localparam T_RST_TIME = 200 ; //reset time + + localparam FIXED_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam VARIABLE_MAX_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam DATA_WIDTH = 1 ; // @IPC int 1,256 + + localparam SHIFT_REG_TYPE = "dynamic_latency" ; // @IPC enum fixed_latency,dynamic_latency + + localparam SHIFT_REG_TYPE_BOOL = 1 ; // @IPC bool + + localparam RST_TYPE = "ASYNC" ; // @IPC enum ASYNC,SYNC + + + + localparam DEPTH = (SHIFT_REG_TYPE=="fixed_latency") ? FIXED_DEPTH : + (SHIFT_REG_TYPE=="dynamic_latency") ? VARIABLE_MAX_DEPTH : 0; + + + localparam ADDR_WIDTH = (DEPTH<=16) ? 4 : + (DEPTH<=32) ? 5 : + (DEPTH<=64) ? 6 : + (DEPTH<=128) ? 7 : + (DEPTH<=256) ? 8 : + (DEPTH<=512) ? 9 : 10 ; + + +// variable declaration + reg clk_tb ; + reg tb_rst ; + reg [ADDR_WIDTH-1:0] tb_addr ; + reg [ADDR_WIDTH-1:0] addr ; + reg [DATA_WIDTH-1:0] tb_wrdata ; + wire [DATA_WIDTH-1:0] tb_rddata ; + reg check_err ; + reg [2:0] results_cnt; + wire [DATA_WIDTH-1:0] tb_tmp ; + reg [ADDR_WIDTH-1:0] cnt ; + reg cmp_en ; + +assign tb_tmp = tb_rddata + DEPTH + 1; +//************************************************************ CGU **************************************************************************** +//generate clk_tb +initial +begin + + clk_tb = 0; + forever #(T_CLK_PERIOD/2) clk_tb = ~clk_tb; +end + + +//********************************************************* DGU ******************************************************************************** + +initial begin + + tb_addr = 0; + tb_wrdata = 0; + cnt = 0; + tb_rst = 1; + + addr = VARIABLE_MAX_DEPTH; + + #T_RST_TIME ; + tb_rst = 0; + #10 ; + $display("writing shiftregister"); + write_shiftregister; + #10; + $display("shiftregister Simulation done"); + if (|results_cnt) + $display("Simulation Failed due to Error Found.") ; + else + $display("Simulation Success.") ; + $finish ; +end + + +//***************************************************************** DUT INST ************************************************************************************** + +always@(posedge clk_tb or posedge tb_rst) begin + if(tb_rst) + check_err = 0; + else begin + cnt = cnt + 1; + if(cnt > DEPTH + 2 && tb_wrdata != tb_tmp && cmp_en) begin + check_err = 1; + end + else + check_err = 0; + end +end + +always @(posedge clk_tb or posedge tb_rst) +begin + if (tb_rst) + results_cnt <= 3'b000 ; + else if (&results_cnt) + results_cnt <= 3'b100 ; + else if (check_err) + results_cnt <= results_cnt + 3'd1 ; +end + +integer result_fid; +initial begin + result_fid = $fopen ("sim_results.log","a"); + $fmonitor(result_fid,"err_chk=%b",check_err); +end + +GTP_GRS GRS_INST( +.GRS_N(1'b1) +); +ShiftRegister U_ShiftRegister ( + + .addr (addr ), //input wire [`T_A_ADDR_WIDTH-1 : 0] + + .din (tb_wrdata ), //input wire [`T_A_DATA_WIDTH-1 : 0] + .dout (tb_rddata ), //output wire [`T_A_DATA_WIDTH-1 : 0] + .rst (tb_rst ), //input wire + .clk (clk_tb ) +); + +task write_shiftregister; + + integer i; + begin + tb_wrdata = 0; + tb_addr = 0; + cmp_en = 0; + + while ( tb_addr < 2**ADDR_WIDTH - 1) + + begin + @(posedge clk_tb); + tb_addr = tb_addr + 1'b1; + tb_wrdata = tb_wrdata + 1'b1; + cmp_en = 1'b1; + end + cmp_en = 0; + end +endtask + +endmodule + diff --git a/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tmpl.v b/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tmpl.v new file mode 100644 index 0000000..3903e9f --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tmpl.v @@ -0,0 +1,15 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) +// Instantiation Template +// +// Insert the following codes into your Verilog file. +// * Change the_instance_name to your own instance name. +// * Change the signal names in the port associations + + +ShiftRegister the_instance_name ( + .din(din), // input + .addr(addr), // input [9:0] + .clk(clk), // input + .rst(rst), // input + .dout(dout) // output +); diff --git a/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tmpl.vhdl b/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tmpl.vhdl new file mode 100644 index 0000000..2e69b87 --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/ShiftRegister_tmpl.vhdl @@ -0,0 +1,27 @@ +-- Created by IP Generator (Version 2021.1-SP7 build 86875) +-- Instantiation Template +-- +-- Insert the following codes into your VHDL file. +-- * Change the_instance_name to your own instance name. +-- * Change the net names in the port map. + + +COMPONENT ShiftRegister + PORT ( + din : IN STD_LOGIC; + addr : IN STD_LOGIC_VECTOR(9 DOWNTO 0); + clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + dout : OUT STD_LOGIC + ); +END COMPONENT; + + +the_instance_name : ShiftRegister + PORT MAP ( + din => din, + addr => addr, + clk => clk, + rst => rst, + dout => dout + ); diff --git a/ip_backup/20240321095414/ShiftRegister/generate.log b/ip_backup/20240321095414/ShiftRegister/generate.log new file mode 100644 index 0000000..a45f5e5 --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/generate.log @@ -0,0 +1,21 @@ +IP Generator (Version 2021.1-SP7 build 86875) +Check out license ... +Start generating at 2024-03-20 17:08 +Instance: ShiftRegister (D:\workspace\p_lusterinc\xsync_fpge\ipcore\ShiftRegister\ShiftRegister.idf) +IP: Distributed Shift Register (1.2) +Part: Logos-PGL22G-MBG324--6 +Create directory 'rtl' ... +Copy 'rtl\ipm_distributed_sdpram_v1_2.v.xml' to 'rtl' ... +Copy 'rtl\ipm_distributed_shiftregister_v1_2.v.xml' to 'rtl' ... +Compile file 'rtl\ipm_distributed_sdpram_v1_2.v.xml' to 'rtl\ipm_distributed_sdpram_v1_2_ShiftRegister.v' ... +Compile file 'rtl\ipm_distributed_shiftregister_v1_2.v.xml' to 'rtl\ipm_distributed_shiftregister_v1_2_ShiftRegister.v' ... +Copy 'ipm_distributed_shiftregister_wrapper_v1_2.v.xml' ... +Copy 'ipm_distributed_shiftregister_wrapper_v1_2_tb.v.xml' ... +Compile file 'ipm_distributed_shiftregister_wrapper_v1_2.v.xml' to 'ShiftRegister.v' ... +Found top module 'ShiftRegister' in file 'ShiftRegister.v'. +Compile file 'ipm_distributed_shiftregister_wrapper_v1_2_tb.v.xml' to 'ShiftRegister_tb.v' ... +Create template file 'ShiftRegister_tmpl.v' ... +Create template file 'ShiftRegister_tmpl.vhdl' ... +There are 3 source files to synthesize. +Synthesis is disabled. +Done: 0 error(s), 0 warning(s) diff --git a/ip_backup/20240321095414/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v b/ip_backup/20240321095414/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v new file mode 100644 index 0000000..1869cb5 --- /dev/null +++ b/ip_backup/20240321095414/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v @@ -0,0 +1,111 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) + + + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 PANGO MICROSYSTEMS, INC +// ALL RIGHTS REVERVED. +// +// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC. +// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY +// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER. +// +////////////////////////////////////////////////////////////////////////////// +// +// Library: +// Filename:ipm_distributed_sdpram_v1_2_ShiftRegister.v +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1 ns / 1 ps + +module ipm_distributed_sdpram_v1_2_ShiftRegister + #( + parameter ADDR_WIDTH = 4 , //address width range:4-10 + parameter DATA_WIDTH = 4 , //data width range:1-256 + parameter RST_TYPE = "ASYNC" , //reset type "ASYNC" "SYNC" + parameter OUT_REG = 0 , //output options :non_register(0) register(1) + parameter INIT_FILE = "NONE" , //legal value:"NONE" or "initial file name" + parameter FILE_FORMAT = "BIN" //initial data format : "BIN" or "HEX" + ) + ( + input wire [DATA_WIDTH-1:0] wr_data , + input wire [ADDR_WIDTH-1:0] wr_addr , + input wire [ADDR_WIDTH-1:0] rd_addr , + input wire wr_clk , + input wire rd_clk , + input wire wr_en , + input wire rst , + output wire [DATA_WIDTH-1:0] rd_data + )/* synthesis syn_ramstyle = "select_ram" */; + + +wire asyn_rst ; +wire syn_rst ; +wire [DATA_WIDTH-1:0] q ; +reg [DATA_WIDTH-1:0] q_reg ; + +reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; + +//***********************************************************************reset******************************************************************* +assign asyn_rst = (RST_TYPE == "ASYNC") ? rst : 0 ; +assign syn_rst = (RST_TYPE == "SYNC" ) ? rst : 0 ; + +//initialize sdpram +generate + integer i,j; + if (INIT_FILE != "NONE") begin + if (FILE_FORMAT == "BIN") begin + initial begin + $readmemb(INIT_FILE,mem); + end + end + else if (FILE_FORMAT == "HEX") begin + initial begin + $readmemh(INIT_FILE,mem); + end + end + end + else begin + initial begin + for (i=0;i<2**ADDR_WIDTH;i=i+1) begin + for (j=0;j + +
+ Pango + 06100103 + Distributed Shift Register + Distributed Shift Register + 1.2 + ShiftRegister + Logos + PGL22G + MBG324 + -6 + IP Compiler +
+ + + DATA_WIDTH + 1 + + + SHIFT_REG_TYPE + dynamic_latency + + + VARIABLE_MAX_DEPTH + 1024 + + + RST_TYPE + ASYNC + + + FIXED_DEPTH + 1024 + + + SHIFT_REG_TYPE_BOOL + true + + + + + din + din + input + left + + + addr + addr + input + left + 9 + 0 + + + clk + clk + input + left + + + rst + rst + input + left + + + dout + dout + output + right + + + + + + + + + + + + + + + + + + +
diff --git a/ipcore/ShiftRegister/ShiftRegister.v b/ipcore/ShiftRegister/ShiftRegister.v new file mode 100644 index 0000000..013fc56 --- /dev/null +++ b/ipcore/ShiftRegister/ShiftRegister.v @@ -0,0 +1,83 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) + + + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 PANGO MICROSYSTEMS, INC +// ALL RIGHTS REVERVED. +// +// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC. +// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY +// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER. +// +////////////////////////////////////////////////////////////////////////////// +// +// Library: +// Filename:ShiftRegister.v +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1 ns / 1 ps +module ShiftRegister + ( + din , + + addr , + + clk , + rst , + dout + ); + + localparam FIXED_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam VARIABLE_MAX_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam DATA_WIDTH = 1 ; // @IPC int 1,256 + + localparam SHIFT_REG_TYPE = "dynamic_latency" ; // @IPC enum fixed_latency,dynamic_latency + + localparam SHIFT_REG_TYPE_BOOL = 1 ; // @IPC bool + + localparam RST_TYPE = "ASYNC" ; // @IPC enum ASYNC,SYNC + + + localparam DEPTH = (SHIFT_REG_TYPE=="fixed_latency" ) ? FIXED_DEPTH : + (SHIFT_REG_TYPE=="dynamic_latency") ? VARIABLE_MAX_DEPTH : 0; + + + localparam ADDR_WIDTH = (DEPTH<=16) ? 4 : + (DEPTH<=32) ? 5 : + (DEPTH<=64) ? 6 : + (DEPTH<=128) ? 7 : + (DEPTH<=256) ? 8 : + (DEPTH<=512) ? 9 : 10 ; + + + input wire [DATA_WIDTH-1:0] din ; + + input wire [ADDR_WIDTH-1:0] addr ; + + input wire clk ; + input wire rst ; + output wire [DATA_WIDTH-1:0] dout ; + + +ipm_distributed_shiftregister_v1_2_ShiftRegister + #( + .FIXED_DEPTH (FIXED_DEPTH ) , + .VARIABLE_MAX_DEPTH (VARIABLE_MAX_DEPTH ) , + .DATA_WIDTH (DATA_WIDTH ) , + .SHIFT_REG_TYPE (SHIFT_REG_TYPE ) , + .RST_TYPE (RST_TYPE ) + )u_ipm_distributed_shiftregister_ShiftRegister + ( + .din (din ) , + + .addr (addr ) , + + .clk (clk ) , + .rst (rst ) , + .dout (dout ) + ); +endmodule diff --git a/ipcore/ShiftRegister/ShiftRegister_tb.v b/ipcore/ShiftRegister/ShiftRegister_tb.v new file mode 100644 index 0000000..614acae --- /dev/null +++ b/ipcore/ShiftRegister/ShiftRegister_tb.v @@ -0,0 +1,168 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) + + + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 PANGO MICROSYSTEMS, INC +// ALL RIGHTS REVERVED. +// +// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC. +// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY +// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER. +// +////////////////////////////////////////////////////////////////////////////// +// +// Library: +// Filename:TB ShiftRegister_tb.v +////////////////////////////////////////////////////////////////////////////// + +`timescale 1ns / 1ps + +module ShiftRegister_tb (); + + localparam T_CLK_PERIOD = 10 ; //clock a half perid + localparam T_RST_TIME = 200 ; //reset time + + localparam FIXED_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam VARIABLE_MAX_DEPTH = 1024 ; // @IPC int 1,1024 + + localparam DATA_WIDTH = 1 ; // @IPC int 1,256 + + localparam SHIFT_REG_TYPE = "dynamic_latency" ; // @IPC enum fixed_latency,dynamic_latency + + localparam SHIFT_REG_TYPE_BOOL = 1 ; // @IPC bool + + localparam RST_TYPE = "ASYNC" ; // @IPC enum ASYNC,SYNC + + + + localparam DEPTH = (SHIFT_REG_TYPE=="fixed_latency") ? FIXED_DEPTH : + (SHIFT_REG_TYPE=="dynamic_latency") ? VARIABLE_MAX_DEPTH : 0; + + + localparam ADDR_WIDTH = (DEPTH<=16) ? 4 : + (DEPTH<=32) ? 5 : + (DEPTH<=64) ? 6 : + (DEPTH<=128) ? 7 : + (DEPTH<=256) ? 8 : + (DEPTH<=512) ? 9 : 10 ; + + +// variable declaration + reg clk_tb ; + reg tb_rst ; + reg [ADDR_WIDTH-1:0] tb_addr ; + reg [ADDR_WIDTH-1:0] addr ; + reg [DATA_WIDTH-1:0] tb_wrdata ; + wire [DATA_WIDTH-1:0] tb_rddata ; + reg check_err ; + reg [2:0] results_cnt; + wire [DATA_WIDTH-1:0] tb_tmp ; + reg [ADDR_WIDTH-1:0] cnt ; + reg cmp_en ; + +assign tb_tmp = tb_rddata + DEPTH + 1; +//************************************************************ CGU **************************************************************************** +//generate clk_tb +initial +begin + + clk_tb = 0; + forever #(T_CLK_PERIOD/2) clk_tb = ~clk_tb; +end + + +//********************************************************* DGU ******************************************************************************** + +initial begin + + tb_addr = 0; + tb_wrdata = 0; + cnt = 0; + tb_rst = 1; + + addr = VARIABLE_MAX_DEPTH; + + #T_RST_TIME ; + tb_rst = 0; + #10 ; + $display("writing shiftregister"); + write_shiftregister; + #10; + $display("shiftregister Simulation done"); + if (|results_cnt) + $display("Simulation Failed due to Error Found.") ; + else + $display("Simulation Success.") ; + $finish ; +end + + +//***************************************************************** DUT INST ************************************************************************************** + +always@(posedge clk_tb or posedge tb_rst) begin + if(tb_rst) + check_err = 0; + else begin + cnt = cnt + 1; + if(cnt > DEPTH + 2 && tb_wrdata != tb_tmp && cmp_en) begin + check_err = 1; + end + else + check_err = 0; + end +end + +always @(posedge clk_tb or posedge tb_rst) +begin + if (tb_rst) + results_cnt <= 3'b000 ; + else if (&results_cnt) + results_cnt <= 3'b100 ; + else if (check_err) + results_cnt <= results_cnt + 3'd1 ; +end + +integer result_fid; +initial begin + result_fid = $fopen ("sim_results.log","a"); + $fmonitor(result_fid,"err_chk=%b",check_err); +end + +GTP_GRS GRS_INST( +.GRS_N(1'b1) +); +ShiftRegister U_ShiftRegister ( + + .addr (addr ), //input wire [`T_A_ADDR_WIDTH-1 : 0] + + .din (tb_wrdata ), //input wire [`T_A_DATA_WIDTH-1 : 0] + .dout (tb_rddata ), //output wire [`T_A_DATA_WIDTH-1 : 0] + .rst (tb_rst ), //input wire + .clk (clk_tb ) +); + +task write_shiftregister; + + integer i; + begin + tb_wrdata = 0; + tb_addr = 0; + cmp_en = 0; + + while ( tb_addr < 2**ADDR_WIDTH - 1) + + begin + @(posedge clk_tb); + tb_addr = tb_addr + 1'b1; + tb_wrdata = tb_wrdata + 1'b1; + cmp_en = 1'b1; + end + cmp_en = 0; + end +endtask + +endmodule + diff --git a/ipcore/ShiftRegister/ShiftRegister_tmpl.v b/ipcore/ShiftRegister/ShiftRegister_tmpl.v new file mode 100644 index 0000000..3903e9f --- /dev/null +++ b/ipcore/ShiftRegister/ShiftRegister_tmpl.v @@ -0,0 +1,15 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) +// Instantiation Template +// +// Insert the following codes into your Verilog file. +// * Change the_instance_name to your own instance name. +// * Change the signal names in the port associations + + +ShiftRegister the_instance_name ( + .din(din), // input + .addr(addr), // input [9:0] + .clk(clk), // input + .rst(rst), // input + .dout(dout) // output +); diff --git a/ipcore/ShiftRegister/ShiftRegister_tmpl.vhdl b/ipcore/ShiftRegister/ShiftRegister_tmpl.vhdl new file mode 100644 index 0000000..2e69b87 --- /dev/null +++ b/ipcore/ShiftRegister/ShiftRegister_tmpl.vhdl @@ -0,0 +1,27 @@ +-- Created by IP Generator (Version 2021.1-SP7 build 86875) +-- Instantiation Template +-- +-- Insert the following codes into your VHDL file. +-- * Change the_instance_name to your own instance name. +-- * Change the net names in the port map. + + +COMPONENT ShiftRegister + PORT ( + din : IN STD_LOGIC; + addr : IN STD_LOGIC_VECTOR(9 DOWNTO 0); + clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + dout : OUT STD_LOGIC + ); +END COMPONENT; + + +the_instance_name : ShiftRegister + PORT MAP ( + din => din, + addr => addr, + clk => clk, + rst => rst, + dout => dout + ); diff --git a/ipcore/ShiftRegister/generate.log b/ipcore/ShiftRegister/generate.log new file mode 100644 index 0000000..70a5932 --- /dev/null +++ b/ipcore/ShiftRegister/generate.log @@ -0,0 +1,21 @@ +IP Generator (Version 2021.1-SP7 build 86875) +Check out license ... +Start generating at 2024-03-21 09:54 +Instance: ShiftRegister (D:\workspace\p_lusterinc\xsync_fpge\ipcore\ShiftRegister\ShiftRegister.idf) +IP: Distributed Shift Register (1.2) +Part: Logos-PGL22G-MBG324--6 +Create directory 'rtl' ... +Copy 'rtl\ipm_distributed_sdpram_v1_2.v.xml' to 'rtl' ... +Copy 'rtl\ipm_distributed_shiftregister_v1_2.v.xml' to 'rtl' ... +Compile file 'rtl\ipm_distributed_sdpram_v1_2.v.xml' to 'rtl\ipm_distributed_sdpram_v1_2_ShiftRegister.v' ... +Compile file 'rtl\ipm_distributed_shiftregister_v1_2.v.xml' to 'rtl\ipm_distributed_shiftregister_v1_2_ShiftRegister.v' ... +Copy 'ipm_distributed_shiftregister_wrapper_v1_2.v.xml' ... +Copy 'ipm_distributed_shiftregister_wrapper_v1_2_tb.v.xml' ... +Compile file 'ipm_distributed_shiftregister_wrapper_v1_2.v.xml' to 'ShiftRegister.v' ... +Found top module 'ShiftRegister' in file 'ShiftRegister.v'. +Compile file 'ipm_distributed_shiftregister_wrapper_v1_2_tb.v.xml' to 'ShiftRegister_tb.v' ... +Create template file 'ShiftRegister_tmpl.v' ... +Create template file 'ShiftRegister_tmpl.vhdl' ... +There are 3 source files to synthesize. +Synthesis is disabled. +Done: 0 error(s), 0 warning(s) diff --git a/ipcore/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v b/ipcore/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v new file mode 100644 index 0000000..1869cb5 --- /dev/null +++ b/ipcore/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v @@ -0,0 +1,111 @@ +// Created by IP Generator (Version 2021.1-SP7 build 86875) + + + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 PANGO MICROSYSTEMS, INC +// ALL RIGHTS REVERVED. +// +// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC. +// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY +// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER. +// +////////////////////////////////////////////////////////////////////////////// +// +// Library: +// Filename:ipm_distributed_sdpram_v1_2_ShiftRegister.v +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +`timescale 1 ns / 1 ps + +module ipm_distributed_sdpram_v1_2_ShiftRegister + #( + parameter ADDR_WIDTH = 4 , //address width range:4-10 + parameter DATA_WIDTH = 4 , //data width range:1-256 + parameter RST_TYPE = "ASYNC" , //reset type "ASYNC" "SYNC" + parameter OUT_REG = 0 , //output options :non_register(0) register(1) + parameter INIT_FILE = "NONE" , //legal value:"NONE" or "initial file name" + parameter FILE_FORMAT = "BIN" //initial data format : "BIN" or "HEX" + ) + ( + input wire [DATA_WIDTH-1:0] wr_data , + input wire [ADDR_WIDTH-1:0] wr_addr , + input wire [ADDR_WIDTH-1:0] rd_addr , + input wire wr_clk , + input wire rd_clk , + input wire wr_en , + input wire rst , + output wire [DATA_WIDTH-1:0] rd_data + )/* synthesis syn_ramstyle = "select_ram" */; + + +wire asyn_rst ; +wire syn_rst ; +wire [DATA_WIDTH-1:0] q ; +reg [DATA_WIDTH-1:0] q_reg ; + +reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; + +//***********************************************************************reset******************************************************************* +assign asyn_rst = (RST_TYPE == "ASYNC") ? rst : 0 ; +assign syn_rst = (RST_TYPE == "SYNC" ) ? rst : 0 ; + +//initialize sdpram +generate + integer i,j; + if (INIT_FILE != "NONE") begin + if (FILE_FORMAT == "BIN") begin + initial begin + $readmemb(INIT_FILE,mem); + end + end + else if (FILE_FORMAT == "HEX") begin + initial begin + $readmemh(INIT_FILE,mem); + end + end + end + else begin + initial begin + for (i=0;i<2**ADDR_WIDTH;i=i+1) begin + for (j=0;j) at Wed Mar 6 00:21:26 2024") + (_comment "Generated by Fabric Compiler (version on 2021.1-SP7) at Fri Mar 22 22:10:41 2024") (_version "1.0.5") (_status "initial") (_project @@ -19,7 +19,7 @@ (_input (_file "source/src/top.v" + "Top:" (_format verilog) - (_timespec "2024-03-05T23:54:38") + (_timespec "2024-03-22T22:10:39") ) (_file "source/src/spi_reg_reader.v" (_format verilog) @@ -143,7 +143,7 @@ ) (_file "source/src/input/ttl_input.v" (_format verilog) - (_timespec "2024-03-05T10:18:22") + (_timespec "2024-03-22T21:00:04") ) (_file "source/src/zutils/ztuils_sig_devide.v" (_format verilog) @@ -175,7 +175,7 @@ ) (_file "source/src/spi_reg_bus.v" (_format verilog) - (_timespec "2024-03-04T18:25:03") + (_timespec "2024-03-21T15:13:16") ) (_file "source/src/internal/internal_timecode_generator.v" (_format verilog) @@ -207,12 +207,28 @@ ) (_file "source/src/output/camera_sync_signal_output.v" (_format verilog) - (_timespec "2024-03-05T22:17:42") + (_timespec "2024-03-21T15:01:29") ) (_file "source/src/business/record_sig_generator.v" (_format verilog) (_timespec "2024-03-06T00:10:36") ) + (_file "source/src/sys_signal_delayer.v" + (_format verilog) + (_timespec "2024-03-22T21:08:01") + ) + (_file "source/src/zutils/zutils_sig_delayer.v" + (_format verilog) + (_timespec "2024-03-21T17:36:08") + ) + (_file "source/src/zutils/zutils_sig_delayer_v2.v" + (_format verilog) + (_timespec "2024-03-22T22:10:19") + ) + (_file "source/src/zutils/zutils_pluse_delayer.v" + (_format verilog) + (_timespec "2024-03-22T22:01:26") + ) ) ) (_widget wgt_my_ips_src @@ -226,6 +242,18 @@ (_ip "ipcore/genlock_sig_gen_pll/genlock_sig_gen_pll.idf" (_timespec "2024-02-27T20:28:55") ) + (_ip "ipcore/ShiftRegister/ShiftRegister.idf" + (_timespec "2024-03-21T09:54:18") + (_ip_source_item "ipcore/ShiftRegister/rtl/ipm_distributed_sdpram_v1_2_ShiftRegister.v" + (_timespec "2024-03-21T09:54:18") + ) + (_ip_source_item "ipcore/ShiftRegister/rtl/ipm_distributed_shiftregister_v1_2_ShiftRegister.v" + (_timespec "2024-03-21T09:54:18") + ) + (_ip_source_item "ipcore/ShiftRegister/ShiftRegister.v" + (_timespec "2024-03-21T09:54:18") + ) + ) ) ) (_widget wgt_import_logic_con_file @@ -279,21 +307,21 @@ ) (_task tsk_compile (_command cmd_compile - (_gci_state (_integer 2)) + (_gci_state (_integer 3)) (_db_output (_file "compile/Top_comp.adf" (_format adif) - (_timespec "2024-03-06T00:17:50") + (_timespec "2024-03-22T22:04:52") ) ) (_output (_file "compile/Top.cmr" (_format verilog) - (_timespec "2024-03-06T00:17:48") + (_timespec "2024-03-22T22:04:51") ) (_file "compile/cmr.db" (_format text) - (_timespec "2024-03-06T00:17:50") + (_timespec "2024-03-22T22:04:52") ) ) ) @@ -303,27 +331,27 @@ ) (_task tsk_synthesis (_command cmd_synthesize - (_gci_state (_integer 2)) + (_gci_state (_integer 3)) (_option ads (_switch ON)) (_option selected_syn_tool_opt (_integer 2)) (_db_output (_file "synthesize/Top_syn.adf" (_format adif) - (_timespec "2024-03-06T00:19:28") + (_timespec "2024-03-22T22:04:57") ) ) (_output (_file "synthesize/Top_syn.vm" (_format structural_verilog) - (_timespec "2024-03-06T00:19:37") + (_timespec "2024-03-22T22:04:57") ) (_file "synthesize/Top.snr" (_format text) - (_timespec "2024-03-06T00:19:42") + (_timespec "2024-03-22T22:04:58") ) (_file "synthesize/snr.db" (_format text) - (_timespec "2024-03-06T00:19:42") + (_timespec "2024-03-22T22:04:58") ) ) ) @@ -340,25 +368,25 @@ ) (_task tsk_devmap (_command cmd_devmap - (_gci_state (_integer 2)) + (_gci_state (_integer 3)) (_db_output (_file "device_map/Top_map.adf" (_format adif) - (_timespec "2024-03-06T00:19:47") + (_timespec "2024-03-22T22:05:00") ) ) (_output (_file "device_map/Top_dmr.prt" (_format text) - (_timespec "2024-03-06T00:19:45") + (_timespec "2024-03-22T22:05:00") ) (_file "device_map/Top.dmr" (_format text) - (_timespec "2024-03-06T00:19:47") + (_timespec "2024-03-22T22:05:00") ) (_file "device_map/dmr.db" (_format text) - (_timespec "2024-03-06T00:19:47") + (_timespec "2024-03-22T22:05:01") ) ) ) @@ -367,7 +395,7 @@ (_input (_file "device_map/led_test.pcf" (_format pcf) - (_timespec "2024-03-06T00:19:47") + (_timespec "2024-03-22T22:05:00") ) ) ) @@ -377,38 +405,38 @@ ) (_task tsk_pnr (_command cmd_pnr - (_gci_state (_integer 2)) + (_gci_state (_integer 3)) (_option mode (_string "fast")) (_db_output (_file "place_route/Top_pnr.adf" (_format adif) - (_timespec "2024-03-06T00:21:07") + (_timespec "2024-03-22T22:05:08") ) ) (_output (_file "place_route/Top.prr" (_format text) - (_timespec "2024-03-06T00:21:07") + (_timespec "2024-03-22T22:05:08") ) (_file "place_route/Top_prr.prt" (_format text) - (_timespec "2024-03-06T00:21:07") + (_timespec "2024-03-22T22:05:08") ) (_file "place_route/clock_utilization.txt" (_format text) - (_timespec "2024-03-06T00:21:07") + (_timespec "2024-03-22T22:05:08") ) (_file "place_route/Top_plc.adf" (_format adif) - (_timespec "2024-03-06T00:20:03") + (_timespec "2024-03-22T22:05:05") ) (_file "place_route/Top_pnr.netlist" (_format text) - (_timespec "2024-03-06T00:21:07") + (_timespec "2024-03-22T22:05:08") ) (_file "place_route/prr.db" (_format text) - (_timespec "2024-03-06T00:21:08") + (_timespec "2024-03-22T22:05:09") ) ) ) @@ -439,23 +467,23 @@ ) (_task tsk_gen_bitstream (_command cmd_gen_bitstream - (_gci_state (_integer 2)) + (_gci_state (_integer 3)) (_output (_file "generate_bitstream/Top.sbit" (_format text) - (_timespec "2024-03-06T00:21:26") + (_timespec "2024-03-22T22:05:15") ) (_file "generate_bitstream/Top.smsk" (_format text) - (_timespec "2024-03-06T00:21:26") + (_timespec "2024-03-22T22:05:15") ) (_file "generate_bitstream/Top.bgr" (_format text) - (_timespec "2024-03-06T00:21:26") + (_timespec "2024-03-22T22:05:15") ) (_file "generate_bitstream/bgr.db" (_format text) - (_timespec "2024-03-06T00:21:26") + (_timespec "2024-03-22T22:05:15") ) ) ) diff --git a/source/src/config.v b/source/src/config.v index 98ba679..84604aa 100644 --- a/source/src/config.v +++ b/source/src/config.v @@ -16,6 +16,7 @@ `define REGADDOFF__SYS_GENLOCK 16'h0410 `define REGADDOFF__SYS_CLOCK 16'h0420 `define REGADDOFF__RECORD_SIG_GENERATOR 16'h0500 +`define REGADDOFF__DELAYER 16'h0600 `define FREQ_DETECT_BIAS_DEFAULT 32'd10 diff --git a/source/src/output/camera_sync_signal_output.v b/source/src/output/camera_sync_signal_output.v index 8d41a82..df82a13 100644 --- a/source/src/output/camera_sync_signal_output.v +++ b/source/src/output/camera_sync_signal_output.v @@ -15,7 +15,7 @@ module camera_sync_signal_output #( input record_en_sig, output stm32if_camera_sync_out, //ttl输出信号 - output stm32if_record_sync_out // + output stm32if_record_state_change_sig // ); /******************************************************************************* @@ -78,6 +78,6 @@ module camera_sync_signal_output #( ); assign stm32if_camera_sync_out = frame_sig_fa_process; - assign stm32if_record_sync_out = record_en_sig; + assign stm32if_record_state_change_sig = record_en_sig; endmodule diff --git a/source/src/spi_reg_bus.v b/source/src/spi_reg_bus.v index 6a80be6..bfd13ed 100644 --- a/source/src/spi_reg_bus.v +++ b/source/src/spi_reg_bus.v @@ -30,7 +30,8 @@ module spi_reg_bus ( input [31:0] rd_data_module_sys_timecode, input [31:0] rd_data_module_sys_genlock, input [31:0] rd_data_module_sys_clock, - input [31:0] rd_data_module_record_sig_generator + input [31:0] rd_data_module_record_sig_generator, + input [31:0] rd_data_module_sys_signal_delayer ); reg [31:0] rd_data; @@ -71,6 +72,7 @@ module spi_reg_bus ( `REGADDOFF__SYS_GENLOCK: rd_data <= rd_data_module_sys_genlock; `REGADDOFF__SYS_CLOCK: rd_data <= rd_data_module_sys_clock; `REGADDOFF__RECORD_SIG_GENERATOR: rd_data <= rd_data_module_record_sig_generator; + `REGADDOFF__DELAYER: rd_data <= rd_data_module_sys_signal_delayer; default: rd_data <= 0; endcase diff --git a/source/src/sys_signal_delayer.v b/source/src/sys_signal_delayer.v new file mode 100644 index 0000000..99bcae4 --- /dev/null +++ b/source/src/sys_signal_delayer.v @@ -0,0 +1,266 @@ +module sys_signal_delayer #( + parameter REG_START_ADD = 0, + parameter SYS_CLOCK_FREQ = 10000000 +) ( + + input clk, //! 时钟输入 + input rst_n, //! 复位输入 + + input [31:0] addr, //! 寄存器地址 + input [31:0] wr_data, //! 写入数据 + input wr_en, //! 写使能 + output wire [31:0] rd_data, //! 读出数据 + + /******************************************************************************* + * 输入信号延迟 * + *******************************************************************************/ + input sync_ttl_in1, + input sync_ttl_in2, + input sync_ttl_in3, + input sync_ttl_in4, + input timecode_headphone_in, + input timecode_bnc_in, + + input genlock_in_hsync, + input genlock_in_vsync, + input genlock_in_fsync, + + output af_delay__sync_ttl_in1, + output af_delay__sync_ttl_in2, + output af_delay__sync_ttl_in3, + output af_delay__sync_ttl_in4, + output af_delay__timecode_headphone_in, + output af_delay__timecode_bnc_in, + + output af_delay__genlock_in_hsync, + output af_delay__genlock_in_vsync, + output af_delay__genlock_in_fsync, + + /******************************************************************************* + * 输出接口延迟 * + *******************************************************************************/ + + output sync_ttl_out1, + output sync_ttl_out2, + output sync_ttl_out3, + output sync_ttl_out4, + + output stm32if_start_signal_out, + output stm32if_camera_sync_out, + output stm32if_timecode_sync_out, + + input before_delay__sync_ttl_out1, + input before_delay__sync_ttl_out2, + input before_delay__sync_ttl_out3, + input before_delay__sync_ttl_out4, + + input before_delay__stm32if_start_signal_out, + input before_delay__stm32if_camera_sync_out, + input before_delay__stm32if_timecode_sync_out + +); + + + reg [31:0] r1_ctrl; + reg [31:0] r2_input_delay_cnt; + reg [31:0] r3_input_delay_freq_div; + reg [31:0] r4_output_delay_cnt; + reg [31:0] r5_output_delay_freq_div; + + 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 (r1_ctrl), + .reg2 (r2_input_delay_cnt), + .reg3 (r3_input_delay_freq_div), + .reg4 (r4_output_delay_cnt), + .reg5 (r5_output_delay_freq_div), + .reg_wr_sig(reg_wr_sig), + .reg_index (reg_wr_index) + ); + + reg delayer_rst_n_ctrl; + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + r1_ctrl <= 32'hffff_ffff; + r2_input_delay_cnt <= 32'd100; + r3_input_delay_freq_div <= 1; + r4_output_delay_cnt <= 0; + r5_output_delay_freq_div <= 1; + delayer_rst_n_ctrl <= 1; + end else begin + if (reg_wr_sig) begin + case (reg_wr_index) + 1: begin + r1_ctrl <= wr_data; + delayer_rst_n_ctrl <= 0; + end + 2: r2_input_delay_cnt <= wr_data; + 3: r3_input_delay_freq_div <= wr_data; + 4: r4_output_delay_cnt <= wr_data; + 5: r5_output_delay_freq_div <= wr_data; + default: begin + end + endcase + end else begin + delayer_rst_n_ctrl <= 1; + end + end + end + + + + assign delayer_rst_n = delayer_rst_n_ctrl & rst_n; + zutils_sig_delayer_v2 sig_delayer_inst ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (sync_ttl_in1), + .out (af_delay__sync_ttl_in1) + ); + + zutils_sig_delayer_v2 sig_delayer_inst1 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (sync_ttl_in2), + .out (af_delay__sync_ttl_in2) + ); + + zutils_sig_delayer_v2 sig_delayer_inst2 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (sync_ttl_in3), + .out (af_delay__sync_ttl_in3) + ); + + zutils_sig_delayer_v2 sig_delayer_inst3 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (sync_ttl_in4), + .out (af_delay__sync_ttl_in4) + ); + + zutils_sig_delayer_v2 sig_delayer_inst4 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (timecode_headphone_in), + .out (af_delay__timecode_headphone_in) + ); + + zutils_sig_delayer_v2 sig_delayer_inst5 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (timecode_bnc_in), + .out (af_delay__timecode_bnc_in) + ); + + zutils_sig_delayer_v2 sig_delayer_inst6 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (genlock_in_hsync), + .out (af_delay__genlock_in_hsync) + ); + + zutils_sig_delayer_v2 sig_delayer_inst7 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (genlock_in_vsync), + .out (af_delay__genlock_in_vsync) + ); + + zutils_sig_delayer_v2 sig_delayer_inst8 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r2_input_delay_cnt), + .freq_division(r3_input_delay_freq_div), + .in (genlock_in_fsync), + .out (af_delay__genlock_in_fsync) + ); + + zutils_sig_delayer_v2 sig_delayer_inst9 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__sync_ttl_out1), + .out (sync_ttl_out1) + ); + + zutils_sig_delayer_v2 sig_delayer_inst10 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__sync_ttl_out2), + .out (sync_ttl_out2) + ); + + zutils_sig_delayer_v2 sig_delayer_inst11 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__sync_ttl_out3), + .out (sync_ttl_out3) + ); + + zutils_sig_delayer_v2 sig_delayer_inst12 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__sync_ttl_out4), + .out (sync_ttl_out4) + ); + + zutils_sig_delayer_v2 sig_delayer_inst13 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__stm32if_start_signal_out), + .out (stm32if_start_signal_out) + ); + + zutils_sig_delayer_v2 sig_delayer_inst14 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__stm32if_camera_sync_out), + .out (stm32if_camera_sync_out) + ); + + zutils_sig_delayer_v2 sig_delayer_inst15 ( + .clk (clk), + .rst_n (delayer_rst_n), + .delay_cnt (r4_output_delay_cnt), + .freq_division(r5_output_delay_freq_div), + .in (before_delay__stm32if_timecode_sync_out), + .out (stm32if_timecode_sync_out) + ); + + +endmodule diff --git a/source/src/top.v b/source/src/top.v index 58ecaf6..a4d644a 100644 --- a/source/src/top.v +++ b/source/src/top.v @@ -109,6 +109,9 @@ module Top ( wire [31:0] rd_data_module_sys_clock; //! 模块寄存器数据总线读数据 wire [31:0] rd_data_module_record_sig_generator; //! 模块寄存器数据总线读数据 + wire [31:0] rd_data_module_sys_signal_delayer; //! 模块寄存器数据总线读数据 + + //内部信号 wire signal_logic0; //! 逻辑0 wire signal_logic1; //! 逻辑1 @@ -205,7 +208,8 @@ module Top ( .rd_data_module_sys_timecode (rd_data_module_sys_timecode), .rd_data_module_sys_genlock (rd_data_module_sys_genlock), .rd_data_module_sys_clock (rd_data_module_sys_clock), - .rd_data_module_record_sig_generator(rd_data_module_record_sig_generator) + .rd_data_module_record_sig_generator(rd_data_module_record_sig_generator), + .rd_data_module_sys_signal_delayer (rd_data_module_sys_signal_delayer) ); @@ -215,22 +219,22 @@ module Top ( *******************************************************************************/ 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) + .REG0_INIT(0), + .REG1_INIT(0), + .REG2_INIT(0), + .REG3_INIT(0), + .REG4_INIT(0), + .REG5_INIT(0), + .REG6_INIT(0), + .REG7_INIT(0), + .REG8_INIT(0), + .REG9_INIT(0), + .REGA_INIT(0), + .REGB_INIT(0), + .REGC_INIT(0), + .REGD_INIT(0), + .REGE_INIT(0), + .REGF_INIT(0) ) test_reg ( .clk (sys_clk), .rst_n (sys_rst_n), @@ -240,6 +244,61 @@ module Top ( .rd_data(rd_data_module_fpga_info) ); + sys_signal_delayer #( + .REG_START_ADD (`REGADDOFF__DELAYER), + .SYS_CLOCK_FREQ(SYS_CLOCK_FREQ) + ) sys_signal_delayer_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_sys_signal_delayer), + + + .sync_ttl_in1 (sync_ttl_in1), + .sync_ttl_in2 (sync_ttl_in2), + .sync_ttl_in3 (sync_ttl_in3), + .sync_ttl_in4 (sync_ttl_in4), + .timecode_headphone_in(timecode_headphone_in), + .timecode_bnc_in (timecode_bnc_in), + .genlock_in_hsync (genlock_in_hsync), + .genlock_in_vsync (genlock_in_vsync), + .genlock_in_fsync (genlock_in_fsync), + + + .af_delay__sync_ttl_in1 (af_delay__sync_ttl_in1), + .af_delay__sync_ttl_in2 (af_delay__sync_ttl_in2), + .af_delay__sync_ttl_in3 (af_delay__sync_ttl_in3), + .af_delay__sync_ttl_in4 (af_delay__sync_ttl_in4), + .af_delay__timecode_headphone_in(af_delay__timecode_headphone_in), + .af_delay__timecode_bnc_in (af_delay__timecode_bnc_in), + .af_delay__genlock_in_hsync (af_delay__genlock_in_hsync), + .af_delay__genlock_in_vsync (af_delay__genlock_in_vsync), + .af_delay__genlock_in_fsync (af_delay__genlock_in_fsync), + + .sync_ttl_out1(sync_ttl_out1), + .sync_ttl_out2(sync_ttl_out2), + .sync_ttl_out3(sync_ttl_out3), + .sync_ttl_out4(sync_ttl_out4), + + .stm32if_start_signal_out (stm32if_start_signal_out), + .stm32if_camera_sync_out (stm32if_camera_sync_out), + .stm32if_timecode_sync_out(stm32if_timecode_sync_out), + + .before_delay__sync_ttl_out1(before_delay__sync_ttl_out1), + .before_delay__sync_ttl_out2(before_delay__sync_ttl_out2), + .before_delay__sync_ttl_out3(before_delay__sync_ttl_out3), + .before_delay__sync_ttl_out4(before_delay__sync_ttl_out4), + + .before_delay__stm32if_start_signal_out (before_delay__stm32if_start_signal_out), + .before_delay__stm32if_camera_sync_out (before_delay__stm32if_camera_sync_out), + .before_delay__stm32if_timecode_sync_out(before_delay__stm32if_timecode_sync_out) + + ); + + /******************************************************************************* * TTL输入模块 * *******************************************************************************/ @@ -256,10 +315,10 @@ module Top ( .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_raw(af_delay__sync_ttl_in1), + .ttlin2_raw(af_delay__sync_ttl_in2), + .ttlin3_raw(af_delay__sync_ttl_in3), + .ttlin4_raw(!af_delay__sync_ttl_in4), //in4电路上进行了反向 //指示灯 .ttlin1_state_led(sync_ttl_in1_state_led), @@ -288,8 +347,8 @@ module Top ( .rd_data(rd_data_module_timecode_in), //input - .timecode_bnc_in (timecode_bnc_in), - .timecode_headphone_in(timecode_headphone_in), + .timecode_bnc_in (af_delay__timecode_bnc_in), + .timecode_headphone_in(af_delay__timecode_headphone_in), //output .timecode_tigger_sig (ext_timecode_tigger_sig), @@ -312,9 +371,9 @@ module Top ( .wr_en (RegReaderBus_wr_en), .rd_data(rd_data_module_genlock_in), - .genlock_in_hsync(genlock_in_hsync), - .genlock_in_vsync(genlock_in_vsync), - .genlock_in_fsync(genlock_in_fsync), + .genlock_in_hsync(af_delay__genlock_in_hsync), + .genlock_in_vsync(af_delay__genlock_in_vsync), + .genlock_in_fsync(af_delay__genlock_in_fsync), .genlock_freq_signal (signal_ext_genlock_freq), .genlock_in_state_led(genlock_in_state_led) @@ -462,7 +521,7 @@ module Top ( .signal_in(sig_src), - .ttloutput (sync_ttl_out1), + .ttloutput (before_delay__sync_ttl_out1), .ttloutput_state_led(sync_ttl_out1_state_led) ); @@ -481,7 +540,7 @@ module Top ( .signal_in(sig_src), - .ttloutput (sync_ttl_out2), + .ttloutput (before_delay__sync_ttl_out2), .ttloutput_state_led(sync_ttl_out2_state_led) ); ttl_output #( @@ -499,7 +558,7 @@ module Top ( .signal_in(sig_src), - .ttloutput (sync_ttl_out3), + .ttloutput (before_delay__sync_ttl_out3), .ttloutput_state_led(sync_ttl_out3_state_led) ); @@ -518,7 +577,7 @@ module Top ( .signal_in(sig_src), - .ttloutput (sync_ttl_out4), + .ttloutput (before_delay__sync_ttl_out4), .ttloutput_state_led(sync_ttl_out4_state_led) ); @@ -535,7 +594,7 @@ module Top ( .wr_en (RegReaderBus_wr_en), .rd_data(rd_data_module_timecode_out), - .stm32if_timecode_tigger_sig(stm32if_timecode_sync_out), + .stm32if_timecode_tigger_sig(before_delay__stm32if_timecode_sync_out), .in_timecode_tigger_sig (sys_timecode_tigger_sig), .in_timecode_format (sys_timecode_format), @@ -592,14 +651,14 @@ module Top ( .frame_sig (signal_business_record_exposure_sig), .record_en_sig(signal_business_record_en_sig), - - .stm32if_camera_sync_out(stm32if_camera_sync_out), - .stm32if_record_sync_out(stm32if_start_signal_out) + + .stm32if_camera_sync_out (before_delay__stm32if_camera_sync_out), + .stm32if_record_state_change_sig(before_delay__stm32if_start_signal_out) ); 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[2] = af_delay__sync_ttl_in1; assign debug_signal_output[3] = sync_ttl_in3; assign debug_signal_output[4] = sync_ttl_in4; assign debug_signal_output[5] = sync_ttl_out1; diff --git a/source/src/zutils/zutils_pluse_delayer.v b/source/src/zutils/zutils_pluse_delayer.v new file mode 100644 index 0000000..eb3af18 --- /dev/null +++ b/source/src/zutils/zutils_pluse_delayer.v @@ -0,0 +1,77 @@ +module zutils_pluse_delayer ( + input clk, //clock input + input rst_n, //asynchronous reset input, low active + input [31:0] delay_cnt, + + input wire in_sig, + + output wire out_sig, + output reg gen_pulse +); + + reg [31:0] cnt; + reg state; + + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + cnt <= 0; + state <= 0; + gen_pulse <= 0; + end else begin + if (!state) begin + if (in_sig) begin + state <= 1; + cnt <= delay_cnt; + end + gen_pulse <= 0; + end else begin + if (cnt == 0) begin + gen_pulse <= 1; + state <= 0; + end else begin + cnt <= cnt - 1; + end + end + end + end + assign out_sig = in_sig & state & rst_n; + + + // always @(posedge clk or negedge rst_n) begin + // if (!rst_n) begin + // cnt <= 0; + // busy <= 0; + // out <= 0; + // state <= 0; + // end else begin + // if (handle_reset) begin + // cnt <= 0; + // busy <= 0; + // out <= 0; + // state <= 0; + // end else begin + // if (!state) begin + // if (in) begin + // state <= 1; + // cnt <= delay_cnt; + // busy <= 1; + // end + // out <= 0; + // end else begin + // if (cnt == 0) begin + // out <= 1; + // state <= 0; + // busy <= 0; + // end else begin + // cnt <= cnt - 1; + // end + // end + // end + // end + // end + + + + + +endmodule diff --git a/source/src/zutils/zutils_sig_delayer.v b/source/src/zutils/zutils_sig_delayer.v new file mode 100644 index 0000000..59b36af --- /dev/null +++ b/source/src/zutils/zutils_sig_delayer.v @@ -0,0 +1,104 @@ +module zutils_sig_delayer ( + input clk, + input rst_n, + + input [31:0] delay_cnt, + input [31:0] freq_division, + input in, + output reg out, + output reg ready +); + + reg [31:0] freq_division_cache; //! freq_division 配置缓存 + + reg [ 1:0] state; //! 状态机状态 + reg [31:0] cnt; //! 采样预分频cnt + reg shift_register_clk; //! 移位寄存器时钟 + reg [ 9:0] shift_register_add; //! 移位寄存器偏移地址 + reg [31:0] shift_register_freq_div_clk_cnt; //! 移位寄存器分频时钟计数 + + wire dout; + + ShiftRegister shift1 ( + .din (in), + .addr(shift_register_add), + .clk (clk), + .rst (!rst_n), + .dout(dout) + ); + // assign out = dout; + + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + freq_division_cache <= 0; + cnt <= 0; + shift_register_clk <= 0; + shift_register_add <= 0; + out <= 0; + ready <= 0; + state <= 0; + end else begin + case (state) + 0: begin + if (delay_cnt == 0) begin + shift_register_add <= 1; + end else if (delay_cnt >= 1000) begin + shift_register_add <= 1000; + end else begin + shift_register_add <= delay_cnt; + end + + if (freq_division == 0) begin + freq_division_cache <= 1; + end else begin + freq_division_cache <= freq_division; + end + + state <= 1; + out <= in; + end + + 1: begin + state <= 2; + shift_register_clk <= 1; + cnt <= 0; + end + + 2: begin + + if (cnt == 0) begin + shift_register_clk <= 1; + cnt <= freq_division_cache; + + shift_register_freq_div_clk_cnt <= shift_register_freq_div_clk_cnt + 1; + if (shift_register_freq_div_clk_cnt > shift_register_add + 1) begin + state <= 3; + end + end else begin + cnt <= cnt - 1; + shift_register_clk <= 0; + end + end + + 3: begin + ready <= 1; + out <= dout; + if (cnt == 0) begin + shift_register_clk <= 1; + cnt <= freq_division_cache; + end else begin + shift_register_clk <= 0; + cnt <= cnt - 1; + end + + end + + default: begin + state <= 0; + end + + endcase + end + end + +endmodule diff --git a/source/src/zutils/zutils_sig_delayer_v2.v b/source/src/zutils/zutils_sig_delayer_v2.v new file mode 100644 index 0000000..8abf69e --- /dev/null +++ b/source/src/zutils/zutils_sig_delayer_v2.v @@ -0,0 +1,124 @@ +// +// 波形延时器 +// 特点: +// 1. 如果要延后的时间小于原始信号的周期,延时时间可随意设置。 +// 2. 相比使用FIFO的方式缓存信号的方式,这个延时模块使用的资源更少。 +// 3. 无法延迟非周期短时高频信号。最多缓存3个短时脉冲(缓存脉冲数量与zutils_edge_detecter的实力数量有关) +// +module zutils_sig_delayer_v2 ( + input clk, + input rst_n, + + input [31:0] delay_cnt, + input [31:0] freq_division, + input in, + output reg out, + output reg ready +); + + reg [31:0] delay_cache; + reg internal_reset_sig; + zutils_edge_detecter _signal_in ( + .clk (clk), + .rst_n (internal_reset_sig), + .in_signal (in), + .in_signal_rising_edge (in_signal_rising_edge), + .in_signal_falling_edge(in_signal_falling_edge) + ); + + zutils_pluse_delayer _pluse_delayer11 ( + .clk (clk), + .rst_n (internal_reset_sig), + .delay_cnt(delay_cache), + .in_sig (in_signal_rising_edge), + .out_sig (out_sig11), + .gen_pulse(gen_pluse11) + ); + + zutils_pluse_delayer _pluse_delayer12 ( + .clk (clk), + .rst_n (internal_reset_sig), + .delay_cnt(delay_cache), + .in_sig (out_sig11), + .out_sig (out_sig12), + .gen_pulse(gen_pluse12) + ); + + zutils_pluse_delayer _pluse_delayer13 ( + .clk (clk), + .rst_n (internal_reset_sig), + .delay_cnt(delay_cache), + .in_sig (out_sig12), + .out_sig (final_out_sig1), + .gen_pulse(gen_pluse13) + ); + + zutils_pluse_delayer _pluse_delayer21 ( + .clk (clk), + .rst_n (internal_reset_sig), + .delay_cnt(delay_cache), + .in_sig (in_signal_falling_edge), + .out_sig (out_sig21), + .gen_pulse(gen_pluse21) + ); + + zutils_pluse_delayer _pluse_delayer22 ( + .clk (clk), + .rst_n (internal_reset_sig), + .delay_cnt(delay_cache), + .in_sig (out_sig21), + .out_sig (out_sig22), + .gen_pulse(gen_pluse22) + ); + + zutils_pluse_delayer _pluse_delayer23 ( + .clk (clk), + .rst_n (internal_reset_sig), + .delay_cnt(delay_cache), + .in_sig (out_sig22), + .out_sig (final_out_sig2), + .gen_pulse(gen_pluse23) + ); + + + assign final_gen_pluse1 = gen_pluse11 | gen_pluse12 | gen_pluse13; + assign final_gen_pluse2 = gen_pluse21 | gen_pluse22 | gen_pluse23; + + reg state; + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + state <= 0; + ready <= 0; + out <= 0; + internal_reset_sig <= 0; + end else begin + case (state) + 0: begin + state <= 1; + out <= in; + internal_reset_sig <= 0; + ready <= 0; + delay_cache <= delay_cnt; + end + 1: begin + if (final_out_sig2 | final_out_sig1) begin + state <= 0; + ready <= 0; + out <= in; + internal_reset_sig <= 0; + end else begin + ready <= 1; + internal_reset_sig <= 1; + if (final_gen_pluse1) begin + out <= 1; + end else if (final_gen_pluse2) begin + out <= 0; + end + end + end + endcase + end + end + + +endmodule