Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
FMC ADC 100M 14b 4cha
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
FMC ADC 100M 14b 4cha
Commits
87652e47
Commit
87652e47
authored
Jul 09, 2021
by
Tristan Gingold
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ltc2174: Remove manual bitslip, replaced with serdes_calib
This new bit starts and enable the serdes delay mechanism
parent
9bfb3fd0
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
25 additions
and
29 deletions
+25
-29
fmc_adc_100Ms_csr.cheby
hdl/cheby/fmc_adc_100Ms_csr.cheby
+2
-4
fmc_adc_100Ms_csr.vhd
hdl/cheby/fmc_adc_100Ms_csr.vhd
+7
-5
ltc2174_2l16b_receiver.vhd
hdl/platform/xilinx/spartan6/ltc2174_2l16b_receiver.vhd
+10
-10
fmc_adc_100Ms_core.vhd
hdl/rtl/fmc_adc_100Ms_core.vhd
+4
-8
fmc_adc_100Ms_csr.v
hdl/testbench/include/fmc_adc_100Ms_csr.v
+2
-2
No files found.
hdl/cheby/fmc_adc_100Ms_csr.cheby
View file @
87652e47
...
...
@@ -41,11 +41,9 @@ memory-map:
range: 3
description: Offset DACs clear (active low)
- field:
name:
man_bitslip
name:
serdes_calib
range: 4
description: Manual serdes bitslip (ignore on read)
x-hdl:
type: wire
description: Initial serdes calibration
- field:
name: trig_led
range: 6
...
...
hdl/cheby/fmc_adc_100Ms_csr.vhd
View file @
87652e47
...
...
@@ -15,7 +15,7 @@ package fmc_adc_100ms_csr_pkg is
ctl_fsm_cmd
:
std_logic_vector
(
1
downto
0
);
ctl_fmc_clk_oe
:
std_logic
;
ctl_offset_dac_clr_n
:
std_logic
;
ctl_
man_bitslip
:
std_logic
;
ctl_
serdes_calib
:
std_logic
;
ctl_trig_led
:
std_logic
;
ctl_acq_led
:
std_logic
;
ctl_clear_trig_stat
:
std_logic
;
...
...
@@ -47,7 +47,6 @@ package fmc_adc_100ms_csr_pkg is
type
t_fmc_adc_100ms_csr_slave_out
is
record
ctl_fsm_cmd
:
std_logic_vector
(
1
downto
0
);
ctl_man_bitslip
:
std_logic
;
ctl_clear_trig_stat
:
std_logic
;
ctl_calib_apply
:
std_logic
;
sta_fsm
:
std_logic_vector
(
2
downto
0
);
...
...
@@ -120,6 +119,7 @@ architecture syn of fmc_adc_100ms_csr is
signal
wb_wip
:
std_logic
;
signal
ctl_fmc_clk_oe_reg
:
std_logic
;
signal
ctl_offset_dac_clr_n_reg
:
std_logic
;
signal
ctl_serdes_calib_reg
:
std_logic
;
signal
ctl_trig_led_reg
:
std_logic
;
signal
ctl_acq_led_reg
:
std_logic
;
signal
ctl_wreq
:
std_logic
;
...
...
@@ -250,7 +250,7 @@ begin
fmc_adc_100ms_csr_o
.
ctl_fsm_cmd
<=
wr_dat_d0
(
1
downto
0
);
fmc_adc_100ms_csr_o
.
ctl_fmc_clk_oe
<=
ctl_fmc_clk_oe_reg
;
fmc_adc_100ms_csr_o
.
ctl_offset_dac_clr_n
<=
ctl_offset_dac_clr_n_reg
;
fmc_adc_100ms_csr_o
.
ctl_
man_bitslip
<=
wr_dat_d0
(
4
)
;
fmc_adc_100ms_csr_o
.
ctl_
serdes_calib
<=
ctl_serdes_calib_reg
;
fmc_adc_100ms_csr_o
.
ctl_trig_led
<=
ctl_trig_led_reg
;
fmc_adc_100ms_csr_o
.
ctl_acq_led
<=
ctl_acq_led_reg
;
fmc_adc_100ms_csr_o
.
ctl_clear_trig_stat
<=
wr_dat_d0
(
8
);
...
...
@@ -260,6 +260,7 @@ begin
if
rst_n_i
=
'0'
then
ctl_fmc_clk_oe_reg
<=
'0'
;
ctl_offset_dac_clr_n_reg
<=
'0'
;
ctl_serdes_calib_reg
<=
'0'
;
ctl_trig_led_reg
<=
'0'
;
ctl_acq_led_reg
<=
'0'
;
ctl_wack
<=
'0'
;
...
...
@@ -267,6 +268,7 @@ begin
if
ctl_wreq
=
'1'
then
ctl_fmc_clk_oe_reg
<=
wr_dat_d0
(
2
);
ctl_offset_dac_clr_n_reg
<=
wr_dat_d0
(
3
);
ctl_serdes_calib_reg
<=
wr_dat_d0
(
4
);
ctl_trig_led_reg
<=
wr_dat_d0
(
6
);
ctl_acq_led_reg
<=
wr_dat_d0
(
7
);
end
if
;
...
...
@@ -624,7 +626,7 @@ begin
end
process
;
-- Process for read requests.
process
(
rd_adr_d0
,
rd_req_d0
,
fmc_adc_100ms_csr_i
.
ctl_fsm_cmd
,
ctl_fmc_clk_oe_reg
,
ctl_offset_dac_clr_n_reg
,
fmc_adc_100ms_csr_i
.
ctl_man_bitslip
,
ctl_trig_led_reg
,
ctl_acq_led_reg
,
fmc_adc_100ms_csr_i
.
ctl_clear_trig_stat
,
fmc_adc_100ms_csr_i
.
ctl_calib_apply
,
fmc_adc_100ms_csr_i
.
sta_fsm
,
fmc_adc_100ms_csr_i
.
sta_serdes_pll
,
fmc_adc_100ms_csr_i
.
sta_serdes_synced
,
fmc_adc_100ms_csr_i
.
sta_acq_cfg
,
fmc_adc_100ms_csr_i
.
sta_fmc_nr
,
fmc_adc_100ms_csr_i
.
sta_calib_busy
,
fmc_adc_100ms_csr_i
.
trig_stat_ext
,
fmc_adc_100ms_csr_i
.
trig_stat_sw
,
fmc_adc_100ms_csr_i
.
trig_stat_time
,
fmc_adc_100ms_csr_i
.
trig_stat_ch1
,
fmc_adc_100ms_csr_i
.
trig_stat_ch2
,
fmc_adc_100ms_csr_i
.
trig_stat_ch3
,
fmc_adc_100ms_csr_i
.
trig_stat_ch4
,
trig_en_ext_reg
,
fmc_adc_100ms_csr_i
.
trig_en_sw
,
trig_en_time_reg
,
fmc_adc_100ms_csr_i
.
trig_en_aux_time
,
trig_en_ch1_reg
,
trig_en_ch2_reg
,
trig_en_ch3_reg
,
trig_en_ch4_reg
,
trig_pol_ext_reg
,
trig_pol_ch1_reg
,
trig_pol_ch2_reg
,
trig_pol_ch3_reg
,
trig_pol_ch4_reg
,
ext_trig_dly_reg
,
shots_nbr_reg
,
fmc_adc_100ms_csr_i
.
shots_remain
,
fmc_adc_100ms_csr_i
.
multi_depth
,
fmc_adc_100ms_csr_i
.
trig_pos
,
fmc_adc_100ms_csr_i
.
fs_freq
,
downsample_reg
,
pre_samples_reg
,
post_samples_reg
,
fmc_adc_100ms_csr_i
.
samples_cnt
,
fmc_adc_ch1_i
.
dat
,
fmc_adc_ch1_rack
,
fmc_adc_ch2_i
.
dat
,
fmc_adc_ch2_rack
,
fmc_adc_ch3_i
.
dat
,
fmc_adc_ch3_rack
,
fmc_adc_ch4_i
.
dat
,
fmc_adc_ch4_rack
)
begin
process
(
rd_adr_d0
,
rd_req_d0
,
fmc_adc_100ms_csr_i
.
ctl_fsm_cmd
,
ctl_fmc_clk_oe_reg
,
ctl_offset_dac_clr_n_reg
,
ctl_serdes_calib_reg
,
ctl_trig_led_reg
,
ctl_acq_led_reg
,
fmc_adc_100ms_csr_i
.
ctl_clear_trig_stat
,
fmc_adc_100ms_csr_i
.
ctl_calib_apply
,
fmc_adc_100ms_csr_i
.
sta_fsm
,
fmc_adc_100ms_csr_i
.
sta_serdes_pll
,
fmc_adc_100ms_csr_i
.
sta_serdes_synced
,
fmc_adc_100ms_csr_i
.
sta_acq_cfg
,
fmc_adc_100ms_csr_i
.
sta_fmc_nr
,
fmc_adc_100ms_csr_i
.
sta_calib_busy
,
fmc_adc_100ms_csr_i
.
trig_stat_ext
,
fmc_adc_100ms_csr_i
.
trig_stat_sw
,
fmc_adc_100ms_csr_i
.
trig_stat_time
,
fmc_adc_100ms_csr_i
.
trig_stat_ch1
,
fmc_adc_100ms_csr_i
.
trig_stat_ch2
,
fmc_adc_100ms_csr_i
.
trig_stat_ch3
,
fmc_adc_100ms_csr_i
.
trig_stat_ch4
,
trig_en_ext_reg
,
fmc_adc_100ms_csr_i
.
trig_en_sw
,
trig_en_time_reg
,
fmc_adc_100ms_csr_i
.
trig_en_aux_time
,
trig_en_ch1_reg
,
trig_en_ch2_reg
,
trig_en_ch3_reg
,
trig_en_ch4_reg
,
trig_pol_ext_reg
,
trig_pol_ch1_reg
,
trig_pol_ch2_reg
,
trig_pol_ch3_reg
,
trig_pol_ch4_reg
,
ext_trig_dly_reg
,
shots_nbr_reg
,
fmc_adc_100ms_csr_i
.
shots_remain
,
fmc_adc_100ms_csr_i
.
multi_depth
,
fmc_adc_100ms_csr_i
.
trig_pos
,
fmc_adc_100ms_csr_i
.
fs_freq
,
downsample_reg
,
pre_samples_reg
,
post_samples_reg
,
fmc_adc_100ms_csr_i
.
samples_cnt
,
fmc_adc_ch1_i
.
dat
,
fmc_adc_ch1_rack
,
fmc_adc_ch2_i
.
dat
,
fmc_adc_ch2_rack
,
fmc_adc_ch3_i
.
dat
,
fmc_adc_ch3_rack
,
fmc_adc_ch4_i
.
dat
,
fmc_adc_ch4_rack
)
begin
-- By default ack read requests
rd_dat_d0
<=
(
others
=>
'X'
);
fmc_adc_ch1_re
<=
'0'
;
...
...
@@ -640,7 +642,7 @@ begin
rd_dat_d0
(
1
downto
0
)
<=
fmc_adc_100ms_csr_i
.
ctl_fsm_cmd
;
rd_dat_d0
(
2
)
<=
ctl_fmc_clk_oe_reg
;
rd_dat_d0
(
3
)
<=
ctl_offset_dac_clr_n_reg
;
rd_dat_d0
(
4
)
<=
fmc_adc_100ms_csr_i
.
ctl_man_bitslip
;
rd_dat_d0
(
4
)
<=
ctl_serdes_calib_reg
;
rd_dat_d0
(
5
)
<=
'0'
;
rd_dat_d0
(
6
)
<=
ctl_trig_led_reg
;
rd_dat_d0
(
7
)
<=
ctl_acq_led_reg
;
...
...
hdl/platform/xilinx/spartan6/ltc2174_2l16b_receiver.vhd
View file @
87652e47
...
...
@@ -50,8 +50,8 @@ entity ltc2174_2l16b_receiver is
adc_outb_n_i
:
in
std_logic_vector
(
3
downto
0
);
-- Async reset input (active high) for iserdes
serdes_arst_i
:
in
std_logic
:
=
'0'
;
--
Manual bitslip command (optional
)
serdes_
bslip
_i
:
in
std_logic
:
=
'0'
;
--
Enable serdes calibration (start with an initial calibration
)
serdes_
calib
_i
:
in
std_logic
:
=
'0'
;
-- SERDES BUFPLL lock status flag
-- (used when g_USE_PLL=TRUE, otherwise it is tied to '1')
serdes_locked_o
:
out
std_logic
;
...
...
@@ -76,7 +76,6 @@ architecture arch of ltc2174_2l16b_receiver is
signal
clk_serdes_n
:
std_logic
;
signal
clk_div_buf
:
std_logic
;
signal
serdes_strobe
:
std_logic
:
=
'0'
;
signal
serdes_auto_bslip
:
std_logic
:
=
'0'
;
signal
serdes_bitslip
:
std_logic
:
=
'0'
;
signal
serdes_synced
:
std_logic
:
=
'0'
;
signal
serdes_m2s_shift
:
std_logic_vector
(
8
downto
0
)
:
=
(
others
=>
'0'
);
...
...
@@ -226,7 +225,7 @@ begin -- architecture arch
if
rising_edge
(
clk_div_buf
)
then
ce
<=
'0'
;
inc
<=
'0'
;
if
iodelay_recal
=
'1'
then
if
serdes_calib_i
=
'0'
or
iodelay_recal
=
'1'
then
phasediff
<=
"10000"
;
elsif
serdes_valid
(
i
)
=
'1'
then
if
serdes_incdec
(
i
)
=
'1'
then
...
...
@@ -272,7 +271,7 @@ begin -- architecture arch
iodelay_recal
<=
'1'
;
case
state
is
when
S_RESET
=>
if
iodelay_busy
=
'0'
then
if
serdes_calib_i
=
'1'
and
iodelay_busy
=
'0'
then
state
:
=
S_RSTCAL
;
end
if
;
when
S_RSTCAL
=>
...
...
@@ -289,7 +288,9 @@ begin -- architecture arch
end
if
;
when
S_WAIT
=>
-- Periodically calibrate
if
counter
=
2
**
20
then
if
serdes_calib_i
=
'0'
then
state
:
=
S_RESET
;
elsif
counter
=
2
**
20
then
if
iodelay_busy
=
'0'
then
iodelay_cal_s
<=
'1'
;
state
:
=
S_BUSY
;
...
...
@@ -448,19 +449,18 @@ begin -- architecture arch
-- Generate bitslip and synced signal
if
bitslip_sreg
(
bitslip_sreg
'LEFT
)
=
'1'
then
if
serdes_out_fr
/=
"0000000"
and
serdes_out_fr
/=
"1111111"
then
serdes_
auto_b
slip
<=
'1'
;
serdes_
bit
slip
<=
'1'
;
serdes_synced
<=
'0'
;
else
serdes_
auto_b
slip
<=
'0'
;
serdes_
bit
slip
<=
'0'
;
serdes_synced
<=
'1'
;
end
if
;
else
serdes_
auto_b
slip
<=
'0'
;
serdes_
bit
slip
<=
'0'
;
end
if
;
end
if
;
end
process
p_auto_bitslip
;
serdes_bitslip
<=
serdes_auto_bslip
or
serdes_bslip_i
;
serdes_synced_o
<=
serdes_synced
;
------------------------------------------------------------------------------
...
...
hdl/rtl/fmc_adc_100Ms_core.vhd
View file @
87652e47
...
...
@@ -153,8 +153,7 @@ architecture rtl of fmc_adc_100Ms_core is
-- SerDes
signal
serdes_out_data
:
std_logic_vector
(
63
downto
0
);
signal
serdes_out_data_synced
:
std_logic_vector
(
63
downto
0
);
signal
serdes_man_bitslip
:
std_logic
;
signal
serdes_man_bitslip_sync
:
std_logic
;
signal
serdes_calib_sync
:
std_logic
;
signal
serdes_locked
:
std_logic
;
signal
serdes_locked_sync
:
std_logic
;
signal
serdes_synced
:
std_logic
;
...
...
@@ -430,8 +429,8 @@ begin
port
map
(
clk_i
=>
fs_clk
,
rst_n_a_i
=>
'1'
,
d_i
=>
serdes_man_bitslip
,
q_o
=>
serdes_
man_bitslip
_sync
);
d_i
=>
csr_regout
.
ctl_serdes_calib
,
q_o
=>
serdes_
calib
_sync
);
cmp_adc_serdes
:
entity
work
.
ltc2174_2l16b_receiver
generic
map
(
...
...
@@ -446,7 +445,7 @@ begin
adc_outb_p_i
=>
adc_outb_p_i
,
adc_outb_n_i
=>
adc_outb_n_i
,
serdes_arst_i
=>
serdes_arst
,
serdes_
bslip_i
=>
serdes_man_bitslip
_sync
,
serdes_
calib_i
=>
serdes_calib
_sync
,
serdes_locked_o
=>
serdes_locked
,
serdes_synced_o
=>
serdes_synced
,
adc_data_o
=>
serdes_out_data
,
...
...
@@ -487,7 +486,6 @@ begin
fmc_adc_ch4_o
=>
wb_channel_in
(
4
));
csr_regin
.
ctl_fsm_cmd
<=
fsm_cmd
;
csr_regin
.
ctl_man_bitslip
<=
serdes_man_bitslip
;
csr_regin
.
ctl_clear_trig_stat
<=
trig_storage_clear
;
csr_regin
.
ctl_calib_apply
<=
sync_calib_apply
;
...
...
@@ -533,12 +531,10 @@ begin
if
rising_edge
(
sys_clk_i
)
then
if
ctl_reg_wr
=
'1'
then
fsm_cmd
<=
csr_regout
.
ctl_fsm_cmd
;
serdes_man_bitslip
<=
csr_regout
.
ctl_man_bitslip
;
trig_storage_clear
<=
csr_regout
.
ctl_clear_trig_stat
;
sync_calib_apply
<=
csr_regout
.
ctl_calib_apply
;
else
fsm_cmd
<=
(
others
=>
'0'
);
serdes_man_bitslip
<=
'0'
;
trig_storage_clear
<=
'0'
;
sync_calib_apply
<=
'0'
;
end
if
;
...
...
hdl/testbench/include/fmc_adc_100Ms_csr.v
View file @
87652e47
...
...
@@ -10,8 +10,8 @@
`define
FMC_ADC_100MS_CSR_CTL_FMC_CLK_OE
'
h4
`define
FMC_ADC_100MS_CSR_CTL_OFFSET_DAC_CLR_N_OFFSET 3
`define
FMC_ADC_100MS_CSR_CTL_OFFSET_DAC_CLR_N
'
h8
`define
FMC_ADC_100MS_CSR_CTL_
MAN_BITSLIP
_OFFSET 4
`define
FMC_ADC_100MS_CSR_CTL_
MAN_BITSLIP
'
h10
`define
FMC_ADC_100MS_CSR_CTL_
SERDES_CALIB
_OFFSET 4
`define
FMC_ADC_100MS_CSR_CTL_
SERDES_CALIB
'
h10
`define
FMC_ADC_100MS_CSR_CTL_TRIG_LED_OFFSET 6
`define
FMC_ADC_100MS_CSR_CTL_TRIG_LED
'
h40
`define
FMC_ADC_100MS_CSR_CTL_ACQ_LED_OFFSET 7
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment