APT451 0 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба Всем добрый! Балуюсь (т.е. изучаю) VHDL. Написал счетчик, который должен считать только до нужного значения = cfg_in. Хотел проверить, будет ли работать. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is port (tact_in :in std_logic; cfg_in :in std_logic_VECTOR (3 DOWNTO 0); cnt_out :out std_logic_vector(3 downto 0) ); end cnt; architecture Behavioral of cnt is signal stop: std_logic; signal count: std_logic_vector(3 downto 0); signal cfg: std_logic_vector(3 downto 0); begin cfg <= cfg_in; stop <= '1' when (count = cfg); COUNTER: process (tact_in,stop) begin if (stop = '1') then count <= "0000"; elsif (rising_edge(tact_in)) then count <= count + 1; end if; end process; cnt_out <= count; end Behavioral; Выдает: WARNING:Xst:647 - Input <tact_in> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved. WARNING:Xst:646 - Signal <cfg> is assigned but never used. This unconnected signal will be trimmed during the optimization process. Что за ерунда? Вроде использую. Ну и конечно не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aat_81 0 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is port (tact_in :in std_logic; cfg_in :in std_logic_vector (3 DOWNTO 0); cnt_out :out std_logic_vector(3 downto 0) ); end cnt; architecture Behavioral of cnt is signal count: std_logic_vector(3 downto 0) := (others => '0'); begin COUNTER: process (tact_in) begin if (tact_in'event and tact_in = 1) then if (count = cfg_in) then count <= "0000"; else count <= count + 1; end if; end if; end process COUNTER; cnt_out <= count; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
APT451 0 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is port (tact_in :in std_logic; cfg_in :in std_logic_vector (3 DOWNTO 0); cnt_out :out std_logic_vector(3 downto 0) ); end cnt; architecture Behavioral of cnt is signal count: std_logic_vector(3 downto 0) := (others => '0'); begin COUNTER: process (tact_in) begin if (tact_in'event and tact_in = 1) then if (count = cfg_in) then count <= "0000"; else count <= count + 1; end if; end if; end process COUNTER; cnt_out <= count; end Behavioral; Спасибо! Сейчас попробую! library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is port (tact_in :in std_logic; cfg_in :in std_logic_vector (3 DOWNTO 0); cnt_out :out std_logic_vector(3 downto 0) ); end cnt; architecture Behavioral of cnt is signal count: std_logic_vector(3 downto 0) := (others => '0'); begin COUNTER: process (tact_in) begin if (tact_in'event and tact_in = 1) then if (count = cfg_in) then count <= "0000"; else count <= count + 1; end if; end if; end process COUNTER; cnt_out <= count; end Behavioral; Выдал : ERROR:HDLParsers:808 - "C:/XILINX_PROJECTS/Par_counter/Par_counter/cnt.vhd" Line 40. = can not have such operands in this context. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aat_81 0 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба Ну так поправь строчку if (tact_in'event and tact_in = '1') then Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба ERROR:HDLParsers:808 - "C:/XILINX_PROJECTS/Par_counter/Par_counter/cnt.vhd" Line 40. = can not have such operands in this context. if (tact_in'event and tact_in = '1') then if (count = cfg_in-1) then А в вашем случае stop некорректно описали. (else '0') И все по фронту должно быть, иначе по пичкам в ноль уходить будет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
APT451 0 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба Ну так поправь строчку if (tact_in'event and tact_in = '1') then Виноват! Сразу и не заметил! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aat_81 0 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба if (count = cfg_in-1) then -1 ни к чему, если надо досчитать до заданного числа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 4 мая, 2009 Опубликовано 4 мая, 2009 · Жалоба -1 ни к чему, если надо досчитать до заданного числа обычно число - это количество отсчетов. Состояние 0 счетчика в вашем случае полноценное. А в неудачном примере у товарища - состояние, по которому счетчик в ноль уйдет - неполноценное (не говоря уже о корректности решения) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aat_81 0 5 мая, 2009 Опубликовано 5 мая, 2009 · Жалоба обычно число - это количество отсчетов. Состояние 0 счетчика в вашем случае полноценное. А в неудачном примере у товарища - состояние, по которому счетчик в ноль уйдет - неполноценное (не говоря уже о корректности решения) С точки зрения здравого смысла конечно вы правы, но что именно нужно нашему другу не видно из первоначального поста. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
APT451 0 5 мая, 2009 Опубликовано 5 мая, 2009 · Жалоба С точки зрения здравого смысла конечно вы правы, но что именно нужно нашему другу не видно из первоначального поста. :rolleyes: Да я хотел сформировать сигнал, по которому будет запускаться другой счетчик. Т.е. постоять сколько-то тактов первого счетчика, равных cfg_in и продвинуть следующий счетчик. Поэтому сформировал сигнал test : library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is port (tact_in :in std_logic; test :out std_logic; cfg_in :in std_logic_vector (3 DOWNTO 0); cnt_out :out std_logic_vector(3 downto 0) ); end cnt; architecture Behavioral of cnt is signal count: std_logic_vector(3 downto 0) := (others => '0'); begin COUNTER: process (tact_in) begin if (tact_in'event and tact_in = '1') then if (count = cfg_in) then count <= "0000"; else count <= count + 1; end if; end if; end process COUNTER; test <= '1' when(count = cfg_in) else '0'; cnt_out <= count; Правда вне процесса. Это корректно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 5 мая, 2009 Опубликовано 5 мая, 2009 · Жалоба Да я хотел сформировать сигнал, по которому будет запускаться другой счетчик. Т.е. постоять сколько-то тактов первого счетчика, равных cfg_in и продвинуть следующий счетчик. Поэтому сформировал сигнал test : Правда вне процесса. Это корректно? Если cfg_in - коэффициент пересчета 1 счетчика, по завершении счета которого считает 2 и приходит извне, для корректности не хватает регистра для фиксации cfg_in по завершении счета 1 счетчика. Можно обойтись без него, если 1 счетчик считает в минус, тогда грузить в него cfg_in по состоянию 0. по этому же состоянию разрешать счет 2 счетчика. Это более наглядно. И ресурсов меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
APT451 0 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба Если cfg_in - коэффициент пересчета 1 счетчика, по завершении счета которого считает 2 и приходит извне, для корректности не хватает регистра для фиксации cfg_in по завершении счета 1 счетчика. Можно обойтись без него, если 1 счетчик считает в минус, тогда грузить в него cfg_in по состоянию 0. по этому же состоянию разрешать счет 2 счетчика. Это более наглядно. И ресурсов меньше. В реальности cfg_in это регистр в который пишут извне. А зачем его фиксировать по завершении счета 1 счетчика? Согласен, что счетчик должен считать в минус, более понятно. А вот "по этому же состоянию разрешать счет 2 счетчика" не совсем понятно. Преполагал, что этот сигнал будет клоком для 2 счетчика а не разрешением счета. Извините, пишу на VHDL только пару месяцев, вникаю в тонкости :unsure: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба В реальности cfg_in это регистр в который пишут извне. А зачем его фиксировать по завершении счета 1 счетчика? Преполагал, что этот сигнал будет клоком для 2 счетчика а не разрешением счета. Вы же не знаете , когда пишут извне. Это наверно надо наложить на свою временную диаграмму. Пока не отработали значения, Вас не интересует, что и когда пишут извне в регистр. Разрешение счета, для работы обоих счетчиков от одной частоты. Одноклоковая синхронизация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
APT451 0 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба Вы же не знаете , когда пишут извне. Это наверно надо наложить на свою временную диаграмму. Пока не отработали значения, Вас не интересует, что и когда пишут извне в регистр. Разрешение счета, для работы обоих счетчиков от одной частоты. Одноклоковая синхронизация. Спасибо! Вы же не знаете , когда пишут извне. Это наверно надо наложить на свою временную диаграмму. Пока не отработали значения, Вас не интересует, что и когда пишут извне в регистр. Разрешение счета, для работы обоих счетчиков от одной частоты. Одноклоковая синхронизация. При записи в cfg_in предполагается сброс и начало работы по новому алгоритму, соответствующему новому значению cfg_in ( cfg_in гораздо больше по параметрам, нежели указано в моем коде). А насчет счетчика 2 поясню - 1 счетчик отсчитывает кол-во тактов, которые надо пропустить и затем продвинуть счетчик 2 . Поэтому сигнал test будет клоком для 2 счетчика. И еще интересно - как загрузить счетчик (считаем в минус) при состоянии "0000" if count ="0000" then load = '1'; if load = '1' hten count = cfg_in;? Несуразица какая-то! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба Несуразица какая-то! library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is port (tact_in :in std_logic; cfg_in :in std_logic_vector (3 DOWNTO 0); cnt_out :out std_logic_vector(3 downto 0) ); end cnt; architecture Behavioral of cnt is signal count_a, count_b : std_logic_vector(3 downto 0) := (others => '0'); begin COUNTER: process (tact_in) begin if (tact_in'event and tact_in = '1') then if (count_a = "0000") then count_a <= cfg_in; count_b <= count_b + 1; else count_a <= count_a - 1; count_b <= count_b; end if; end if; end process COUNTER; cnt_out <= count_b; end Behavioral; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться