jesd204: Slightly rework sysref handling

For SYSREF handling there are now three possible modes.

1) Disabled. In this mode the LMFC is generated internally and all external
SYSREF edges are ignored. This mode should be used for subclass 0 when no
external sysref is available.
2) Continuous SYSREF. An external SYSREF signal is required and the LMFC is
aligned to the SYSREF signal. The SYSREF signal is continuously monitored
and if a edge unaligned to the previous edges is detected the LMFC is
re-aligned to the new edge.
3) Oneshot SYSREF. Oneshot SYSREF mode is similar to continuous SYSREF mode
except only the first edge is captured and all further edges are ignored,
re-alignment will not happen.

Both in continuous and oneshot signal at least one external sysref edge is
required before an LMFC is generated. All events that require an LMFC will
be delayed until a SYSREF edge has been captured. This is done to avoid
accidental re-alignment.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
main
Lars-Peter Clausen 2017-05-17 19:28:50 +02:00
parent bf88527119
commit baa256e34c
17 changed files with 56 additions and 47 deletions

View File

@ -59,7 +59,7 @@ module jesd204_up_sysref (
output reg up_cfg_sysref_oneshot,
output reg [7:0] up_cfg_lmfc_offset,
output reg up_cfg_sysref_required,
output reg up_cfg_sysref_disable,
input core_event_sysref_alignment_error
);
@ -70,7 +70,11 @@ wire up_status_sysref_captured;
always @(*) begin
case (up_raddr)
/* JESD SYSREF configuraton */
12'h040: up_rdata <= {30'h00,up_cfg_sysref_required,up_cfg_sysref_oneshot};
12'h040: up_rdata <= {
/* 02-31 */ 30'h00, /* Reserved for future use */
/* 01 */ up_cfg_sysref_oneshot,
/* 00 */ up_cfg_sysref_disable
};
12'h041: up_rdata <= up_cfg_lmfc_offset;
default: up_rdata <= 32'h00000000;
endcase
@ -80,13 +84,13 @@ always @(posedge up_clk) begin
if (up_reset == 1'b1) begin
up_cfg_sysref_oneshot <= 1'b0;
up_cfg_lmfc_offset <= 'h00;
up_cfg_sysref_required <= 1'b1;
up_cfg_sysref_disable <= 1'b0;
end else if (up_wreq == 1'b1 && up_cfg_is_writeable == 1'b1) begin
case (up_waddr)
/* JESD SYSREF configuraton */
12'h040: begin
up_cfg_sysref_required <= up_wdata[1];
up_cfg_sysref_oneshot <= up_wdata[0];
up_cfg_sysref_oneshot <= up_wdata[1];
up_cfg_sysref_disable <= up_wdata[0];
end
12'h041: up_cfg_lmfc_offset <= up_wdata[7:0];
endcase

View File

@ -81,7 +81,7 @@ module axi_jesd204_rx #(
output core_cfg_disable_char_replacement,
output [7:0] core_cfg_lmfc_offset,
output core_cfg_sysref_oneshot,
output core_cfg_sysref_required,
output core_cfg_sysref_disable,
output core_cfg_buffer_early_release,
output [7:0] core_cfg_buffer_delay,
@ -118,7 +118,7 @@ wire [4:0] up_irq_trigger = 5'b00000;
wire up_cfg_is_writeable;
wire up_cfg_sysref_oneshot;
wire up_cfg_sysref_required;
wire up_cfg_sysref_disable;
wire up_cfg_buffer_early_release;
wire [7:0] up_cfg_buffer_delay;
wire [7:0] up_cfg_lmfc_offset;
@ -195,14 +195,14 @@ jesd204_up_common #(
.core_cfg_disable_char_replacement(core_cfg_disable_char_replacement),
.up_extra_cfg({
/* 18 */ up_cfg_sysref_required,
/* 18 */ up_cfg_sysref_disable,
/* 17 */ up_cfg_sysref_oneshot,
/* 16 */ up_cfg_buffer_early_release,
/* 08-15 */ up_cfg_buffer_delay,
/* 00-07 */ up_cfg_lmfc_offset
}),
.core_extra_cfg({
/* 18 */ core_cfg_sysref_required,
/* 18 */ core_cfg_sysref_disable,
/* 17 */ core_cfg_sysref_oneshot,
/* 16 */ core_cfg_buffer_early_release,
/* 08-15 */ core_cfg_buffer_delay,
@ -227,7 +227,7 @@ jesd204_up_sysref i_up_sysref (
.up_cfg_lmfc_offset(up_cfg_lmfc_offset),
.up_cfg_sysref_oneshot(up_cfg_sysref_oneshot),
.up_cfg_sysref_required(up_cfg_sysref_required)
.up_cfg_sysref_disable(up_cfg_sysref_disable)
);
jesd204_up_rx #(

View File

@ -80,7 +80,7 @@ adi_add_bus "rx_cfg" "master" \
{ "core_cfg_octets_per_frame" "octets_per_frame" } \
{ "core_cfg_lmfc_offset" "lmfc_offset" } \
{ "core_cfg_sysref_oneshot" "sysref_oneshot" } \
{ "core_cfg_sysref_required" "sysref_required" } \
{ "core_cfg_sysref_disable" "sysref_disable" } \
{ "core_cfg_buffer_early_release" "buffer_early_release" } \
{ "core_cfg_buffer_delay" "buffer_delay" } \
{ "core_cfg_disable_char_replacement" "disable_char_replacement" } \

View File

@ -80,7 +80,7 @@ module axi_jesd204_tx #(
output [7:0] core_cfg_octets_per_frame,
output [7:0] core_cfg_lmfc_offset,
output core_cfg_sysref_oneshot,
output core_cfg_sysref_required,
output core_cfg_sysref_disable,
output core_cfg_continuous_cgs,
output core_cfg_continuous_ilas,
output core_cfg_skip_ilas,
@ -125,7 +125,7 @@ wire up_cfg_continuous_cgs;
wire [7:0] up_cfg_mframes_per_ilas;
wire [7:0] up_cfg_lmfc_offset;
wire up_cfg_sysref_oneshot;
wire up_cfg_sysref_required;
wire up_cfg_sysref_disable;
wire up_cfg_is_writeable;
wire [4:0] up_irq_trigger;
@ -216,7 +216,7 @@ jesd204_up_common #(
.core_cfg_disable_char_replacement(core_cfg_disable_char_replacement),
.up_extra_cfg({
/* 20 */ up_cfg_sysref_required,
/* 20 */ up_cfg_sysref_disable,
/* 19 */ up_cfg_sysref_oneshot,
/* 18 */ up_cfg_continuous_cgs,
/* 17 */ up_cfg_continuous_ilas,
@ -225,7 +225,7 @@ jesd204_up_common #(
/* 00-07 */ up_cfg_mframes_per_ilas
}),
.core_extra_cfg({
/* 20 */ core_cfg_sysref_required,
/* 20 */ core_cfg_sysref_disable,
/* 19 */ core_cfg_sysref_oneshot,
/* 18 */ core_cfg_continuous_cgs,
/* 17 */ core_cfg_continuous_ilas,
@ -244,7 +244,7 @@ jesd204_up_sysref i_up_sysref (
.up_cfg_lmfc_offset(up_cfg_lmfc_offset),
.up_cfg_sysref_oneshot(up_cfg_sysref_oneshot),
.up_cfg_sysref_required(up_cfg_sysref_required),
.up_cfg_sysref_disable(up_cfg_sysref_disable),
.up_raddr(up_raddr),
.up_rdata(up_rdata_sysref),

View File

@ -78,7 +78,7 @@ adi_add_bus "tx_cfg" "master" \
{ "core_cfg_octets_per_frame" "octets_per_frame" } \
{ "core_cfg_lmfc_offset" "lmfc_offset" } \
{ "core_cfg_sysref_oneshot" "sysref_oneshot" } \
{ "core_cfg_sysref_required" "sysref_required" } \
{ "core_cfg_sysref_disable" "sysref_disable" } \
{ "core_cfg_continuous_cgs" "continuous_cgs" } \
{ "core_cfg_continuous_ilas" "continuous_ilas" } \
{ "core_cfg_skip_ilas" "skip_ilas" } \

View File

@ -51,9 +51,8 @@ module jesd204_lmfc (
input [7:0] cfg_beats_per_multiframe,
input [7:0] cfg_lmfc_offset,
input cfg_sysref_oneshot,
input cfg_sysref_required,
input clear_sysref_captured,
input cfg_sysref_disable,
output reg lmfc_edge,
output reg lmfc_clk,
@ -93,7 +92,7 @@ always @(posedge clk) begin
end
always @(posedge clk) begin
if (sysref_d3 == 1'b0 && sysref_d2 == 1'b1) begin
if (sysref_d3 == 1'b0 && sysref_d2 == 1'b1 && cfg_sysref_disable == 1'b0) begin
sysref_edge <= 1'b1;
end else begin
sysref_edge <= 1'b0;
@ -129,8 +128,8 @@ end
always @(posedge clk) begin
if (reset == 1'b1) begin
lmfc_counter <= 'h00;
lmfc_active <= ~cfg_sysref_required;
lmfc_counter <= 'h01;
lmfc_active <= cfg_sysref_disable;
end else begin
/*
* In oneshot mode only the first occurence of the
@ -155,7 +154,7 @@ always @(posedge clk) begin
* setting.
*/
sysref_alignment_error <= 1'b0;
if (sysref_edge == 1'b1 &&
if (sysref_edge == 1'b1 && lmfc_active == 1'b1 &&
lmfc_counter_next != cfg_lmfc_offset) begin
sysref_alignment_error <= 1'b1;
end

View File

@ -99,7 +99,7 @@ adi_add_bus "rx_cfg" "slave" \
{ "cfg_octets_per_frame" "octets_per_frame" } \
{ "cfg_lmfc_offset" "lmfc_offset" } \
{ "cfg_sysref_oneshot" "sysref_oneshot" } \
{ "cfg_sysref_required" "sysref_required" } \
{ "cfg_sysref_disable" "sysref_disable" } \
{ "cfg_buffer_delay" "buffer_delay" } \
{ "cfg_buffer_early_release" "buffer_early_release" } \
{ "cfg_disable_char_replacement" "disable_char_replacement" } \

View File

@ -73,7 +73,7 @@ module jesd204_rx #(
input [7:0] cfg_beats_per_multiframe,
input [7:0] cfg_octets_per_frame,
input [7:0] cfg_lmfc_offset,
input cfg_sysref_required,
input cfg_sysref_disable,
input cfg_sysref_oneshot,
input cfg_buffer_early_release,
input [7:0] cfg_buffer_delay,
@ -213,7 +213,7 @@ jesd204_lmfc i_lmfc (
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_required(cfg_sysref_required),
.cfg_sysref_disable(cfg_sysref_disable),
.sysref(sysref),
.lmfc_edge(lmfc_edge),

View File

@ -61,7 +61,7 @@ adi_add_bus "rx_cfg" "master" \
{ "cfg_octets_per_frame" "octets_per_frame" } \
{ "cfg_lmfc_offset" "lmfc_offset" } \
{ "cfg_sysref_oneshot" "sysref_oneshot" } \
{ "cfg_sysref_required" "sysref_required" } \
{ "cfg_sysref_disable" "sysref_disable" } \
{ "cfg_buffer_early_release" "buffer_early_release" } \
}
adi_add_bus_clock "clk" "rx_cfg"

View File

@ -56,7 +56,7 @@ module jesd204_rx_static_config #(
output [7:0] cfg_octets_per_frame,
output [7:0] cfg_lmfc_offset,
output cfg_sysref_oneshot,
output cfg_sysref_required,
output cfg_sysref_disable,
output [7:0] cfg_buffer_delay,
output cfg_buffer_early_release,
@ -68,7 +68,7 @@ assign cfg_beats_per_multiframe = (FRAMES_PER_MULTIFRAME * OCTETS_PER_FRAME / 4)
assign cfg_octets_per_frame = OCTETS_PER_FRAME - 1;
assign cfg_lmfc_offset = 3;
assign cfg_sysref_oneshot = 1'b0;
assign cfg_sysref_required = 1'b1;
assign cfg_sysref_disable = 1'b0;
assign cfg_buffer_delay = 'hb;
assign cfg_buffer_early_release = BUFFER_EARLY_RELEASE;
assign cfg_lanes_disable = {NUM_LANES{1'b0}};

View File

@ -92,7 +92,7 @@ adi_add_bus "tx_cfg" "slave" \
{ "cfg_octets_per_frame" "octets_per_frame" } \
{ "cfg_lmfc_offset" "lmfc_offset" } \
{ "cfg_sysref_oneshot" "sysref_oneshot" } \
{ "cfg_sysref_required" "sysref_required" } \
{ "cfg_sysref_disable" "sysref_disable" } \
{ "cfg_continuous_cgs" "continuous_cgs" } \
{ "cfg_continuous_ilas" "continuous_ilas" } \
{ "cfg_skip_ilas" "skip_ilas" } \

View File

@ -65,7 +65,7 @@ module jesd204_tx #(
input [7:0] cfg_octets_per_frame,
input [7:0] cfg_lmfc_offset,
input cfg_sysref_oneshot,
input cfg_sysref_required,
input cfg_sysref_disable,
input cfg_continuous_cgs,
input cfg_continuous_ilas,
input cfg_skip_ilas,
@ -123,7 +123,7 @@ jesd204_lmfc i_lmfc (
.cfg_beats_per_multiframe(cfg_beats_per_multiframe),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_required(cfg_sysref_required),
.cfg_sysref_disable(cfg_sysref_disable),
.sysref(sysref),

View File

@ -62,7 +62,7 @@ adi_add_bus "tx_cfg" "master" \
{ "cfg_octets_per_frame" "octets_per_frame" } \
{ "cfg_lmfc_offset" "lmfc_offset" } \
{ "cfg_sysref_oneshot" "sysref_oneshot" } \
{ "cfg_sysref_required" "sysref_required" } \
{ "cfg_sysref_disable" "sysref_disable" } \
{ "cfg_continuous_cgs" "continuous_cgs" } \
{ "cfg_continuous_ilas" "continuous_ilas" } \
{ "cfg_skip_ilas" "skip_ilas" } \

View File

@ -59,7 +59,7 @@ module jesd204_tx_static_config #(
output [7:0] cfg_octets_per_frame,
output [7:0] cfg_lmfc_offset,
output cfg_sysref_oneshot,
output cfg_sysref_required,
output cfg_sysref_disable,
output cfg_continuous_cgs,
output cfg_continuous_ilas,
output cfg_skip_ilas,
@ -76,7 +76,7 @@ assign cfg_beats_per_multiframe = (FRAMES_PER_MULTIFRAME * OCTETS_PER_FRAME / 4)
assign cfg_octets_per_frame = OCTETS_PER_FRAME - 1;
assign cfg_lmfc_offset = 3;
assign cfg_sysref_oneshot = 1'b0;
assign cfg_sysref_required = 1'b1;
assign cfg_sysref_disable = 1'b0;
assign cfg_continuous_cgs = 1'b0;
assign cfg_continuous_ilas = 1'b0;
assign cfg_skip_ilas = 1'b0;

View File

@ -136,7 +136,8 @@ module loopback_tb;
wire [7:0] tx_cfg_beats_per_multiframe;
wire [7:0] tx_cfg_octets_per_frame;
wire [7:0] tx_cfg_lmfc_offset;
wire tx_cfg_sysref_required;
wire tx_cfg_sysref_disable;
wire tx_cfg_sysref_oneshot;
wire tx_cfg_continuous_cgs;
wire tx_cfg_continuous_ilas;
wire tx_cfg_skip_ilas;
@ -160,7 +161,8 @@ module loopback_tb;
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_required(tx_cfg_sysref_required),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
@ -183,7 +185,8 @@ module loopback_tb;
.cfg_beats_per_multiframe(tx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(tx_cfg_octets_per_frame),
.cfg_lmfc_offset(tx_cfg_lmfc_offset),
.cfg_sysref_required(tx_cfg_sysref_required),
.cfg_sysref_disable(tx_cfg_sysref_disable),
.cfg_sysref_oneshot(tx_cfg_sysref_oneshot),
.cfg_continuous_cgs(tx_cfg_continuous_cgs),
.cfg_continuous_ilas(tx_cfg_continuous_ilas),
.cfg_skip_ilas(tx_cfg_skip_ilas),
@ -211,7 +214,8 @@ module loopback_tb;
wire [7:0] rx_cfg_beats_per_multiframe;
wire [7:0] rx_cfg_octets_per_frame;
wire [7:0] rx_cfg_lmfc_offset;
wire rx_sysref_required;
wire rx_sysref_disable;
wire rx_sysref_oneshot;
wire rx_cfg_disable_scrambler;
wire rx_cfg_disable_char_replacement;
wire rx_cfg_buffer_early_release;
@ -232,7 +236,8 @@ module loopback_tb;
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_required(rx_cfg_sysref_required),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),
@ -249,7 +254,8 @@ module loopback_tb;
.cfg_beats_per_multiframe(rx_cfg_beats_per_multiframe),
.cfg_octets_per_frame(rx_cfg_octets_per_frame),
.cfg_lmfc_offset(rx_cfg_lmfc_offset),
.cfg_sysref_required(rx_cfg_sysref_required),
.cfg_sysref_disable(rx_cfg_sysref_disable),
.cfg_sysref_oneshot(rx_cfg_sysref_oneshot),
.cfg_disable_scrambler(rx_cfg_disable_scrambler),
.cfg_disable_char_replacement(rx_cfg_disable_char_replacement),
.cfg_buffer_delay(rx_cfg_buffer_delay),

View File

@ -138,7 +138,7 @@ module rx_tb;
wire [7:0] cfg_octets_per_frame;
wire [7:0] cfg_lmfc_offset;
wire cfg_sysref_oneshot;
wire cfg_sysref_required;
wire cfg_sysref_disable;
wire cfg_buffer_early_release;
wire cfg_disable_scrambler;
@ -154,7 +154,7 @@ module rx_tb;
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_required(cfg_sysref_required),
.cfg_sysref_disable(cfg_sysref_disable),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.cfg_buffer_early_release(rx_buffer_early_release)
);
@ -170,7 +170,7 @@ module rx_tb;
.cfg_octets_per_frame(cfg_octets_per_frame),
.cfg_lmfc_offset(cfg_lmfc_offset),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_required(cfg_sysref_required),
.cfg_sysref_disable(cfg_sysref_disable),
.cfg_disable_scrambler(tx_cfg_disable_scrambler),
.cfg_buffer_early_release(rx_buffer_early_release),

View File

@ -78,7 +78,7 @@ module tx_tb;
wire [7:0] cfg_octets_per_frame;
wire [7:0] cfg_lmfc_offset;
wire cfg_sysref_oneshot;
wire cfg_sysref_required;
wire cfg_sysref_disable;
wire cfg_continuous_cgs;
wire cfg_continuous_ilas;
wire cfg_skip_ilas;
@ -106,7 +106,7 @@ module tx_tb;
.cfg_disable_char_replacement(cfg_disable_char_replacement),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_required(cfg_sysref_required),
.cfg_sysref_disable(cfg_sysref_disable),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),
@ -130,7 +130,7 @@ module tx_tb;
.cfg_disable_char_replacement(cfg_disable_char_replacement),
.cfg_disable_scrambler(cfg_disable_scrambler),
.cfg_sysref_oneshot(cfg_sysref_oneshot),
.cfg_sysref_required(cfg_sysref_required),
.cfg_sysref_disable(cfg_sysref_disable),
.ilas_config_rd(tx_ilas_config_rd),
.ilas_config_addr(tx_ilas_config_addr),