aBoomest 0 24 мая, 2012 Опубликовано 24 мая, 2012 · Жалоба Здравствуйте! Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/ entity div125 is Port ( CLK : in std_logic; Q : out std_logic); end div125; architecture Behavioral of div125 is signal st : std_logic_vector(6 downto 0); begin process(CLK) begin if CLK ‘event and CLK = '1' then if conv_integer(st) = 124 then st <= conv_std_logic_vector(0,7); else st <= st + 1; end if; end if; end process; Q <= ’1' when conv_integer(st) = 124 else ’0'; end Behavioral; Почему выходному сигналу Q значение присваивается вне процесса? И такая практика повсеместно, на сколько я понимаю. Кто может внятно объяснить почему этого лучше не делать в процессе? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
topor_topor 0 24 мая, 2012 Опубликовано 24 мая, 2012 · Жалоба Здравствуйте! Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/ entity div125 is Port ( CLK : in std_logic; Q : out std_logic); end div125; architecture Behavioral of div125 is signal st : std_logic_vector(6 downto 0); begin process(CLK) begin if CLK ‘event and CLK = '1' then if conv_integer(st) = 124 then st <= conv_std_logic_vector(0,7); else st <= st + 1; end if; end if; end process; Q <= ’1' when conv_integer(st) = 124 else ’0'; end Behavioral; Почему выходному сигналу Q значение присваивается вне процесса? И такая практика повсеместно, на сколько я понимаю. Кто может внятно объяснить почему этого лучше не делать в процессе? Спасибо. процесом описан счётчик, а выражение с Q описывает компаратор... это разные вещи.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 24 мая, 2012 Опубликовано 24 мая, 2012 · Жалоба Спасибо за ответ :) процесом описан счётчик, а выражение с Q описывает компаратор... это разные вещи.... Да, разные. Но почему не принято (или нельзя) писать строку Q <= ’1' when conv_integer(st) = 124 else ’0'; в области видимости процесса? Процесс выполняется каждый раз по изменению сигнала CLK. А когда выполняется строка компаратора? Чаще? И как будет работать программа, если строку компаратора поместить внутрь процесса? PS: прошу прощения я новичок в этом. Осваиваюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 24 мая, 2012 Опубликовано 24 мая, 2012 · Жалоба Да, разные. Но почему не принято (или нельзя) писать строку Q <= '1' when conv_integer(st) = 124 else '0'; в области видимости процесса? Что значит не принято или нельзя? Такой процесс порождает триггер. Если вам нужен триггер на выходе компаратора, делаете в процессе. Не нужен -- делаете вне процесса. Процесс выполняется каждый раз по изменению сигнала CLK. А когда выполняется строка компаратора?Очевидно, что асинхронная схема, которой является компаратор, срабатывает при любом изменении входных сигналов. И как будет работать программа, если строку компаратора поместить внутрь процесса?Программа работать не будет, потому что никакой прграммы нет. Это схема. VHDL -- не язык программирования, а язык описания цифровых схем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 24 мая, 2012 Опубликовано 24 мая, 2012 · Жалоба Тут вопрос не в том, что можно или нельзя. А вопрос стиля кодирования. Hdl, как впрочем и все остальные языки, имеет общепринятый (рекомендательный) стиль кодирования. Если все придерживаются общих принципов, то легче разобраться в чужом коде или работать совместно над одним проектом. А если каждый пишет как хочет, то это бардак будет. В энторнете полно док по данной тематике. В google вбейте hdl coding style. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 24 мая, 2012 Опубликовано 24 мая, 2012 · Жалоба Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/ Учиться надо по учебникам. Этот пример никуда не годиться. Начиная с функционала и кончая описанием. Выходной сигнал делителя всегда берется с тригерного выхода. Это у Вас старший разряд регистра, на котором счетчик базируется. Реализуйте проект и посмотрите, что в железе получается в RTL просмотрщике Вашего пакета. (регистр, сумматор, компаратор, мультиплексор) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 25 мая, 2012 Опубликовано 25 мая, 2012 (изменено) · Жалоба Этот пример никуда не годиться. А можете объяснить почему? Нашел документ производителя ПЛИС, посмотрел примеры реализации счетчиков. Вполне аналогично. Или я может ещё делитант и не улавливаю нюансов? Вот например счетчик с асинхронным сбросом. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity counters_1 is port(C, CLR : in std_logic; Q : out std_logic_vector(3 downto 0)); end counters_1; architecture archi of counters_1 is signal tmp: std_logic_vector(3 downto 0); begin process (C, CLR) begin if (CLR='1') then tmp <= "0000"; elsif (C'event and C='1') then tmp <= tmp + 1; end if; end process; Q <= tmp; end archi; Изменено 25 мая, 2012 пользователем aBoomest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 25 мая, 2012 Опубликовано 25 мая, 2012 · Жалоба нюансов? Со счетчиком все в порядке. Вы дали ссылку на железную структуру делителя. Я усомнился в правильности реализации. Вот и все. Вот мое видение: counter.v counter_tb.v Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
madgarry 0 25 мая, 2012 Опубликовано 25 мая, 2012 · Жалоба Здравствуйте! Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/ entity div125 is Port ( CLK : in std_logic; Q : out std_logic); end div125; architecture Behavioral of div125 is signal st : std_logic_vector(6 downto 0); begin process(CLK) begin if CLK ‘event and CLK = '1' then if conv_integer(st) = 124 then st <= conv_std_logic_vector(0,7); else st <= st + 1; end if; end if; end process; Q <= ’1' when conv_integer(st) = 124 else ’0'; end Behavioral; Почему выходному сигналу Q значение присваивается вне процесса? И такая практика повсеместно, на сколько я понимаю. Кто может внятно объяснить почему этого лучше не делать в процессе? Спасибо. Лучше делать в процессе. И в приведенном примере это было бы правильно. Выносить формирование сигнала Q вне процесса просто плохой стиль или неаккуратность разработчика. Если отойти от конкретно этого примера то я могу только предположить что сигнал Q формируется вне процесса в целях получить результат сравнения на такт раньше чем этот результат получился бы при формировании в процессе. Такой подход применяется в тех случаях когда значение счетчика используется для каких-либо целей -например для генерации адреса. А сигнал Q ,наример, маркирует что адрес 124 - последний адрес. При таком подходе и 124 и Q сформируются одновременно. Я и пишу по неаккуратность разработчика, потому что встречался с подобными кодами. В таких случаях логика была просто скопирована из существующего кода, в котором такая реализация оправдана, в новый entity без какой либо оптимизации и правки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 25 мая, 2012 Опубликовано 25 мая, 2012 · Жалоба Вот например счетчик с асинхронным сбросом. Потому что Q -- это выход, а читать значение порта типа out в VHDL разрешили не так давно. Поэтому и введён промежуточный сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться