masverter 0 17 мая Опубликовано 17 мая · Жалоба Доброго времени суток! Есть ПЛИС, которая программирует другие ПЛИС (режим - Slave SelectMap16). Количество программируемых ПЛИС - 4. Шина данных общая, линия CCLK у каждой ПЛИС своя. Я реализовал способ "Non-Continuous SelectMAP Data Loading with Controlled CCLK". Работает, но хотелось бы частоту поднять. Подскажите, пожалуйста, как описать временные соотношения между CCLK и D. Какой тактовый сигнал выбрать? Смущают нюансы: * должны выполняться соотношения между CCLK1 и D, CCLK2 и D, CCLK3 и D, CCLK4 и D; * CCLK1 и т.д. - выход триггера, подключенный к выходному порту. Может быть пример подходящий найдется? Spoiler main_process : process(clk) begin if rising_edge(clk) then if (state = st_select_operation) and (fifo_valid = '1') then if fifo_dout_addr = SELECT_DEVICE_ADDRESS then dev_number <= fifo_dout_data(1 downto 0); state <= st_select_operation; elsif fifo_dout_addr = PROGRAM_ADDRESS then program_b (to_integer(unsigned(dev_number))) <= fifo_dout_data(0); csi_b (to_integer(unsigned(dev_number))) <= fifo_dout_data(1); rdwr_b <= fifo_dout_data(2); state <= st_select_operation; elsif fifo_dout_addr = CONFIG_DATA_ADDRESS then do <= fifo_dout_data(15 downto 0); cclk(to_integer(unsigned(dev_number))) <= '0'; second_word <= fifo_dout_data(31 downto 16); state <= st_load_first_word_cclk1; end if; elsif state = st_load_first_word_cclk1 then cclk(to_integer(unsigned(dev_number))) <= '1'; state <= st_load_second_word_cclk0; elsif state = st_load_second_word_cclk0 then do <= second_word; cclk(to_integer(unsigned(dev_number))) <= '0'; state <= st_load_second_word_cclk1; elsif state = st_load_second_word_cclk1 then cclk(to_integer(unsigned(dev_number))) <= '1'; state <= st_select_operation; end if; end if; end process main_process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavlovconst 5 17 мая Опубликовано 17 мая · Жалоба Используйте клок, которым защелкиваете триггеры CCLK* и D*. Пусть вас не смущает, что CCLK* - это тактовый сигнал для приемной стороны. Для прошивающей ПЛИС - это сигнал данных. Относительно клока определите set_output_delay для всех сигналов CCLK* и D*. Вот подсказка https://www.xilinx.com/video/hardware/setting-output-delay.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masverter 0 20 мая Опубликовано 20 мая · Жалоба On 5/17/2024 at 2:59 PM, pavlovconst said: Используйте клок, которым защелкиваете триггеры CCLK* и D*. Пусть вас не смущает, что CCLK* - это тактовый сигнал для приемной стороны. Для прошивающей ПЛИС - это сигнал данных. Относительно клока определите set_output_delay для всех сигналов CCLK* и D*. Вот подсказка https://www.xilinx.com/video/hardware/setting-output-delay.html Сделал так: set output_ports {fpga_a[*] fpga_d[*] fpga*_cclk} set_output_delay -clock clk_p -2.5 [get_ports $output_ports] set_property IOB TRUE [get_ports $output_ports] Правильно сделал? 2.5 - число, при котором слак меньше всего получается. Это для clk_p (клок, которым защелкиваются триггеры CCLK* и D*) 230 МГц. Кажется, не сойдутся тайминги, и требования избыточные. CCLK 115 МГц в данном случае будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться