Flip-fl0p 4 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба 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 и так полно всяких "фич", от которых проект может сломатья - то я не рискую так делать. Может и зря. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба а так не работает? set_property FILE_TYPE {VHDL 2008} [get_files src_work/*.vhd] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба Раз речь пошла про tcl может кто то подскажет как написать tcl скрипт для помещения сигналов (из vhdl, verilog, SV описаних модулей) на waveform в ISIM (vivado) - желательно по модульно сгрупировано - лучше как в проекте соблюдая вложеность модулей (идеальное решение) Врукопашную добавлять сигналы дестков модулей напряжно... PS поделитесь плиз... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба В 04.12.2023 в 11:39, jenya7 сказал: есть процесс в другом модуле а SPI_TX_DATA соединен с DATA_IN Наверно имеет смысл опереться на ram core. Например канал МКИО (32 слова х16р, 30 подадресов). Итого ram 1kx16. Создать spi протокол (инструкция, адрес, данные). И все склеится. Как то так. И не важно сколько веревок. spi_flash_emu.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 декабря, 2023 Опубликовано 10 декабря, 2023 (изменено) · Жалоба 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; и теперь работает нормально. Изменено 10 декабря, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 10 декабря, 2023 Опубликовано 10 декабря, 2023 · Жалоба 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 я боюсь новый проект тоже может заглючить, когда вам потребуется внести еще какие-то изменения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться