APT451 0 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; Вопросов нет! Сччччас проверю! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Задача очень похожа, только пока не получается :unsure: Надо написать счетчик, который бы загрузил значение по сигналу LOAD, досчитал по CLK до 0 и далее не считал до прихода нового LOAD. Может поможете (новичек)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Может поможете (новичек)? для начала ваш выложите ваш вариант :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 19 января, 2010 Опубликовано 19 января, 2010 (изменено) · Жалоба для начала ваш выложите ваш вариант :) Да все уже закоментарил, что-то вроде: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity CONTROL is port (LOAD :in std_logic; clk :in std_logic ); end CONTROL; architecture struct of CONTROL is signal count_a, count_b : std_logic_vector(3 downto 0) := (others => '0'); signal reset_a: std_logic; COUNTER: process (LOAD,clk,reset_a) begin if (reset_a = '1') then count_a <= "0000"; elsif (LOAD = '1') then count_a <= "0100"; elsif rising_edge(clk) then count_a <= count_a - 1; end if; end process COUNTER; COUNTER2: process (LOAD,clk) begin if (LOAD = '1') then count_b <= "0100"; elsif rising_edge(clk) then count_b <= count_b - 1; end if; end process COUNTER2; reset_a <= '1' when (count_b = "0000") else '0'; end struct; Изменено 19 января, 2010 пользователем NOVY Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Надо написать счетчик, который бы загрузил значение по сигналу LOAD, досчитал по CLK до 0 и далее не считал до прихода нового LOAD. как ваша задача согласуется с тем кодом который вы привели ? COUNTER: process (LOAD,clk,reset_a) begin .... end process COUNTER; COUNTER2: process (LOAD,clk) begin ... end process COUNTER2; И как я понимаю результаты работы вашего модуля вас не интересуют ? entity CONTROL is port (LOAD :in std_logic; clk :in std_logic ); end CONTROL; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Разверну ка я тему к началу. Проблема в исходном коде заключена в одной строчке - выделена жирным и красным Всем добрый! Балуюсь (т.е. изучаю) 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. Что за ерунда? Вроде использую. Ну и конечно не работает. а всего-то надо было сказать а что присваивать сигналу stop когда count /= cfg т.е. stop <= '1' when (count = cfg) else '0'; У Вас получилось, что stop всегда = '1'. Значит, count <= "0000" всегда. Значит, как говорится, "кузнец не нужен" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 20 января, 2010 Опубликовано 20 января, 2010 · Жалоба Разверну ка я тему к началу. Проблема в исходном коде заключена в одной строчке - выделена жирным и красным а всего-то надо было сказать а что присваивать сигналу stop когда count /= cfg т.е. stop <= '1' when (count = cfg) else '0'; У Вас получилось, что stop всегда = '1'. Значит, count <= "0000" всегда. Значит, как говорится, "кузнец не нужен" :) И правда! Написал : library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity CONTROL is port (TEST :out std_logic; stop_out :out std_logic; LOAD :in std_logic; clk :in std_logic; ); end CONTROL; architecture struct of CONTROL is signal count,cfg: std_logic_vector(3 downto 0) := (others => '0'); signal stop: std_logic; begin cfg <= "0111" when (LOAD = '1') else "0000"; stop <= '1' when (count = cfg) else '0'; COUNTER: process (clk,stop) begin if (stop = '1') then count <= "0000"; elsif (rising_edge(clk)) then count <= count + 1; end if; end process; TEST <= '1' when ((count >= "0001") and (count <= "0110")) else '0'; stop_out <= stop; end struct; И вижу: сигнал TEST имеет правильную длительность, т.е 5 тактов clk в '1' после сигнала LOAD, далее в '0' до прихода следующего LOAD а вот stop_out - 14 тактов clk в '0' после сигнала LOAD. Почему не 7??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 20 января, 2010 Опубликовано 20 января, 2010 · Жалоба Все-таки , похоже 15, то бишь досчитал до конца....... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
voloda 0 24 января, 2010 Опубликовано 24 января, 2010 · Жалоба Всю тему с самого начала не читал(много). Может быть поможет вот это (копирайт - не мое): entity counter is generic (width : integer ); port (data : in std_logic_vector (width-1 downto 0); load, en, clk, rst : in std_logic; q :out std_logic_vector (width-1 downto 0)); end counter; architecture behave of counter is signal count : std_logic_vector (width-1 downto 0); begin process(clk, rst) begin if rst = '1' then count <= (others => '0'); elsif (clk'event and clk = '1') then if load = '1' then count <= data; elsif en = '1' then count <= count + 1; end if; end if; end process; q <= count; end behave; если нужен счет до конкретного числа - то вот его модификация: entity counter is generic (width : integer ; K: integer); port (data : in std_logic_vector (width-1 downto 0); load, en, clk, rst : in std_logic; q :out std_logic_vector (width-1 downto 0)); end counter; architecture behave of counter is signal count : std_logic_vector (width-1 downto 0); begin process(clk, rst) begin if rst = '1' then count <= (others => '0'); elsif (clk'event and clk = '1') then if load = '1' then count <= data; elsif (en = '1' and conv_integer(unsigned(count))<K-1) then count <= count + 1; elsif (en = '1' and conv_integer(unsigned(count))=K-1) then count <= (others => '0'); end if; end if; end process; q <= count; end behave; если нужно остановиться, досчитав до К-1, удаляем в примере такие строчики elsif (en = '1' and conv_integer(unsigned(count))=K-1) then count <= (others => '0'); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 26 января, 2010 Опубликовано 26 января, 2010 (изменено) · Жалоба Всю тему с самого начала не читал(много). Может быть поможет вот это (копирайт - не мое): если нужен счет до конкретного числа - то вот его модификация: если нужно остановиться, досчитав до К-1, удаляем в примере такие строчики Все получилось! Всем спасибо за подсказки! КОД: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity CONTROL is port (TEST :out std_logic; LOAD :in std_logic; clk :in std_logic; ); end CONTROL; architecture struct of CONTROL is signal count,cfg: std_logic_vector(3 downto 0) := "1111"; signal stop: std_logic; begin cfg <= "0111"; process(clk,load,stop) begin if load = '1' then count <= cfg; elsif (clk'event and clk = '1') then count <= count - 1; if stop = '1' then count <= (others => '0'); end if; end if; end process; stop <= '1' when (count = "0000") else '0'; TEST <= '0' when ((count >= "0001") and (count <= "0110")) else '1'; end struct; получил сигнал TEST длительностью 6 тактов в нуле. Изменено 26 января, 2010 пользователем NOVY Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 25 мая, 2010 Опубликовано 25 мая, 2010 · Жалоба Всм добрый день! Хотел бы узнать,возможно ли написать счетчик на VHDL , с переменным шагом счета? Можно ,конечно, залепить кучу счетчиков с разным шагом, а затем их подключать (CASE). А попроще? VARIABLE ? .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 25 мая, 2010 Опубликовано 25 мая, 2010 · Жалоба Всм добрый день! Хотел бы узнать,возможно ли написать счетчик на VHDL , с переменным шагом счета? Можно ,конечно, залепить кучу счетчиков с разным шагом, а затем их подключать (CASE). А попроще? VARIABLE ? .... А попроще использовать не счетчик, а аккумулятор и прибавлять (вычитать) к предудущему значению не 1, а требуемый шаг Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NOVY 0 25 мая, 2010 Опубликовано 25 мая, 2010 · Жалоба А попроще использовать не счетчик, а аккумулятор и прибавлять (вычитать) к предудущему значению не 1, а требуемый шаг Да, интересная мысль! Хотя пока еще пережевываю , написался уже сегодня - в своих же мозгах запутался ... Кое чего дописать еще надобно ... Да и конец рабочего дня скоро .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 25 мая, 2010 Опубликовано 25 мая, 2010 (изменено) · Жалоба 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; Это (выделено) обязательно? Синтезатор не разберется? Изменено 25 мая, 2010 пользователем x736C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 26 мая, 2010 Опубликовано 26 мая, 2010 · Жалоба Это (выделено) обязательно? Не обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться