margosh 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба Всем добрый день! :) Подскажите плиз, какими способами можно решить проблему. Написала на VHDL собственный компонент Авалон слейв, в который встроила мегафункцию FIFO; некоторые сигналы FIFO типа wrreq выствляю внутрипрограммно, наружу их не вывожу. При симуляции выяснилось, что мегафункция работает неадекватно по той причине, что Квартус все эти внутренние сигналы выкинул. Пыталась найти какие-нить настройки, чтобы сохранить данные сигналы, но пока безуспешно. Выводить их наружу и подвешивать в воздухе пока не хочется, может кто знает, есть ли способ сохранить внутренние сигналы иначе или выборочно настроить оптимизацию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба Если он сигналы выкинул - значит, они не нужны :) То есть схема построена неправильно, и сигналы упростились. Читайте warnings синтеза - от того, что вы как-то заставите синтезатор сохранить эти сигналы схема работать правильно не начет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба 2 margosh - в верилоге - атрибут syn_keep, в VHDL тоже должен быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
margosh 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба DmitryR - В том то и дело - в варнингах этих сигналов нет... Пробовала создавать проект содержащий исключительно эту мегафункцию без моих сигналов, результат тот же - работает корректно только если ее сигналы указаны среди портов ввода-вывода. Kuzmi4 - Покопалась в книжке по VHDL, подобных атрибутов нет, но возможно задание сигнала в портах как тип буффер, который предусматривает использование в качестве операнда внутри архитектуры, сейчас буду проверять насколько адекватно все работает, если задать так. Кроме того обнаружила следующее: в данной мегафункции есть параметр add_ram_output_register, который оптимизирует скорость фифо. При значении этого параметра "OFF" счетчик слов фифо продолжает увеличиваться, в то время как запись закончилась, а считывание давно началось... Если же занчение этого параметра "ON" - все работает нормально(при условии что все сигналы вевыдены наружу) add_ram_output_register = "ON" add_ram_output_register = "OFF" Ребят, если есть догадки, почему так происходит, поделитесь пожалуста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба Покопалась в книжке по VHDL, подобных атрибутов нет :blink: СцылкО!!! Страница 20 The keep attribute is used for a wire or net node. For example: In Verilog: wire my_wire /* synthesis keep = 1 */: In VHDL: signal my_signal: bit; attribute syn_keep : boolean; attribute syn_keep of my_signal: signal is true; The preserve attribute is used for a register. For example: In Verilog: reg my_reg /* synthesis preserve = 1 */: In VHDL: signal my_reg: stdlogic; attribute preserve : boolean; attribute preserve of my_signal: signal is true; :laughing: Касательно варнингов - бывает полезно и Info читать - он там тоже много чего интересного пишет ;) Но почему то мне кажется что трабл у вас в HDL (квартус просто так ничего не выкидывает). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Egor_N 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба Всем добрый день! :) Подскажите плиз, какими способами можно решить проблему. Написала на VHDL собственный компонент Авалон слейв, в который встроила мегафункцию FIFO; некоторые сигналы FIFO типа wrreq выствляю внутрипрограммно, наружу их не вывожу. При симуляции выяснилось, что мегафункция работает неадекватно по той причине, что Квартус все эти внутренние сигналы выкинул. Пыталась найти какие-нить настройки, чтобы сохранить данные сигналы, но пока безуспешно. Выводить их наружу и подвешивать в воздухе пока не хочется, может кто знает, есть ли способ сохранить внутренние сигналы иначе или выборочно настроить оптимизацию? Попробуйте доступные варианты настроек в Assignment -> Settings -> Category: Fitter Setting -> Physical Syntesis Optimazations -> Physical Syntesis for Registers ... А вообще-то, если квартус что-то считает лишним, значит надо как-то по-другому переписывать код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 октября, 2009 Опубликовано 26 октября, 2009 · Жалоба Выложите репорт Квартуса, а еще лучше код проекта или хотя бы мегафункции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
margosh 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Kuzmi4, спасибо за ссылку, вообщето искала этот атрибут в книжке по VHDL, без Вас точно не нашла бы :laughing: Теперь касательно варнингов. Ребят, очень извиняюсь, проблема видимо действительно не в сигналах. Сбило с толку меня следующее: в варнингах полной компиляции и в инфо тоже никаких записей касательно неработающих у меня сигналов нет(хотя другого предостаточно и до временного анализа еще не добралась), warn.txt а в варнингах симуляции они есть: warn1.txt, потому я и решила, что квартус сигналы эти оптимизировал и мегафункция не работает :05: , а теперь создается ощущение, что внутренние счетчики слов мегафункции криво работают когда параметр add_ram_output_register отключен (диаграмма в предыдущем сообщении). Может кто-то знает, почему так? Разумеется не исключаю, что где-то сама накосячила, так как знакома с Квартусом недолго. Присоединяю код проекта library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; LIBRARY altera_mf; USE altera_mf.altera_mf_components.all; entity fifo_tr is port ( --inputs signal clk : in std_logic; signal clk_tr : in std_logic; signal address : in std_logic; signal chipselect : in std_logic; signal write_n,read_n : in std_logic; signal writedata : in std_logic_vector(8 downto 1); --outputs --signal tr_read : out std_logic_vector(7 downto 0); --data for transmiter signal ff_out: out std_logic_vector(7 downto 0); signal irq : out std_logic; signal readdata : out std_logic_vector(8 downto 1); -- buffer signal rdusedw_d : buffer std_logic_vector(11 downto 0); signal wrusedw_d : buffer std_logic_vector(11 downto 0) ); end fifo_tr; architecture cosmos of fifo_tr is signal data_d : std_logic_vector(7 downto 0); signal wrfull_d : std_logic; signal rdfull_d : std_logic; signal wrempty_d : std_logic; signal rdempty_d : std_logic; signal rdreq_d : std_logic; signal wrreq_d : std_logic; signal flag_rd_end : std_logic; signal schetchik : std_logic_vector(11 downto 0) := "000000000000"; signal schetchik_2 : std_logic_vector(11 downto 0) := "000000000000"; signal dlina_kadra : std_logic_vector(11 downto 0) := "000000000000"; signal stat_reg : std_logic_vector(7 downto 0); -- статусный регистр: (0:2)бит - поле дынных содержит режим, устанавливающий размер видеостроки(размер пакета) -- 3 - фифо пустой -- 4 - фифо полный -- 5 - ошибка: превышение заданных размеров контейнера -- 6 - контейнер заполнен -- 7 - контейнер отправлен component dcfifo generic ( add_ram_output_register : string := "OFF"; add_usedw_msb_bit : string := "OFF"; clocks_are_synchronized : string := "FALSE"; delay_rdusedw : natural := 1; delay_wrusedw : natural := 1; intended_device_family : string := "unused"; lpm_numwords : natural; lpm_showahead : string := "OFF"; lpm_width : natural; lpm_widthu : natural := 1; overflow_checking : string := "ON"; rdsync_delaypipe : natural := 3; underflow_checking : string := "ON"; use_eab : string := "ON"; write_aclr_synch : string := "ON"; wrsync_delaypipe : natural := 3; lpm_hint : string := "USE_EAB=ON"; lpm_type : string := "dcfifo" ); port( aclr : in std_logic := '0'; data : in std_logic_vector(lpm_width-1 downto 0); q : out std_logic_vector(lpm_width-1 downto 0); rdclk : in std_logic; rdempty : out std_logic; rdfull : out std_logic; rdreq : in std_logic; rdusedw : out std_logic_vector(lpm_widthu - 1 downto 0); wrclk : in std_logic; wrempty : out std_logic; wrfull : out std_logic; wrreq : in std_logic; wrusedw : out std_logic_vector(lpm_widthu - 1 downto 0) ); end component; begin ff_tr1: dcfifo generic map(lpm_numwords => 4096, lpm_showahead => "ON", add_ram_output_register => "ON", delay_rdusedw => 0, delay_wrusedw => 0, rdsync_delaypipe => 3, wrsync_delaypipe => 3, lpm_width => 8, lpm_widthu => 12) port map( aclr => open, data => data_d, q => ff_out, rdclk => clk_tr, rdempty => rdempty_d, rdfull => rdfull_d, rdreq => rdreq_d, rdusedw => rdusedw_d, wrclk => clk, wrempty => wrempty_d, wrfull => wrfull_d, wrreq => wrreq_d, wrusedw => wrusedw_d); -- процесс записи данных в фифо process(clk, chipselect, address, write_n) begin if clk = '1' and clk'event then if chipselect = '1' and write_n = '0' then if address = '0'then if (schetchik(11 downto 0) <= dlina_kadra(11 downto 0)) then data_d(7 downto 0) <= writedata(8 downto 1); -- запись данных wrreq_d <= '1'; schetchik <= schetchik + '1'; --aclr_d <= '1'; else --если количество байт превысило допустимые рзмеры кадра wrreq_d <= '0'; stat_reg(5) <= '1'; -- выставляем статус ошибка end if; elsif address = '1' then stat_reg(7 downto 0) <= writedata(8 downto 1); -- записываем в статусный регистр признак case writedata(3 downto 1) is when "001" => dlina_kadra(11 downto 0) <= "001100100000"; when "010" => dlina_kadra(11 downto 0) <= "010000000000"; when "011" => dlina_kadra(11 downto 0) <= "010000011010"; when "100" => dlina_kadra(11 downto 0) <= "010100000000"; when "101" => dlina_kadra(11 downto 0) <= "010101111000"; when "110" => dlina_kadra(11 downto 0) <= "011010010000"; when "111" => dlina_kadra(11 downto 0) <= "100000000000"; when others => dlina_kadra(11 downto 0) <= "000000001010"; end case; wrreq_d <= '0'; end if; elsif chipselect = '1' and read_n = '0' then if address = '0' then readdata(8 downto 1) <= data_d(7 downto 0); wrreq_d <= '0'; elsif address = '1' then readdata(8 downto 1) <= stat_reg(7 downto 0); wrreq_d <= '0'; end if; else wrreq_d <= '0'; end if; if chipselect = '0' and (schetchik(11 downto 0) <= dlina_kadra(11 downto 0)) and (schetchik(11 downto 0) > "000000000000") then stat_reg(6) <= '1'; --aclr_d <= '0'; elsif chipselect = '0'and (schetchik(11 downto 0) = "000000000000") then irq <= '1'; elsif chipselect = '1' then irq <= '0'; end if; if (flag_rd_end = '1') then schetchik(11 downto 0) <= "000000000000"; stat_reg(6) <= '0'; stat_reg(7) <= '1'; wrreq_d <= '0'; end if; stat_reg(3) <= rdempty_d; stat_reg(4) <= wrfull_d; end if; end process; process(clk_tr, chipselect, stat_reg) begin if clk_tr = '0' and clk_tr'event then if chipselect = '0' and stat_reg(6) = '1' then if (schetchik_2(11 downto 0) <= schetchik(11 downto 0)) then rdreq_d <= '1'; schetchik_2 <= schetchik_2 + '1'; flag_rd_end <= '0'; else flag_rd_end <= '1'; schetchik_2 <= "000000000000"; rdreq_d <= '0'; end if; else rdreq_d <= '0'; end if; end if; end process; end architecture cosmos; fifo.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Сдаётся мне что дело тут не в add_ram_output_register, да и если б внутренние счетчики слов мегафункции криво работают когда параметр add_ram_output_register отключен - обязательно на альтереб об этом написали, правда ?? Просмотрел одним глазом ваше творение - стало страшно :07: а словами можно описать что вы там хотели реализовать ? (квартуса под рукой счас нет, но мне почему то кажется что он там много чего интересного насинтезирует :laughing: , да и вопрос тут не в квартусе даже) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
margosh 0 27 октября, 2009 Опубликовано 27 октября, 2009 (изменено) · Жалоба Kuzmi4, что такого страшного Вы там усмотрели? :) Реализовать хотела следующее: авалон слейв FIFO c внутренним статусным регистром, в котором малдшие 3 бита содержат режим работы, соответствующий пакетам различной длины(предполагается, что данные биты статусного регистра выставляет ниосовская прошивка), остальные биты - статусные. При обращении по адресу 1 FIFO происходит считывание либо запись статусного регистра, при обращении по адресу 0 - запись данных. Выходные данные с фифо подаются на выходной пин ff_out (в последующем на вход передатчика). Изменено 27 октября, 2009 пользователем margosh Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба так тоже в своё время писал и мучали те же вопросы :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
margosh 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Вы какую-то конкретно ошибку нашли? Или просто коряво? Я пока учусь, мне любая информация на пользу - не томите ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Просто запутанно у вас как то всё описывается - видимо квартус и распутывает как может, если опишите словами что именно нужно может и помогём чем смогём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
margosh 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба Kuzmi4, ответила на Ваш вопрос в сообщении 10, нужно подробнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 октября, 2009 Опубликовано 27 октября, 2009 · Жалоба НУ пока есть время и "натхнення" :) - имеем :авалон слейв интерфейс, он содержит 2 адреса 0 - статус/контрол (статус с фифо лап? контрол что именно задаёт - длинну и всё?), адрес 1 - сосбно фифо. Пишем в фифо стандартными авалоновскими трансферами (бурстить будем/нет ?), по достижению нужного количества слов в фифо - что происходит ?(выдача автоматом всего содержимомого фифо через ff_out? стробы какие нибудь вообсче предусматриваются чтоб сообсчать кому нибудь с наружи что данные валидные?) . Вроде всё ?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться