axi_ad9361: Update the PPS receiver module

+ Add a HDL parameter for the PPS receiver module :
PPS_RECEIVER_ENABLE. By default the module is disabled.
  + Add the CMOS_OR_LVDS_N and PPS_RECEIVER_ENABLE into the CONFIG
register
  + Define a pps_status read only register, which will be asserted, if the free
running counter reach a certain fixed threshold. (2^28) The register can
be deasserted by an incomming PPS only.
main
Istvan Csomortani 2017-08-02 16:31:46 +01:00
parent e644a99648
commit 7cdb11cc34
9 changed files with 75 additions and 16 deletions

View File

@ -43,6 +43,7 @@ module axi_ad9361 #(
parameter MODE_1R1T = 0,
parameter DEVICE_TYPE = 0,
parameter TDD_DISABLE = 0,
parameter PPS_RECEIVER_ENABLE = 0,
parameter CMOS_OR_LVDS_N = 0,
parameter ADC_INIT_DELAY = 0,
parameter ADC_DATAPATH_DISABLE = 0,
@ -284,6 +285,7 @@ module axi_ad9361 #(
wire up_drp_locked;
wire [31:0] up_pps_rcounter_s;
wire up_pps_status_s;
wire up_irq_mask_s;
wire adc_up_pps_irq_mask_s;
wire dac_up_pps_irq_mask_s;
@ -535,23 +537,36 @@ module axi_ad9361 #(
end
endgenerate
// GPS's 1PPS receiver
ad_pps_receiver i_pps_receiver (
.clk (clk),
.rst (rst),
.gps_pps (gps_pps),
.up_clk (up_clk),
.up_rstn (up_rstn),
.up_pps_rcounter (up_pps_rcounter_s),
.up_irq_mask (up_irq_mask_s),
.up_irq (gps_pps_irq));
assign up_irq_mask_s = adc_up_pps_irq_mask_s | dac_up_pps_irq_mask_s;
generate if (PPS_RECEIVER_ENABLE == 1) begin
// GPS's PPS receiver
ad_pps_receiver i_pps_receiver (
.clk (clk),
.rst (rst),
.gps_pps (gps_pps),
.up_clk (up_clk),
.up_rstn (up_rstn),
.up_pps_rcounter (up_pps_rcounter_s),
.up_pps_status (up_pps_status_s),
.up_irq_mask (up_irq_mask_s),
.up_irq (gps_pps_irq));
assign up_irq_mask_s = adc_up_pps_irq_mask_s | dac_up_pps_irq_mask_s;
end
endgenerate
generate if (PPS_RECEIVER_ENABLE == 0) begin
assign up_pps_rcounter_s = 32'b0;
assign up_pps_status_s = 1'b1;
assign gps_pps_irq = 1'b0;
end
endgenerate
// receive
axi_ad9361_rx #(
.ID (ID),
.MODE_1R1T (MODE_1R1T),
.CMOS_OR_LVDS_N (CMOS_OR_LVDS_N),
.PPS_RECEIVER_ENABLE (PPS_RECEIVER_ENABLE),
.INIT_DELAY (ADC_INIT_DELAY),
.USERPORTS_DISABLE (ADC_USERPORTS_DISABLE_INT),
.DATAFORMAT_DISABLE (ADC_DATAFORMAT_DISABLE_INT),
@ -561,6 +576,7 @@ module axi_ad9361 #(
.mmcm_rst (mmcm_rst),
.adc_rst (rst),
.adc_clk (clk),
.adc_valid (adc_valid_s),
.adc_data (adc_data_s),
.adc_status (adc_status_s),
@ -589,7 +605,8 @@ module axi_ad9361 #(
.adc_dunf (adc_dunf),
.up_adc_gpio_in (up_adc_gpio_in),
.up_adc_gpio_out (up_adc_gpio_out),
.up_pps_rcounter(up_pps_rcounter_s),
.up_pps_rcounter (up_pps_rcounter_s),
.up_pps_status (up_pps_status_s),
.up_pps_irq_mask (adc_up_pps_irq_mask_s),
.up_rstn (up_rstn),
.up_clk (up_clk),
@ -614,6 +631,8 @@ module axi_ad9361 #(
axi_ad9361_tx #(
.ID (ID),
.MODE_1R1T (MODE_1R1T),
.CMOS_OR_LVDS_N (CMOS_OR_LVDS_N),
.PPS_RECEIVER_ENABLE (PPS_RECEIVER_ENABLE),
.INIT_DELAY (DAC_INIT_DELAY),
.DDS_DISABLE (DAC_DDS_DISABLE_INT),
.USERPORTS_DISABLE (DAC_USERPORTS_DISABLE_INT),
@ -648,7 +667,8 @@ module axi_ad9361 #(
.dac_data_q1 (dac_data_q1),
.dac_dovf(dac_dovf),
.dac_dunf(dac_dunf),
.up_pps_rcounter(up_pps_rcounter_s),
.up_pps_rcounter (up_pps_rcounter_s),
.up_pps_status (up_pps_status_s),
.up_pps_irq_mask (dac_up_pps_irq_mask_s),
.up_dac_gpio_in (up_dac_gpio_in),
.up_dac_gpio_out (up_dac_gpio_out),

View File

@ -9,8 +9,11 @@ set_false_path -from [get_cells -hier -filter {name =~ *up_txnrx_int_reg && I
set_false_path -to [get_cells -hier -filter {name =~ *tdd_sync_d1_reg && IS_SEQUENTIAL}]
set_property ASYNC_REG TRUE \
[get_cells -hier *_pps_m*]
[get_cells -hier *_pps_m*] \
[get_cells -hier *_pps_status_m*]
set_false_path -to [get_cells -hier -filter {name =~ *_pps_m_reg[0] && IS_SEQUENTIAL}]
set_false_path -from [get_cells -hier -filter {name =~ *pps_status_reg && IS_SEQUENTIAL}] \
-to [get_cells -hier -filter {name =~ *up_pps_status_m_reg && IS_SEQUENTIAL}]
set_false_path -to [get_cells -hier -filter {name =~ *up_pps_rcounter_reg* && IS_SEQUENTIAL}]

View File

@ -42,6 +42,8 @@ module axi_ad9361_rx #(
parameter ID = 0,
parameter MODE_1R1T = 0,
parameter CMOS_OR_LVDS_N = 0,
parameter PPS_RECEIVER_ENABLE = 0,
parameter INIT_DELAY = 0,
parameter USERPORTS_DISABLE = 0,
parameter DATAFORMAT_DISABLE = 0,
@ -97,6 +99,7 @@ module axi_ad9361_rx #(
// 1PPS reporting counter and interrupt
input [31:0] up_pps_rcounter,
input up_pps_status,
output up_pps_irq_mask,
// processor interface
@ -124,7 +127,9 @@ module axi_ad9361_rx #(
// configuration settings
localparam CONFIG = (MODE_1R1T * 16) +
localparam CONFIG = (PPS_RECEIVER_ENABLE * 256) +
(CMOS_OR_LVDS_N * 128) +
(MODE_1R1T * 16) +
(USERPORTS_DISABLE * 8) +
(DATAFORMAT_DISABLE * 4) +
(DCFILTER_DISABLE * 2) +
@ -349,6 +354,7 @@ module axi_ad9361_rx #(
.adc_sync (),
.up_adc_ce (),
.up_pps_rcounter (up_pps_rcounter),
.up_pps_status (up_pps_status),
.up_pps_irq_mask (up_pps_irq_mask),
.up_status_pn_err (up_status_pn_err),
.up_status_pn_oos (up_status_pn_oos),

View File

@ -41,6 +41,8 @@ module axi_ad9361_tx #(
parameter ID = 0,
parameter MODE_1R1T = 0,
parameter CMOS_OR_LVDS_N = 0,
parameter PPS_RECEIVER_ENABLE = 0,
parameter INIT_DELAY = 0,
parameter DDS_DISABLE = 0,
parameter USERPORTS_DISABLE = 0,
@ -95,6 +97,7 @@ module axi_ad9361_tx #(
// 1PPS reporting counter and interrupt
input [31:0] up_pps_rcounter,
input up_pps_status,
output up_pps_irq_mask,
// processor interface
@ -112,7 +115,9 @@ module axi_ad9361_tx #(
// configuration settings
localparam CONFIG = (DDS_DISABLE * 64) +
localparam CONFIG = (PPS_RECEIVER_ENABLE * 256) +
(CMOS_OR_LVDS_N * 128) +
(DDS_DISABLE * 64) +
(DELAYCNTRL_DISABLE * 32) +
(MODE_1R1T * 16) +
(USERPORTS_DISABLE * 8) +
@ -351,6 +356,7 @@ module axi_ad9361_tx #(
.dac_clk_ratio (32'd1),
.up_dac_ce (),
.up_pps_rcounter (up_pps_rcounter),
.up_pps_status (up_pps_status),
.up_pps_irq_mask (up_pps_irq_mask),
.up_drp_sel (),
.up_drp_wr (),

View File

@ -42,6 +42,7 @@ module ad_pps_receiver (
input up_clk,
input up_rstn,
output reg [31:0] up_pps_rcounter,
output reg up_pps_status,
input up_irq_mask,
output reg up_irq);
@ -52,9 +53,11 @@ module ad_pps_receiver (
reg [ 2:0] gps_pps_m = 3'b0;
reg [ 2:0] up_pps_m = 3'b0;
reg up_pps_status_m = 1'b0;
reg pps_toggle = 1'b0;
reg [31:0] free_rcounter = 32'b0;
reg [31:0] pps_rcounter = 32'b0;
reg pps_status = 1'b0;
wire pps_posedge_s;
wire up_pps_posedge_s;
@ -74,11 +77,16 @@ module ad_pps_receiver (
if (rst == 1'b1) begin
free_rcounter <= 32'b0;
pps_rcounter <= 32'b0;
pps_status <= 1'b1;
end else if (pps_posedge_s == 1'b1) begin
free_rcounter <= 32'b0;
pps_rcounter <= free_rcounter;
pps_status <= 1'b0;
end else begin
free_rcounter <= free_rcounter + 32'b1;
if (free_rcounter[28] == 1'b1) begin
pps_status <= 1'b1;
end
end
end
@ -96,8 +104,12 @@ module ad_pps_receiver (
if (up_rstn == 1'b0) begin
up_pps_m <= 3'b0;
up_pps_rcounter <= 1'b0;
up_pps_status_m <= 1'b1;
up_pps_status <= 1'b1;
end else begin
up_pps_m <= {up_pps_m[1:0], pps_toggle};
up_pps_status_m <= pps_status;
up_pps_status <= up_pps_status_m;
if ((up_pps_m[2] ^ up_pps_m[1]) == 1'b1) begin
up_pps_rcounter <= pps_rcounter;
end

View File

@ -67,6 +67,7 @@ module up_adc_common #(
output adc_sref_sync,
output adc_sync,
input [31:0] up_pps_rcounter,
input up_pps_status,
output reg up_pps_irq_mask,
// channel interface
@ -375,6 +376,7 @@ module up_adc_common #(
8'h2e: up_rdata_int <= up_adc_gpio_in;
8'h2f: up_rdata_int <= up_adc_gpio_out_int;
8'h30: up_rdata_int <= up_pps_rcounter;
8'h31: up_rdata_int <= {31'b0, up_pps_status};
default: up_rdata_int <= 0;
endcase
end else begin

View File

@ -68,6 +68,7 @@ module up_dac_common #(
input [31:0] dac_clk_ratio,
output up_dac_ce,
input [31:0] up_pps_rcounter,
input up_pps_status,
output reg up_pps_irq_mask,
// drp interface
@ -378,6 +379,7 @@ module up_dac_common #(
8'h2e: up_rdata_int <= up_dac_gpio_in;
8'h2f: up_rdata_int <= up_dac_gpio_out_int;
8'h30: up_rdata_int <= up_pps_rcounter;
8'h31: up_rdata_int <= up_pps_status;
default: up_rdata_int <= 0;
endcase
end else begin

View File

@ -11,6 +11,10 @@ set_property CONFIG.PCW_UART0_UART0_IO {MIO 14 .. 15} [get_bd_cells sys_ps7]
set_property CONFIG.PCW_USE_DMA0 1 [get_bd_cells sys_ps7]
set_property CONFIG.PCW_USE_DMA1 1 [get_bd_cells sys_ps7]
# enable PPS receiver
ad_ip_parameter axi_ad9361 CONFIG.PPS_RECEIVER_ENABLE 1
# i2s
create_bd_port -dir O -type clk i2s_mclk

View File

@ -11,6 +11,10 @@ set_property CONFIG.PCW_UART0_UART0_IO {MIO 14 .. 15} [get_bd_cells sys_ps7]
set_property CONFIG.PCW_USE_DMA0 1 [get_bd_cells sys_ps7]
set_property CONFIG.PCW_USE_DMA1 1 [get_bd_cells sys_ps7]
# enable PPS receiver
ad_ip_parameter axi_ad9361 CONFIG.PPS_RECEIVER_ENABLE 1
# i2s
create_bd_port -dir O -type clk i2s_mclk