From fa6bde951cdd0e2364428a1d628ebee5e94324eb Mon Sep 17 00:00:00 2001 From: Marco Bartolucci Date: Fri, 17 Feb 2017 13:58:55 +0100 Subject: [PATCH] Added CPLD-based synchronization This is a proof of concept and it's still very crude For more info read (http://spcomnav.uab.es/docs/conferences/Bartolucci_NAVITEC_2016.pdf) --- firmware/cpld/sgpio_if/README.md | 12 ++++ firmware/cpld/sgpio_if/default_sync.xsvf | Bin 0 -> 37629 bytes firmware/cpld/sgpio_if/top.jed | 38 +++++----- firmware/cpld/sgpio_if/top.ucf | 86 ++++++++++++----------- firmware/cpld/sgpio_if/top.vhd | 28 ++++++-- 5 files changed, 101 insertions(+), 63 deletions(-) create mode 100755 firmware/cpld/sgpio_if/default_sync.xsvf diff --git a/firmware/cpld/sgpio_if/README.md b/firmware/cpld/sgpio_if/README.md index 44fe9a8c..ee37fb41 100644 --- a/firmware/cpld/sgpio_if/README.md +++ b/firmware/cpld/sgpio_if/README.md @@ -1,6 +1,18 @@ CPLD interface between LPC43xx microcontroller SGPIO peripheral and MAX5864 RF codec. +CPLD-based triggered capture +============================ + +Code related to the paper: + +[M. Bartolucci, J. A. del Peral-Rosado, R. Estatuet-Castillo, J. A. Garcia-Molina, M. Crisci, G. E. Corazza, "Synchronisation of low-cost open source SDRs for navigation applications", Proc. 8th ESA Workshop on Satellite Navigation User Equipment Technologies (NAVITEC), Dec 16 2016](http://spcomnav.uab.es/docs/conferences/Bartolucci_NAVITEC_2016.pdf) + +Please read the paper for hardware correction and additional details. + +* If you don't want to build use `code]default_sync.xsvf` to flash the CPLD +* This is still a very rough implementation. Synchronization can't be disabled! + Requirements ============ diff --git a/firmware/cpld/sgpio_if/default_sync.xsvf b/firmware/cpld/sgpio_if/default_sync.xsvf new file mode 100755 index 0000000000000000000000000000000000000000..104ab92d35cfd99a25332117ce62abc2060919fd GIT binary patch literal 37629 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 D>gFVl literal 0 HcmV?d00001 diff --git a/firmware/cpld/sgpio_if/top.jed b/firmware/cpld/sgpio_if/top.jed index abe1ddf1..36a8d855 100755 --- a/firmware/cpld/sgpio_if/top.jed +++ b/firmware/cpld/sgpio_if/top.jed @@ -1,5 +1,5 @@ Programmer Jedec Bit Map -Date Extracted: Wed Aug 20 08:36:47 2014 +Date Extracted: Fri Jul 8 16:10:08 2016 QF25812* QP100* @@ -375,14 +375,14 @@ L012944 1111111111111111* L012960 1111111010110111* L012976 1111111011010111* L012992 1110101011111111* -L013008 1100111011111111* +L013008 0110111011111111* L013024 1110101011111111* L013040 1111111010110111* L013056 1110101011111111* L013072 1111111010110111* L013088 1111111010110111* L013104 1111111111111111* -L013120 1111111010110111* +L013120 1100111011111111* L013136 1111111011010111* L013152 1111111111111111* L013168 1111111111111111* @@ -395,7 +395,7 @@ L013264 1111111011010111* L013280 1111111011010111* L013296 1111111111111111* L013312 1111111111111111* -L013328 1111111111111111* +L013328 1111111010110111* L013344 1111111111111111* L013360 1111111111111111* L013376 1111111111111111* @@ -410,15 +410,15 @@ L013504 1111111111111111* L013520 1111111111111111* Note Block 2 PLA AND array * -L013536 11110111110111111111111111111111111111111111111111111111111111111011111111111111* -L013616 11011011111001110111111111111111111111111111111111111111111111111011111111111111* -L013696 11110111111011011111111111111111111111111111111111111111111111111111111111111111* -L013776 11111011110111011111111111111111111111111111111111111111111111111111111111111111* +L013536 11110111110111011111111111111111111111111111111111111111111111111011111111111111* +L013616 11011011111001010111111111111111111111111111111111111111111111111011111111111111* +L013696 11110111111011111111111111110111111111111111111111111111111111111111111111111111* +L013776 11111011110111111111111111110111111111111111111111111111111111111111111111111111* L013856 11111111111111111101011111111111111111111111111111111111111111111111111111111111* L013936 11111111111111111110101111111111111111111111111111111111111111111111111111111111* -L014016 11111111111111111111011111110111111111111111111111111111111111111111111111111111* +L014016 11111111111111111111011111111111111111111111111111111101111111111111111111111111* L014096 11111111111011111111111111111111111111111111111111111111111111111111111111111111* -L014176 11111111111111111111101111111011111111111111111111111111111111111111111111111111* +L014176 11111111111111111111101111111111111111111111111111111110111111111111111111111111* L014256 11111111011111111111011111111111111111111111111111111111111111111111111111111111* L014336 11111111101111111111101111111111111111111111111111111111111111111111111111111111* L014416 11111111111111111111011101111111111111111111111111111111111111111111111111111111* @@ -552,8 +552,8 @@ L019376 1111111111111111* L019392 1111111111111111* L019408 1111111111111111* L019424 1111111111111111* -L019440 1111111111111111* -L019456 1111111111111111* +L019440 1111111011100111* +L019456 1111111010110111* L019472 1111111111111111* L019488 1111111111111111* L019504 1111111111111111* @@ -592,8 +592,8 @@ L019984 111111111111111111111111111111111111111111111111111111111111111111111111 L020064 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L020144 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L020224 11111111111111111111111111111111111111111111111111111111111111111111111111111111* -L020304 11111111111111111111111111111111111111111111111111111111111111111111111111111111* -L020384 11111111111111111111111111111111111111111111111111111111111111111111111111111111* +L020304 11111111111111011111111111111111111111111111111111111111111111111111111111111111* +L020384 11111111111101111111111111111111111111111111111111111111111111111111111111111111* L020464 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L020544 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L020624 11111111111111111111111111111111111111111111111111111111111111111111111111111111* @@ -637,7 +637,7 @@ L023584 111111111111111111111111111111111111111111111111111111111111111111111111 L023664 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L023744 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L023824 11111111111111111111111111111111111111111111111111111111111111111111111111111111* -L023904 11111111111111111111111111111111111111111111111111111111111111111111111111111111* +L023904 11111111111110111111111111111111111111111111111111111111111111111111111111111111* L023984 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L024064 11111111111111111111111111111111111111111111111111111111111111111111111111111111* L024144 11111111111111111111111111111111111111111111111111111111111111111111111111111111* @@ -717,8 +717,8 @@ L025576 000001111001111110011111100* L025603 000001111001111110011111100* L025630 000001111001111110011111100* L025657 000001111001111110011111100* -L025684 000001111001111110011111100* -L025711 000001111001111110011111100* +L025684 101101011000010000011111101* +L025711 000001111001111101010000011* L025738 000001111001111110011111100* L025765 000001111001111110011111100* @@ -753,5 +753,5 @@ L025810 0* Note I/O Bank 1 Vcco * L025811 0* -CFB93* -AA7A +CF7BB* +AA74 diff --git a/firmware/cpld/sgpio_if/top.ucf b/firmware/cpld/sgpio_if/top.ucf index db85ab13..aa7ebdf6 100755 --- a/firmware/cpld/sgpio_if/top.ucf +++ b/firmware/cpld/sgpio_if/top.ucf @@ -18,51 +18,57 @@ # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. -NET "CODEC_CLK" LOC="23" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "CODEC_X2_CLK" LOC="27" |IOSTANDARD=LVCMOS33; - NET "CODEC_X2_CLK" TNM_NET = CODEC_X2_CLK; TIMESPEC TS_codec_x2_data = PERIOD "CODEC_X2_CLK" 25 ns; -NET "DA<7>" LOC="35" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<6>" LOC="36" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<5>" LOC="37" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<4>" LOC="39" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<3>" LOC="40" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<2>" LOC="41" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<1>" LOC="42" |IOSTANDARD=LVCMOS33 | TNM=adc_data; -NET "DA<0>" LOC="43" |IOSTANDARD=LVCMOS33 | TNM=adc_data; - -NET "DD<9>" LOC="17" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<8>" LOC="18" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<7>" LOC="19" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<6>" LOC="24" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<5>" LOC="28" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<4>" LOC="29" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<3>" LOC="30" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<2>" LOC="32" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<1>" LOC="33" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; -NET "DD<0>" LOC="34" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=dac_data; - -NET "HOST_DIRECTION" LOC="71" |IOSTANDARD=LVCMOS33 | SLEW=SLOW; -NET "HOST_DISABLE" LOC="76" |IOSTANDARD=LVCMOS33 | SLEW=SLOW; -NET "HOST_CAPTURE" LOC="91" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<7>" LOC="77" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<6>" LOC="61" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<5>" LOC="64" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<4>" LOC="67" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<3>" LOC="72" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<2>" LOC="74" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<1>" LOC="79" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; -NET "HOST_DATA<0>" LOC="89" |IOSTANDARD=LVCMOS33 | SLEW=SLOW | TNM=to_host; - -NET "HOST_DECIM_SEL<2>" LOC="78" |IOSTANDARD=LVCMOS33; -NET "HOST_DECIM_SEL<1>" LOC="81" |IOSTANDARD=LVCMOS33; -NET "HOST_DECIM_SEL<0>" LOC="90" |IOSTANDARD=LVCMOS33; -NET "HOST_Q_INVERT" LOC="70" |IOSTANDARD=LVCMOS33; - TIMEGRP "adc_data" OFFSET = IN 16 ns BEFORE "CODEC_X2_CLK"; TIMEGRP "dac_data" OFFSET = OUT 15 ns AFTER "CODEC_X2_CLK"; TIMEGRP "to_host" OFFSET = OUT 20 ns AFTER "CODEC_X2_CLK"; +#PACE: Start of Constraints generated by PACE + +#PACE: Start of PACE I/O Pin Assignments +NET "CODEC_CLK" LOC = "P23" | IOSTANDARD = LVCMOS33 ; +NET "CODEC_X2_CLK" LOC = "P27" | IOSTANDARD = LVCMOS33 ; +NET "DA<0>" LOC = "P43" | IOSTANDARD = LVCMOS33 ; +NET "DA<1>" LOC = "P42" | IOSTANDARD = LVCMOS33 ; +NET "DA<2>" LOC = "P41" | IOSTANDARD = LVCMOS33 ; +NET "DA<3>" LOC = "P40" | IOSTANDARD = LVCMOS33 ; +NET "DA<4>" LOC = "P39" | IOSTANDARD = LVCMOS33 ; +NET "DA<5>" LOC = "P37" | IOSTANDARD = LVCMOS33 ; +NET "DA<6>" LOC = "P36" | IOSTANDARD = LVCMOS33 ; +NET "DA<7>" LOC = "P35" | IOSTANDARD = LVCMOS33 ; +NET "DD<0>" LOC = "P34" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<1>" LOC = "P33" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<2>" LOC = "P32" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<3>" LOC = "P30" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<4>" LOC = "P29" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<5>" LOC = "P28" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<6>" LOC = "P24" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<7>" LOC = "P19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<8>" LOC = "P18" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "DD<9>" LOC = "P17" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_CAPTURE" LOC = "P91" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<0>" LOC = "P89" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<1>" LOC = "P79" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<2>" LOC = "P74" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<3>" LOC = "P72" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<4>" LOC = "P67" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<5>" LOC = "P64" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<6>" LOC = "P61" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DATA<7>" LOC = "P77" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; +NET "HOST_DECIM_SEL<0>" LOC = "P90" | IOSTANDARD = LVCMOS33 ; +NET "HOST_DECIM_SEL<1>" LOC = "P81" | IOSTANDARD = LVCMOS33 ; +NET "HOST_DECIM_SEL<2>" LOC = "P78" | IOSTANDARD = LVCMOS33 ; +NET "HOST_DIRECTION" LOC = "P71" | IOSTANDARD = LVCMOS33 ; +NET "HOST_DISABLE" LOC = "P76" | IOSTANDARD = LVCMOS33 ; +NET "HOST_Q_INVERT" LOC = "P70" | IOSTANDARD = LVCMOS33 ; +NET "HOST_SYNC" LOC = "P55" | IOSTANDARD = LVCMOS33; +NET "HOST_SYNC_CMD" LOC = "P56" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ; + +#PACE: Start of PACE Area Constraints + +#PACE: Start of PACE Prohibit Constraints + +#PACE: End of Constraints generated by PACE diff --git a/firmware/cpld/sgpio_if/top.vhd b/firmware/cpld/sgpio_if/top.vhd index c74bcd0b..a4c11033 100755 --- a/firmware/cpld/sgpio_if/top.vhd +++ b/firmware/cpld/sgpio_if/top.vhd @@ -30,6 +30,8 @@ entity top is Port( HOST_DATA : inout std_logic_vector(7 downto 0); HOST_CAPTURE : out std_logic; + HOST_SYNC_CMD : out std_logic; + HOST_SYNC : in std_logic; HOST_DISABLE : in std_logic; HOST_DIRECTION : in std_logic; HOST_DECIM_SEL : in std_logic_vector(2 downto 0); @@ -56,6 +58,9 @@ architecture Behavioral of top is signal host_data_enable_i : std_logic; signal host_data_capture_o : std_logic; + signal host_sync_o : std_logic := '0'; + signal host_sync_i : std_logic := '0'; + signal host_sync_latched : std_logic := '0'; signal data_from_host_i : std_logic_vector(7 downto 0); signal data_to_host_o : std_logic_vector(7 downto 0); @@ -95,6 +100,9 @@ begin data_from_host_i <= HOST_DATA; HOST_CAPTURE <= host_data_capture_o; + host_sync_i <= HOST_SYNC; + HOST_SYNC_CMD <= host_sync_o; + host_data_enable_i <= not HOST_DISABLE; transfer_direction_i <= to_dac when HOST_DIRECTION = '1' else from_adc; @@ -149,18 +157,30 @@ begin end if; end if; end process; + + process (host_data_enable_i, host_sync_i) + begin + host_sync_o <= host_data_enable_i; + if host_data_enable_i = '1' then + if rising_edge(host_sync_i) then + host_sync_latched <= host_sync_i; + end if; + else + host_sync_latched <= '0'; + end if; + end process; process(host_clk_i) begin if rising_edge(host_clk_i) then if transfer_direction_i = to_dac then if codec_clk_i = '1' then - host_data_capture_o <= host_data_enable_i; + host_data_capture_o <= host_data_enable_i and host_sync_latched; end if; else - if codec_clk_i = '0' then - host_data_capture_o <= host_data_enable_i and decimate_en; - end if; + if codec_clk_i = '0' then + host_data_capture_o <= host_data_enable_i and decimate_en and host_sync_latched; + end if; end if; end if; end process;