UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
Explorer
Explorer
1,897 Views
Registered: ‎09-13-2011

FFT v8.0 Dynamic Reconfiguration of NFFT

I'm trying to use the XFFT core v8.0 with dynamic reconfiguration of the NFFT. From a CPU I get a config bit that should set the input sample size of the FFT to either 1024 or 2048. When this bit changes value I send a new configuration to the XFFT core changing the NFFT field. The core is generated with a maximum size of 2048 samples.

I also send a new configuration right after reset.

 

Results are from simulation only. Target is a Spartan 6 LX25. I'm using Isim from ISE 14.4.

 

Problem: The XFFT core seems to ignore a second configuration giving either a missing tlast error or simply ignores tlast and keeps expecting more data. The first configuration takes place after a reset. The second configuration takes place on CPU register write.

 

This is the code for dynamic reconfig:

 

    config_data <= CONFIG_1024 when fft_config_i = '1' else CONFIG_2048;

    config_proc : process(gclk, greset)
    begin
        if greset = '1' then
            config_val      <= '0';
            config_do       <= '0';
            config_last     <= '0';
            config_wait     <= (others => '0');
        elsif rising_edge(gclk) then
            config_val      <= '0';
            config_last     <= fft_config_i;
            if config_do = '1' and config_rdy = '1' and running = '0' then
                inc(config_wait);
                if config_wait = all_ones(config_wait'range) then
                    config_wait <= (others => '1');
                    config_val <= '1';
                end if;
                if config_val = '1' and config_rdy = '1' then
                    config_val      <= '0';
                    config_do       <= '0';
                end if;
            end if;
            if config_last /= fft_config_i or greset_n = '0' then
                config_do <= '1';
                config_wait <= (others => '0');
            end if;
        end if;
    end process;

 

fft_config_i is the CPU register output (stable for a long time). greset_n is the XFFT core reset signal (also reset on aborts). Constants are defined as:

 

    constant SCALING_SCHEME     : std_logic_vector(21 downto 0) := "01" & "01" & "01" & "01" & "01" & "01" &
                                                                    "01" & "01" & "01" & "01" & "10";
   
    constant CONFIG_1024        : std_logic_vector(31 downto 0) := '0' & SCALING_SCHEME & '0' & "000" & "01010";
    constant CONFIG_2048        : std_logic_vector(31 downto 0) := '0' & SCALING_SCHEME & '0' & "000" & "01011";

 

If I remove the greset_n condition from above code so I only have one configuration before first FFT calculation everything works, I will try and see if I can do a workaround setting the configuration only just before the actual FFT calculation. It just gives me worries that I cannot be sure what configuration the core is working with when there is no way to get that information from the core.

 

0 Kudos