| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- `timescale 1 ns / 1 ps
- module axis_pps_counter #
- (
- parameter integer AXIS_TDATA_WIDTH = 32,
- parameter integer CNTR_WIDTH = 32
- )
- (
- // System signals
- input wire aclk,
- input wire aresetn,
- input wire pps_data,
- // Master side
- output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
- output wire m_axis_tvalid
- );
- reg [CNTR_WIDTH-1:0] int_cntr_reg;
- reg int_enbl_reg;
- reg [1:0] int_data_reg;
- wire int_edge_wire, int_pps_wire;
- xpm_cdc_single #(
- .DEST_SYNC_FF(4),
- .INIT_SYNC_FF(0),
- .SRC_INPUT_REG(0),
- .SIM_ASSERT_CHK(0)
- ) cdc_0 (
- .src_in(pps_data),
- .src_clk(),
- .dest_out(int_pps_wire),
- .dest_clk(aclk)
- );
- always @(posedge aclk)
- begin
- if(~aresetn)
- begin
- int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
- int_enbl_reg <= 1'b0;
- int_data_reg <= 2'd0;
- end
- else
- begin
- int_cntr_reg <= int_edge_wire ? {(CNTR_WIDTH){1'b0}} : int_cntr_reg + 1'b1;
- int_enbl_reg <= int_edge_wire ? 1'b1 : int_enbl_reg;
- int_data_reg <= {int_data_reg[0], ~int_pps_wire};
- end
- end
- assign int_edge_wire = int_data_reg[1] & ~int_data_reg[0];
- assign m_axis_tdata = {{(AXIS_TDATA_WIDTH-CNTR_WIDTH){1'b0}}, int_cntr_reg};
- assign m_axis_tvalid = int_enbl_reg & int_edge_wire;
- endmodule
|