Flip-fl0p 4 December 8, 2023 Posted December 8, 2023 · Report post 37 минут назад, Maverick_ сказал: Vivado: Set VHDL-2019 or VHDL-2008 for all .vhd files To tell Xilinx Vivado to compile a VHDL file using the newer VHDL-2019 or VHDL-2008 revisions in the GUI, you can go to Project Manager->Sources->Compile Order, right-click the .vhd file, and select Source File Properties. Then, you can click the Type property and change the VHDL revision using the dialog box. You have to right-click every single file to make the change. But you can easily change the VHDL revision of every single file in your project to 2019 by entering this command in the Vivado GUI’s Tcl Console: set_property FILE_TYPE {VHDL 2019} [get_files *.vhd] Or set all .vhd files to 2008 with this Tcl command: set_property FILE_TYPE {VHDL 2008} [get_files *.vhd] Знаю про этот костыль. Однако есть нюанс. Он ищет все файлы .vhd В том числе и сгенерированные автоматом. Я не моду дать гарантии, что данная команда не сломает что-либо в авто-генерированном мусоре. А учитывая, что в Vivado и так полно всяких "фич", от которых проект может сломатья - то я не рискую так делать. Может и зря. Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 December 8, 2023 Posted December 8, 2023 · Report post а так не работает? set_property FILE_TYPE {VHDL 2008} [get_files src_work/*.vhd] Quote Share this post Link to post Share on other sites More sharing options...
Maverick_ 17 December 8, 2023 Posted December 8, 2023 · Report post Раз речь пошла про tcl может кто то подскажет как написать tcl скрипт для помещения сигналов (из vhdl, verilog, SV описаних модулей) на waveform в ISIM (vivado) - желательно по модульно сгрупировано - лучше как в проекте соблюдая вложеность модулей (идеальное решение) Врукопашную добавлять сигналы дестков модулей напряжно... PS поделитесь плиз... Quote Share this post Link to post Share on other sites More sharing options...
sazh 11 December 8, 2023 Posted December 8, 2023 · Report post В 04.12.2023 в 11:39, jenya7 сказал: есть процесс в другом модуле а SPI_TX_DATA соединен с DATA_IN Наверно имеет смысл опереться на ram core. Например канал МКИО (32 слова х16р, 30 подадресов). Итого ram 1kx16. Создать spi протокол (инструкция, адрес, данные). И все склеится. Как то так. И не важно сколько веревок. spi_flash_emu.zip Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 December 10, 2023 Posted December 10, 2023 (edited) · Report post On 12/7/2023 at 11:47 PM, Джеймс said: @jenya7 3) Вообще пока не используйте больше одной частоты в проекте. CLK и всё! Попробуйте обходиться одной частотой. И всегда проверяйте, что она трассируется на глобальной цепи. Те случаи у вас, когда "то работает, то не работает" (тема "Не всегда срабатывает условие") - это вообще похоже на не-глобальный Clock. Таких штук вообще быть не должно: if (clk3 = '1') then Удачи! (хотя и не уверен, что примите советы) интересно а как без if (clk3 = '1') then? не работать по фронту? а как тогда? после многих экспериментов непосредственно прием-передачу я разбил на два процесса. Spoiler entity QUADSPI is port ( CLK : in std_logic; RST : in std_logic := '0'; SPI_CS : in std_logic; SPI_CLK : in std_logic; SPI_DATA : inout std_logic_vector(3 downto 0); INSTR : out std_logic_vector(7 downto 0); ADDR : out std_logic_vector(15 downto 0); DATA_OUT : out std_logic_vector(7 downto 0); DATA_IN : in std_logic_vector(7 downto 0) ); end QUADSPI; SPI_DATA <= buf_in when s_rd_nwr = '1' else "ZZZZ"; buf_out <= SPI_DATA when s_rd_nwr = '0' else "0000"; process(CLK) variable clk_count : integer range 0 to 2 := 0; begin if (SPI_CS = '0') then if (s_ready_read = '1') then if (rising_edge(SPI_CLK)) then case clk_count is when 0 => buf_in <= DATA_IN(7 downto 4); clk_count := 1; when 1 => buf_in <= DATA_IN(3 downto 0); clk_count := 0; when others => end case; end if; end if; else buf_in <= DATA_IN(7 downto 4); clk_count := 0; end if; end process; process(SPI_CLK) variable clk_count : integer range 0 to 2 := 0; begin if (SPI_CS = '0') then if (s_ready_write = '1') then if (rising_edge(SPI_CLK)) then case clk_count is when 0 => DATA_OUT(7 downto 4) <= buf_out; clk_count := 1; when 1 => DATA_OUT(3 downto 0) <= buf_out; clk_count := 0; when others => end case; end if; end if; else clk_count := 0; end if; end process; работает чётко, без проблем. проблема возникала в синхронизации - DATA_OUT. мой изначальный вопрос - когда DATA_IN = 0x34 - buf_in = 0x1 0x4 - а должно быть 0x3 0x4 - это было именно из рассинхрона между модулями. почему то это оказалось непростой задачей несмотря на то что модуль передающий DATA_OUT сидит на тех же SPI_CS и SPI_CLK. процесс передающий DATA_OUT был записан так if (clk3 = '1') then clk2_count := clk2_count + 1; end if; case clk2_count is when 0 => data_1553_out <= DOUT(7 downto 0); when 1 => data_1553_out <= DOUT(7 downto 0); when 2 => data_1553_out <= DOUT(7 downto 0); when 3 => data_1553_out <= DOUT(15 downto 8); when 4 => data_1553_out <= DOUT(15 downto 8); State <= ST_READ_3; when others => end case; переписал так if (clk3 = '1') then clk2_count := clk2_count + 1; end if; if (clk2_count = 4) then State <= ST_READ_3; else if (clk2_count < 2) then data_1553_out <= DOUT(7 downto 0); else data_1553_out <= DOUT(15 downto 8); end if; и теперь работает нормально. Edited December 10, 2023 by jenya7 Quote Share this post Link to post Share on other sites More sharing options...
Джеймс 5 December 10, 2023 Posted December 10, 2023 · Report post 15 hours ago, jenya7 said: Reveal hidden contents entity QUADSPI is port ( CLK : in std_logic; RST : in std_logic := '0'; SPI_CS : in std_logic; SPI_CLK : in std_logic; SPI_DATA : inout std_logic_vector(3 downto 0); INSTR : out std_logic_vector(7 downto 0); ADDR : out std_logic_vector(15 downto 0); DATA_OUT : out std_logic_vector(7 downto 0); DATA_IN : in std_logic_vector(7 downto 0) ); end QUADSPI; SPI_DATA <= buf_in when s_rd_nwr = '1' else "ZZZZ"; buf_out <= SPI_DATA when s_rd_nwr = '0' else "0000"; process(CLK) variable clk_count : integer range 0 to 2 := 0; begin if (SPI_CS = '0') then if (s_ready_read = '1') then if (rising_edge(SPI_CLK)) then case clk_count is when 0 => buf_in <= DATA_IN(7 downto 4); clk_count := 1; when 1 => buf_in <= DATA_IN(3 downto 0); clk_count := 0; when others => end case; end if; end if; else buf_in <= DATA_IN(7 downto 4); clk_count := 0; end if; end process; process(SPI_CLK) variable clk_count : integer range 0 to 2 := 0; begin if (SPI_CS = '0') then if (s_ready_write = '1') then if (rising_edge(SPI_CLK)) then case clk_count is when 0 => DATA_OUT(7 downto 4) <= buf_out; clk_count := 1; when 1 => DATA_OUT(3 downto 0) <= buf_out; clk_count := 0; when others => end case; end if; end if; else clk_count := 0; end if; end process; мой изначальный вопрос - когда DATA_IN = 0x34 - buf_in = 0x1 0x4 - а должно быть 0x3 0x4 - это было именно из рассинхрона между модулями. Ответить на ваш изначальный вопрос можно было бы, если знать дерево тактовых частот (см. один из первых вопросов ув. Zversky) и как оно было реально трассировано. А также вероятно, знать по каким путям попадают сигналы из "внешнего мира" в ПЛИС. Но для этого нужно смотреть на реальную трассировку. P.S я боюсь новый проект тоже может заглючить, когда вам потребуется внести еще какие-то изменения Quote Share this post Link to post Share on other sites More sharing options...