Muscat 0 15 мая, 2010 Опубликовано 15 мая, 2010 (изменено) · Жалоба Есть задача. Сделать так, чтобы блок выдавал на выход клоки, которые у него на входе только при определенных условиях. ЧТобы не выписывать всей задачи - вот конкретный модуль library IEEE; use IEEE.std_logic_1164.all; entity Clocker is port ( CLK : in std_logic; ENABLE : in std_logic; OUT_CLOCK : out std_logic); end entity; architecture CLOCKER_Arch of Clocker is begin process(CLK) begin if (clk'event) then if (clk='1' and enable='1' ) then OUT_CLOCK<='1'; elsif (CLK='0') then OUT_CLOCK<='0'; end if; end if; end process; end architecture; Результаты работы те самые, что я хотел получить НО при синтезе вылезает ошибка, что в микросхеме Actel нет триггеров работающий по переднему и по заднему фронту, так что синтезировать не сможем. Поэтому приходится писать так, чтобы работа шла только по передним фронтам library IEEE; use IEEE.std_logic_1164.all; entity Clocker is port ( CLK : in std_logic; ENABLE : in std_logic; OUT_CLOCK : out std_logic); end entity; architecture CLOCKER_Arch of Clocker is Signal Curr:std_logic:='0'; begin process(CLK) begin if (clk'event and clk='1') then if (Curr='0') then OUT_CLOCK<='1'; curr<='1'; elsif (Curr='1') then OUT_CLOCK<='0'; curr<='0'; end if; end if; end process; end architecture; На выходе соответственно получаем клоки в 2 раза медленнее Можно ли как это обойти это ограничение? И еще - как тогда реализована память DDR, что в ней по обоим фронтам идет работа? Изменено 15 мая, 2010 пользователем Muscat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Есть задача. Сделать так, чтобы блок выдавал на выход клоки, которые у него на входе только при определенных условиях. ЧТобы не выписывать всей задачи - вот конкретный модуль ... На выходе соответственно получаем клоки в 2 раза медленнее Можно ли как это обойти это ограничение? И еще - как тогда реализована память DDR, что в ней по обоим фронтам идет работа? на счет, что после триггера получаем частоту в 2 раза меньше - это свойство триггера. Если нужен клок то нужно использовать Digital Clock Manager или PLL или тригер но подавать на него частоту в 2 раза выше. На счет DDR делается описание для частоты в 2 раза выше - соответственно получаем что цифровая логика работает на каждом фронте и срезе необходимой частоты, которая 2 раза ниже PS первое описание - не правильное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Зачем триггер? Объедините по И такты и разрешение, и всех делов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Muscat: То, что Вы хотите сделать - плохой метод. 1) Какая ПЛИС? (Не увидел вначале) 2) Зачем Вам это нужно (учебная задача в ВУЗе/реальная на работе)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба во-первых, например, у Xilinx есть clock mux с enable - это то, что нужно. во-вторых, получить сигнал, похожий на clock можно получить примерно таким образом: reg clk_sig_p, clk_sig_n; always @(posedge clk, negedge rstn) begin if(~rstn) clk_sig_p <= 1'b0; else clk_sig_p <= ~clk_sig_p; end always @(negedge clk, negedge rstn) begin if(~rstn) clk_sig_n <= 1'b0; else clk_sig_n <= clk_sig_p; end assign clock_signal = clk_sig_p ^ clk_sig_n; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба С актелем дел не имел, но если там есть поддержка ддр выходов (типа oddr у зайлинкса или не помню как у альтеры), то можно с его помощью: ODDR_inst : ODDR port map ( Q => Q, -- 1-bit DDR output C => C, -- 1-bit clock input - CE => CE, -- 1-bit clock enable input D1 => 0, -- 1-bit data input (positive edge) D2 => 1 -- 1-bit data input (negative edge) ); Должно быть получше, чем клок гейтовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Есть задача. Сделать так, чтобы блок выдавал на выход клоки, которые у него на входе только при определенных условиях. Мультиплексируйте Clock на выход при помощи сигнала, протактированного отрицательным фронтом того же Clock-а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба Мультиплексируйте Clock на выход при помощи сигнала, протактированного отрицательным фронтом того же Clock-а. глитчей не оберется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба Можно ли как это обойти это ограничение? И еще - как тогда реализована память DDR, что в ней по обоим фронтам идет работа? если вам нужно 100% ое соответствие между enable и выходным клоком, то самое красивое решение DDR output и использовать сигнал сброса этих триггеров. Если ваша печенька поддерживает DDR значит такие IO элементы быть должны. Если допускается небольшая задержка (пара тактов входного клока) между enable и выходным клоком, то можно сделать безглитчевый выключатель/включатель %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба глитчей не оберется Не будет никаких глитчей. Вы похоже не допоняли. Впрочем решение из разряда "a last resort". Но удвоенной частоты у автора видимо нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба ... Но удвоенной частоты у автора видимо нет. по пововоду удвоенной частоты, правильно я это изначально предложил - и не было б никаких проблем... :) PLL в ПЛИС должна быть (а значит сделать удвоенную частоту не проблема) если там хотят делать какой-то обмен по DDR или котроллер DDR памяти По поводу передачи клока наружу лучше использовать DCM (Digital Clock Manager) или PLL и "глобальный" пин ПЛИС(пин такого же типа через который в ПЛИС поступает глобальная тактовая частота - например у Xilinx есть пины типа GCLK - думаю у Actel тоже подобное есть). Это на мой взгляд будет самое правильное решение. Конечно можно обойтись и без этого, если не нужно устранение расфазировки синхронизирующих импульсов. Тогда можно обойтись обычным тригером или какой-то комбинационной схемой(что есть самое плохое решением - на мой взляд) - и еще это решение мой взгляд применимо для небольших частот (до 1 МГц и еденицы МГц) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба У автора темы на картинке частота 10 MHz. То, что предлагает Джеймс, будет работать элементарно. Также, как и то, что говорил я (имея в виду примерно то же). Автора уже и след простыл... ой, извините, вижу, читает... А ему, может, снаружи ПЛИС важны срезы тактовой частоты, а не фронты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба Я немного понял из того, что мне тут говорят, завтра попробую разобраться Задача учебно-производственная, скажем так. Назначение - тактирование памяти. Пока наиболее понятным представляется решение логического умножения входного сигнала на некую переменную и передача на выход. Вопрос - а как это сделать? Функция умножения ведь не определена для сигналов? Просто конструкция вида out<=CLK*enable не заработает же? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 16 мая, 2010 Опубликовано 16 мая, 2010 · Жалоба Пока наиболее понятным представляется решение логического умножения входного сигнала на некую переменную и передача на выход. Вопрос - а как это сделать? Функция умножения ведь не определена для сигналов? Просто конструкция вида out<=CLK*enable не заработает же? Не в обиду, но, если Вы задаете такие вопросы, то Вам стоит разобраться с базовыми вещами. P.S. И, пока Вы еще в самом начале обучения, переходите лучше на Verilog. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Muscat 0 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Я это и сам прекрасно понимаю. Вопрос лишь в том, где читать. Прочитал "Проектирование систем на микросхемах с программируемой структурой" Прочитал "VHDL Tutorial Peter J. Ashenden" Пролистал еще много других. Что дальше читать? Большинство из них опять же посвящены основан все тех же языков и мало что о реализациях. Попутно еще разбираю разные примеры из сети. Вот попытался тут спросить как мне решить свою проблему, узнал много новых слов. А чем лучше учить Verilog? И да, нас немного человек в отделе, но кто есть - пишут на VHDL. Хотя мне, как имевшему опыт писания на С++,этот язык совсем не нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться