vorrom 0 10 сентября Опубликовано 10 сентября · Жалоба Добрый вечер. Собираю проект на GW2AR-18. Проект занимает около 40 % ресурса по лутам. Один UART, двухклоковое fifo, просто fifo, ШИМы, парсер команд с UART. Таблицы в Ромах и два канала АЦП SPI. Клок проекта 125МГц. Вот вижу, что иногда, крайне редко, дизайн собирается с вымолненными констрейнтами, но в основном нет. Причем разбежка по ошибке частоты от 10 до 25 МГц. Кручу все, что можно в настройках сборки. Не помогает. Может кто знает, как с этим бороться ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 28 10 сентября Опубликовано 10 сентября · Жалоба 57 minutes ago, vorrom said: Может кто знает, как с этим бороться ? Регистры ставить на выходе модулей. И PnR_mode=2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 11 сентября Опубликовано 11 сентября · Жалоба Спасибо, помогло. Регистры это правильный путь, но не единственный. А вот pnr помог соаершенно точно Возникла еше проблема с памятью при синтезе. Описал обычно на vhdl как массив типа std_logic_vector. В процессе под клоком условие записи и безусловное под клоком чтение. Xilinx эту же конструкцию синтезирует и все работает, а вот gowin фиг вам. Причем интересная штука - если не делать запись, то работает как пзу с изначально заданными данными правильно, но следует только сделать в память запись - на выходе вне зависимости от адреса нули мертво стоят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 28 11 сентября Опубликовано 11 сентября · Жалоба 6 hours ago, vorrom said: В процессе под клоком условие записи и безусловное под клоком чтение. Шины адреса для чтения и записи разные? reg signed [17:0] DATA [0:127]/* synthesis syn_ramstyle = "no_rw_check,block_ram" */; поиграйтесь с галкой no_rw_check в настройках проекта. 6 hours ago, vorrom said: Регистры это правильный путь, но не единственный. Прикол в том, что Gowin похоже оптимизирует по модулям. И просто регистры между модулями - хуже, чем регистры в конце модуля (или в начале). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 12 сентября Опубликовано 12 сентября · Жалоба Память описана так: LIBRARY IEEE; LIBRARY WORK; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_unsigned.ALL; use ieee.numeric_std.all; USE work.ALL; ENTITY ROM_TIMP_BLOCK IS PORT ( CLK : IN STD_LOGIC; RST : IN STD_LOGIC; ------------------------------------------------------- ROM_WR : IN STD_LOGIC; ROM_WR_DATA : IN STD_LOGIC_VECTOR(11 DOWNTO 0); ------------------------------------------------------- ROM_RD_ADDR : IN STD_LOGIC_VECTOR(11 DOWNTO 0); ROM_RD_DATA : OUT STD_LOGIC_VECTOR(11 DOWNTO 0) ); END ROM_TIMP_BLOCK; ARCHITECTURE ROM_TIMP_BLOCK_ARCH OF ROM_TIMP_BLOCK IS type ram_type is array (4095 downto 0) of std_logic_vector(11 downto 0); -- synthesis syn_ramstyle = "no_rw_check,block_ram" --; signal RAM : ram_type := ( X"000", X"000", ..... X"190", X"190", X"190" ); SIGNAL ROM_RD_DATA_INT : STD_LOGIC_VECTOR(11 DOWNTO 0);-- := (OTHERS => '0'); SIGNAL ROM_ADDR_INT : STD_LOGIC_VECTOR(11 DOWNTO 0) := (OTHERS => '0'); SIGNAL ROM_RD_DATA_INT_FF : STD_LOGIC_VECTOR(11 DOWNTO 0) := (OTHERS => '0'); BEGIN ROM_RD_DATA <= ROM_RD_DATA_INT_FF; ROM_WR_PROCESS:PROCESS(CLK) BEGIN IF CLK = '1' AND CLK'EVENT THEN IF ROM_WR = '1' THEN ------------------------------------------------------- IF ROM_ADDR_INT = X"FFF" THEN ROM_ADDR_INT <= (OTHERS => '0'); ELSE ROM_ADDR_INT <= ROM_ADDR_INT + 1; END IF; ------------------------------------------------------- RAM(to_integer(unsigned(ROM_ADDR_INT))) <= ROM_WR_DATA; ------------------------------------------------------- END IF; END IF; END PROCESS ROM_WR_PROCESS; ROM_RD_DATA_INT <= RAM(to_integer(unsigned(ROM_RD_ADDR))); ROM_RD_PROCESS:PROCESS(CLK) BEGIN IF CLK = '1' AND CLK'EVENT THEN ROM_RD_DATA_INT_FF <= ROM_RD_DATA_INT; END IF; END PROCESS ROM_RD_PROCESS; Добавление этой строки -- synthesis syn_ramstyle = "no_rw_check,block_ram" -- не помогло А вот если снять галочку Ram R/W Check в опциях синтеза - все работает как задумано. Что эта галочка означает ? Большое вам спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 12 сентября Опубликовано 12 сентября · Жалоба В 12.09.2024 в 09:09, vorrom сказал: Что эта галочка означает ? Цитата из Gowin Software User Guide SUG100-4.1.1E, 08/09/2024: Цитата Ram R/W Check: If there is a read or write conflict in RAM, check this option and bypass logic will be inserted around RAM to prevent simulation mismatches. If this option is disabled, bypass logic will not be generated, unchecked by default. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 12 сентября Опубликовано 12 сентября · Жалоба А что физически означает из написанного в мануале ? Какую логику они формируют ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 12 сентября Опубликовано 12 сентября · Жалоба Еще есть вопрос, как моделировать на Aldec gowin ip ядра и библиотечные примитивы ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 45 12 сентября Опубликовано 12 сентября · Жалоба В 12.09.2024 в 11:29, vorrom сказал: Еще есть вопрос, как моделировать на Aldec gowin ip ядра и библиотечные примитивы ? Надо исходники симуляционных библиотек Gowin скомпилироовать под Aldec (что у Вас там - ActiveHDL или Riviera). Ищите их в папке ..\Ide\simlib Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 12 сентября Опубликовано 12 сентября · Жалоба У меня Aldec 9.1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 12 сентября Опубликовано 12 сентября · Жалоба 5 hours ago, vorrom said: Добавление этой строки -- synthesis syn_ramstyle = "no_rw_check,block_ram" -- Так пишут в Верилоге. В VHDL должно быть через attribute. Смотрите в мануале не синтезатор. И вставляйте код через специальный блок, для этого предназначенный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 28 12 сентября Опубликовано 12 сентября · Жалоба 55 minutes ago, andrew_b said: Так пишут в Верилоге. В VHDL должно быть через attribute. Смотрите в мануале не синтезатор. На самом деле автору нужно было отключить no_rw_check, что он и сделал в среде разработки. Поэтому биться над добавлением этой строки именно в таком виде - не стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 12 сентября Опубликовано 12 сентября · Жалоба Внесу ложку дегтя. Похоже, что и с галочкой в настройках синтеза не помогает. При переразводке опять сломалось. Видимо, придется ставить компонент памяти и делать на нем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 28 12 сентября Опубликовано 12 сентября · Жалоба 5 hours ago, vorrom said: Похоже, что и с галочкой в настройках синтеза не помогает. Значит проект криво написан. 5 hours ago, vorrom said: Видимо, придется ставить компонент памяти и делать на нем. На текущий момент компоненты памяти и умножители от GoWin не дают никакого преимущества по скорости относительно описания на верилоге. работоспособность в ПЛИС полностью совпадает с моделированием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vorrom 0 13 сентября Опубликовано 13 сентября · Жалоба 9 hours ago, _4afc_ said: Значит проект криво написан. На текущий момент компоненты памяти и умножители от GoWin не дают никакого преимущества по скорости относительно описания на верилоге. работоспособность в ПЛИС полностью совпадает с моделированием. Проет написан правильно, Xilinx все правильно разводит. Как описана память я здесь изложил. Проблема только в этом модуле памяти. Описание на компонентах не даст возможности погулять софту в интерпретации как отсинтезировать этот блок памяти, на мой взгляд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться