Add PLL and reset FPGA via GPIO
This commit is contained in:
		
							parent
							
								
									e198b3bc91
								
							
						
					
					
						commit
						bd8273558c
					
				|  | @ -94,7 +94,7 @@ package puzzlefw_pkg is | ||||||
|     -- Firmware info word. |     -- Firmware info word. | ||||||
|     constant fw_api_version:        natural := 1; |     constant fw_api_version:        natural := 1; | ||||||
|     constant fw_version_major:      natural := 0; |     constant fw_version_major:      natural := 0; | ||||||
|     constant fw_version_minor:      natural := 10; |     constant fw_version_minor:      natural := 11; | ||||||
|     constant fw_info_word:          std_logic_vector(31 downto 0) := |     constant fw_info_word:          std_logic_vector(31 downto 0) := | ||||||
|         x"4a" |         x"4a" | ||||||
|         & std_logic_vector(to_unsigned(fw_api_version, 8)) |         & std_logic_vector(to_unsigned(fw_api_version, 8)) | ||||||
|  |  | ||||||
|  | @ -71,16 +71,27 @@ architecture arch of puzzlefw_top is | ||||||
|     -- Auxiliary clock from FCLK0. |     -- Auxiliary clock from FCLK0. | ||||||
|     signal clk_fclk:        std_logic; |     signal clk_fclk:        std_logic; | ||||||
| 
 | 
 | ||||||
|     -- Main reset signal, derived from FCLK_RESET0, active high, synchronous to clk_adc. |     -- Reset signals. | ||||||
|     signal s_reset:         std_logic; |     signal s_gpio_reset_n:  std_logic;  -- reset signal from GPIO, active low | ||||||
|  |     signal s_pll_reset:     std_logic;  -- reset signal for PLL | ||||||
|  |     signal s_pll_locked:    std_logic;  -- PLL locked status | ||||||
|  |     signal s_ext_reset_n:   std_logic;  -- reset signal for processing system | ||||||
|  |     signal s_reset:         std_logic;  -- main reset, synchronized to clk_adc | ||||||
| 
 | 
 | ||||||
|     -- Internal clock signal. |     -- Internal clock signals. | ||||||
|     signal s_adc_clk_ibuf:  std_logic; |     signal s_adc_clk_ibuf:  std_logic; | ||||||
|  |     signal s_pll_clkfbout:  std_logic; | ||||||
|  |     signal s_pll_clkfbin:   std_logic; | ||||||
|  |     signal s_pll_clkout:    std_logic; | ||||||
| 
 | 
 | ||||||
|     -- Blinking LED. |     -- Blinking LED. | ||||||
|     signal r_adcclk_cnt:    unsigned(25 downto 0); |     signal r_adcclk_cnt:    unsigned(25 downto 0); | ||||||
|     signal r_adcclk_led:    std_logic; |     signal r_adcclk_led:    std_logic; | ||||||
| 
 | 
 | ||||||
|  |     -- Internal GPIO bus from PS. | ||||||
|  |     signal s_gpio_in:       std_logic_vector(23 downto 0); | ||||||
|  |     signal s_gpio_out:      std_logic_vector(23 downto 0); | ||||||
|  | 
 | ||||||
|     -- APB bus for register access. |     -- APB bus for register access. | ||||||
|     signal s_apb_paddr:     std_logic_vector(31 downto 0); |     signal s_apb_paddr:     std_logic_vector(31 downto 0); | ||||||
|     signal s_apb_penable:   std_logic; |     signal s_apb_penable:   std_logic; | ||||||
|  | @ -168,6 +179,20 @@ architecture arch of puzzlefw_top is | ||||||
| 
 | 
 | ||||||
| begin | begin | ||||||
| 
 | 
 | ||||||
|  |     -- Global FPGA reset. | ||||||
|  |     -- GPIO(0) = '0' to reset. | ||||||
|  |     s_gpio_reset_n  <= s_gpio_out(0); | ||||||
|  | 
 | ||||||
|  |     -- ADC clock duty cycle stabilizer. | ||||||
|  |     -- GPIO(2) = '1' to enable, '0' to disable. | ||||||
|  |     adc_cdcs_o      <= s_gpio_out(2); | ||||||
|  | 
 | ||||||
|  |     -- GPIO inputs to the PS. | ||||||
|  |     -- GPIO(1) = '0' while in reset, '1' when reset released. | ||||||
|  |     s_gpio_in(1) <= not s_reset; | ||||||
|  |     s_gpio_in(0) <= '0'; | ||||||
|  |     s_gpio_in(23 downto 2) <= (others => '0'); | ||||||
|  | 
 | ||||||
|     -- Drive LEDs. |     -- Drive LEDs. | ||||||
|     led_o(0)    <= r_adcclk_led;                    -- blinking LED, 1 Hz |     led_o(0)    <= r_adcclk_led;                    -- blinking LED, 1 Hz | ||||||
|     led_o(1)    <= s_reg_control.acquisition_en;    -- acquisition enabled |     led_o(1)    <= s_reg_control.acquisition_en;    -- acquisition enabled | ||||||
|  | @ -175,9 +200,6 @@ begin | ||||||
|     led_o(3)    <= or_reduce(s_reg_control.timetagger_en);  -- timetagger enabled |     led_o(3)    <= or_reduce(s_reg_control.timetagger_en);  -- timetagger enabled | ||||||
|     led_o(7 downto 4) <= s_reg_control.led_state(7 downto 4); |     led_o(7 downto 4) <= s_reg_control.led_state(7 downto 4); | ||||||
| 
 | 
 | ||||||
|     -- Enable ADC clock duty cycle stabilizer. |  | ||||||
|     adc_cdcs_o  <= '1'; |  | ||||||
| 
 |  | ||||||
|     -- ADC clock outputs are not connected on vanilla Red Pitaya 125-14. |     -- ADC clock outputs are not connected on vanilla Red Pitaya 125-14. | ||||||
|     adc_clk_o   <= (others => 'Z'); |     adc_clk_o   <= (others => 'Z'); | ||||||
| 
 | 
 | ||||||
|  | @ -201,12 +223,45 @@ begin | ||||||
|             IB => adc_clk_i(0) |             IB => adc_clk_i(0) | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|     -- Clock buffer for ADC clock. |     -- PLL for 125 MHz clock. | ||||||
|     inst_bufg_adc_clk: BUFG |     -- Input clock comes from ADC. | ||||||
|  |     -- Output clock drives most of the FPGA design. | ||||||
|  |     inst_pll: PLLE2_BASE | ||||||
|  |         generic map ( | ||||||
|  |             BANDWIDTH           => "OPTIMIZED", | ||||||
|  |             CLKFBOUT_MULT       => 7, | ||||||
|  |             CLKFBOUT_PHASE      => 0.0, | ||||||
|  |             CLKIN1_PERIOD       => 8.0, | ||||||
|  |             CLKOUT0_DIVIDE      => 7, | ||||||
|  |             CLKOUT0_DUTY_CYCLE  => 0.5, | ||||||
|  |             CLKOUT0_PHASE       => 0.0, | ||||||
|  |             DIVCLK_DIVIDE       => 1, | ||||||
|  |             STARTUP_WAIT        => "FALSE" ) | ||||||
|         port map ( |         port map ( | ||||||
|             I => s_adc_clk_ibuf, |             CLKOUT0             => s_pll_clkout, | ||||||
|             O => clk_adc |             CLKFBOUT            => s_pll_clkfbout, | ||||||
|         ); |             LOCKED              => s_pll_locked, | ||||||
|  |             CLKIN1              => s_adc_clk_ibuf, | ||||||
|  |             PWRDWN              => '0', | ||||||
|  |             RST                 => s_pll_reset, | ||||||
|  |             CLKFBIN             => s_pll_clkfbin ); | ||||||
|  | 
 | ||||||
|  |     -- Reset PLL when external reset is applied. | ||||||
|  |     s_pll_reset <= not s_gpio_reset_n; | ||||||
|  | 
 | ||||||
|  |     -- Reset processing system when PLL is not locked. | ||||||
|  |     s_ext_reset_n <= s_gpio_reset_n and s_pll_locked; | ||||||
|  | 
 | ||||||
|  |     -- Clock buffers for PLL. | ||||||
|  |     inst_bufg_pll_clkfb: BUFG | ||||||
|  |         port map ( | ||||||
|  |             I => s_pll_clkfbout, | ||||||
|  |             O => s_pll_clkfbin ); | ||||||
|  | 
 | ||||||
|  |     inst_bufg_pll_clkout: BUFG | ||||||
|  |         port map ( | ||||||
|  |             I => s_pll_clkout, | ||||||
|  |             O => clk_adc ); | ||||||
| 
 | 
 | ||||||
|     -- ARM/PS block design. |     -- ARM/PS block design. | ||||||
|     inst_blockdesign: entity work.puzzlefw_wrapper |     inst_blockdesign: entity work.puzzlefw_wrapper | ||||||
|  | @ -214,6 +269,7 @@ begin | ||||||
|             sys_clk             => clk_adc, |             sys_clk             => clk_adc, | ||||||
|             ps_fclk             => clk_fclk, |             ps_fclk             => clk_fclk, | ||||||
|             peripheral_reset_0(0) => s_reset, |             peripheral_reset_0(0) => s_reset, | ||||||
|  |             ext_reset_in_0      => s_ext_reset_n, | ||||||
|             DDR_0_addr          => DDR_0_addr, |             DDR_0_addr          => DDR_0_addr, | ||||||
|             DDR_0_ba            => DDR_0_ba, |             DDR_0_ba            => DDR_0_ba, | ||||||
|             DDR_0_cas_n         => DDR_0_cas_n, |             DDR_0_cas_n         => DDR_0_cas_n, | ||||||
|  | @ -235,6 +291,16 @@ begin | ||||||
|             FIXED_IO_0_ps_clk   => FIXED_IO_0_ps_clk, |             FIXED_IO_0_ps_clk   => FIXED_IO_0_ps_clk, | ||||||
|             FIXED_IO_0_ps_porb  => FIXED_IO_0_ps_porb, |             FIXED_IO_0_ps_porb  => FIXED_IO_0_ps_porb, | ||||||
|             FIXED_IO_0_ps_srstb => FIXED_IO_0_ps_srstb, |             FIXED_IO_0_ps_srstb => FIXED_IO_0_ps_srstb, | ||||||
|  |             GPIO_I_0            => s_gpio_in, | ||||||
|  |             GPIO_O_0            => s_gpio_out, | ||||||
|  |             SPI0_MOSI_O_0       => open, | ||||||
|  |             SPI0_MOSI_T_0       => open, | ||||||
|  |             SPI0_SCLK_O_0       => open, | ||||||
|  |             SPI0_SCLK_T_0       => open, | ||||||
|  |             SPI0_SS1_O_0        => open, | ||||||
|  |             SPI0_SS_O_0         => open, | ||||||
|  |             SPI0_SS_T_0         => open, | ||||||
|  |             IRQ_F2P             => s_irq_f2p, | ||||||
|             APB_M_0_paddr       => s_apb_paddr, |             APB_M_0_paddr       => s_apb_paddr, | ||||||
|             APB_M_0_penable     => s_apb_penable, |             APB_M_0_penable     => s_apb_penable, | ||||||
|             APB_M_0_prdata      => s_apb_prdata, |             APB_M_0_prdata      => s_apb_prdata, | ||||||
|  | @ -243,7 +309,6 @@ begin | ||||||
|             APB_M_0_pslverr(0)  => s_apb_pslverr, |             APB_M_0_pslverr(0)  => s_apb_pslverr, | ||||||
|             APB_M_0_pwdata      => s_apb_pwdata, |             APB_M_0_pwdata      => s_apb_pwdata, | ||||||
|             APB_M_0_pwrite      => s_apb_pwrite, |             APB_M_0_pwrite      => s_apb_pwrite, | ||||||
|             IRQ_F2P             => s_irq_f2p, |  | ||||||
|             S_AXI_HP0_0_araddr  => s_axi_araddr, |             S_AXI_HP0_0_araddr  => s_axi_araddr, | ||||||
|             S_AXI_HP0_0_arburst => s_axi_arburst, |             S_AXI_HP0_0_arburst => s_axi_arburst, | ||||||
|             S_AXI_HP0_0_arcache => s_axi_arcache, |             S_AXI_HP0_0_arcache => s_axi_arcache, | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| { | { | ||||||
|   "design": { |   "design": { | ||||||
|     "design_info": { |     "design_info": { | ||||||
|       "boundary_crc": "0x3DCD19FE44770B59", |       "boundary_crc": "0x9117A810100AEEF7", | ||||||
|       "device": "xc7z010clg400-1", |       "device": "xc7z010clg400-1", | ||||||
|       "gen_directory": "../../../../redpitaya_puzzlefw.gen/sources_1/bd/puzzlefw", |       "gen_directory": "../../../../redpitaya_puzzlefw.gen/sources_1/bd/puzzlefw", | ||||||
|       "name": "puzzlefw", |       "name": "puzzlefw", | ||||||
|  | @ -18,7 +18,8 @@ | ||||||
|           "auto_pc": "" |           "auto_pc": "" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "axi_apb_bridge_0": "" |       "axi_apb_bridge_0": "", | ||||||
|  |       "xlconstant_0": "" | ||||||
|     }, |     }, | ||||||
|     "interface_ports": { |     "interface_ports": { | ||||||
|       "DDR_0": { |       "DDR_0": { | ||||||
|  | @ -284,6 +285,51 @@ | ||||||
|             "value_src": "default" |             "value_src": "default" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |       }, | ||||||
|  |       "ext_reset_in_0": { | ||||||
|  |         "type": "rst", | ||||||
|  |         "direction": "I", | ||||||
|  |         "parameters": { | ||||||
|  |           "INSERT_VIP": { | ||||||
|  |             "value": "0", | ||||||
|  |             "value_src": "default" | ||||||
|  |           }, | ||||||
|  |           "POLARITY": { | ||||||
|  |             "value": "ACTIVE_LOW", | ||||||
|  |             "value_src": "default" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "GPIO_I_0": { | ||||||
|  |         "direction": "I", | ||||||
|  |         "left": "23", | ||||||
|  |         "right": "0" | ||||||
|  |       }, | ||||||
|  |       "GPIO_O_0": { | ||||||
|  |         "direction": "O", | ||||||
|  |         "left": "23", | ||||||
|  |         "right": "0" | ||||||
|  |       }, | ||||||
|  |       "SPI0_SCLK_O_0": { | ||||||
|  |         "direction": "O" | ||||||
|  |       }, | ||||||
|  |       "SPI0_SCLK_T_0": { | ||||||
|  |         "direction": "O" | ||||||
|  |       }, | ||||||
|  |       "SPI0_SS_T_0": { | ||||||
|  |         "direction": "O" | ||||||
|  |       }, | ||||||
|  |       "SPI0_SS_O_0": { | ||||||
|  |         "direction": "O" | ||||||
|  |       }, | ||||||
|  |       "SPI0_SS1_O_0": { | ||||||
|  |         "direction": "O" | ||||||
|  |       }, | ||||||
|  |       "SPI0_MOSI_O_0": { | ||||||
|  |         "direction": "O" | ||||||
|  |       }, | ||||||
|  |       "SPI0_MOSI_T_0": { | ||||||
|  |         "direction": "O" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "components": { |     "components": { | ||||||
|  | @ -1545,6 +1591,12 @@ | ||||||
|             ] |             ] | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  |       }, | ||||||
|  |       "xlconstant_0": { | ||||||
|  |         "vlnv": "xilinx.com:ip:xlconstant:1.1", | ||||||
|  |         "xci_name": "puzzlefw_xlconstant_0_0", | ||||||
|  |         "xci_path": "ip/puzzlefw_xlconstant_0_0/puzzlefw_xlconstant_0_0.xci", | ||||||
|  |         "inst_hier_path": "xlconstant_0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "interface_nets": { |     "interface_nets": { | ||||||
|  | @ -1572,26 +1624,20 @@ | ||||||
|           "processing_system7_0/FIXED_IO" |           "processing_system7_0/FIXED_IO" | ||||||
|         ] |         ] | ||||||
|       }, |       }, | ||||||
|       "processing_system7_0_M_AXI_GP0": { |  | ||||||
|         "interface_ports": [ |  | ||||||
|           "processing_system7_0/M_AXI_GP0", |  | ||||||
|           "axi_interconnect_0/S00_AXI" |  | ||||||
|         ] |  | ||||||
|       }, |  | ||||||
|       "axi_apb_bridge_0_APB_M": { |       "axi_apb_bridge_0_APB_M": { | ||||||
|         "interface_ports": [ |         "interface_ports": [ | ||||||
|           "APB_M_0", |           "APB_M_0", | ||||||
|           "axi_apb_bridge_0/APB_M" |           "axi_apb_bridge_0/APB_M" | ||||||
|         ] |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_M_AXI_GP0": { | ||||||
|  |         "interface_ports": [ | ||||||
|  |           "processing_system7_0/M_AXI_GP0", | ||||||
|  |           "axi_interconnect_0/S00_AXI" | ||||||
|  |         ] | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "nets": { |     "nets": { | ||||||
|       "processing_system7_0_FCLK_RESET0_N": { |  | ||||||
|         "ports": [ |  | ||||||
|           "processing_system7_0/FCLK_RESET0_N", |  | ||||||
|           "proc_sys_reset_0/ext_reset_in" |  | ||||||
|         ] |  | ||||||
|       }, |  | ||||||
|       "proc_sys_reset_0_peripheral_aresetn": { |       "proc_sys_reset_0_peripheral_aresetn": { | ||||||
|         "ports": [ |         "ports": [ | ||||||
|           "proc_sys_reset_0/peripheral_aresetn", |           "proc_sys_reset_0/peripheral_aresetn", | ||||||
|  | @ -1635,6 +1681,72 @@ | ||||||
|           "processing_system7_0/FCLK_CLK0", |           "processing_system7_0/FCLK_CLK0", | ||||||
|           "ps_fclk" |           "ps_fclk" | ||||||
|         ] |         ] | ||||||
|  |       }, | ||||||
|  |       "ext_reset_in_0_1": { | ||||||
|  |         "ports": [ | ||||||
|  |           "ext_reset_in_0", | ||||||
|  |           "proc_sys_reset_0/ext_reset_in" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "GPIO_I_0_1": { | ||||||
|  |         "ports": [ | ||||||
|  |           "GPIO_I_0", | ||||||
|  |           "processing_system7_0/GPIO_I" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_GPIO_O": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/GPIO_O", | ||||||
|  |           "GPIO_O_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_SCLK_O": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_SCLK_O", | ||||||
|  |           "SPI0_SCLK_O_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_SCLK_T": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_SCLK_T", | ||||||
|  |           "SPI0_SCLK_T_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_SS_T": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_SS_T", | ||||||
|  |           "SPI0_SS_T_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_SS_O": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_SS_O", | ||||||
|  |           "SPI0_SS_O_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_SS1_O": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_SS1_O", | ||||||
|  |           "SPI0_SS1_O_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_MOSI_O": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_MOSI_O", | ||||||
|  |           "SPI0_MOSI_O_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "processing_system7_0_SPI0_MOSI_T": { | ||||||
|  |         "ports": [ | ||||||
|  |           "processing_system7_0/SPI0_MOSI_T", | ||||||
|  |           "SPI0_MOSI_T_0" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "xlconstant_0_dout": { | ||||||
|  |         "ports": [ | ||||||
|  |           "xlconstant_0/dout", | ||||||
|  |           "processing_system7_0/SPI0_SS_I" | ||||||
|  |         ] | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "addressing": { |     "addressing": { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue