Перейти к содержанию
    

Передача клоков с входа на выход

Есть задача. Сделать так, чтобы блок выдавал на выход клоки, которые у него на входе только при определенных условиях. ЧТобы не выписывать всей задачи - вот конкретный модуль

 

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;

Результаты работы те самые, что я хотел получить

Untitled-1.jpg

 

НО при синтезе вылезает ошибка, что в микросхеме 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 раза медленнее

ds.jpg

 

Можно ли как это обойти это ограничение?

И еще - как тогда реализована память DDR, что в ней по обоим фронтам идет работа?

Изменено пользователем Muscat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть задача. Сделать так, чтобы блок выдавал на выход клоки, которые у него на входе только при определенных условиях. ЧТобы не выписывать всей задачи - вот конкретный модуль

 

...

 

На выходе соответственно получаем клоки в 2 раза медленнее

Можно ли как это обойти это ограничение?

И еще - как тогда реализована память DDR, что в ней по обоим фронтам идет работа?

на счет, что после триггера получаем частоту в 2 раза меньше - это свойство триггера.

Если нужен клок то нужно использовать Digital Clock Manager или PLL или тригер но подавать на него частоту в 2 раза выше.

На счет DDR делается описание для частоты в 2 раза выше - соответственно получаем что цифровая логика работает на каждом фронте и срезе необходимой частоты, которая 2 раза ниже

 

PS первое описание - не правильное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем триггер? Объедините по И такты и разрешение, и всех делов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Muscat:

То, что Вы хотите сделать - плохой метод.

 

1) Какая ПЛИС? (Не увидел вначале)

2) Зачем Вам это нужно (учебная задача в ВУЗе/реальная на работе)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во-первых, например, у 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С актелем дел не имел, но если там есть поддержка ддр выходов (типа 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)

);

 

Должно быть получше, чем клок гейтовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть задача. Сделать так, чтобы блок выдавал на выход клоки, которые у него на входе только при определенных условиях.

Мультиплексируйте Clock на выход при помощи сигнала, протактированного отрицательным фронтом того же Clock-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мультиплексируйте Clock на выход при помощи сигнала, протактированного отрицательным фронтом того же Clock-а.

глитчей не оберется

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли как это обойти это ограничение?

И еще - как тогда реализована память DDR, что в ней по обоим фронтам идет работа?

если вам нужно 100% ое соответствие между enable и выходным клоком, то самое красивое решение DDR output и использовать сигнал сброса этих триггеров. Если ваша печенька поддерживает DDR значит такие IO элементы быть должны. Если допускается небольшая задержка (пара тактов входного клока) между enable и выходным клоком, то можно сделать безглитчевый выключатель/включатель %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

глитчей не оберется

Не будет никаких глитчей. Вы похоже не допоняли. Впрочем решение из разряда "a last resort". Но удвоенной частоты у автора видимо нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Но удвоенной частоты у автора видимо нет.

по пововоду удвоенной частоты, правильно я это изначально предложил - и не было б никаких проблем... :)

PLL в ПЛИС должна быть (а значит сделать удвоенную частоту не проблема) если там хотят делать какой-то обмен по DDR или котроллер DDR памяти

По поводу передачи клока наружу лучше использовать DCM (Digital Clock Manager) или PLL и "глобальный" пин ПЛИС(пин такого же типа через который в ПЛИС поступает глобальная тактовая частота - например у Xilinx есть пины типа GCLK - думаю у Actel тоже подобное есть). Это на мой взгляд будет самое правильное решение. Конечно можно обойтись и без этого, если не нужно устранение расфазировки синхронизирующих импульсов. Тогда можно обойтись обычным тригером или какой-то комбинационной схемой(что есть самое плохое решением - на мой взляд) - и еще это решение мой взгляд применимо для небольших частот (до 1 МГц и еденицы МГц)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У автора темы на картинке частота 10 MHz. То, что предлагает Джеймс, будет работать элементарно. Также, как и то, что говорил я (имея в виду примерно то же).

Автора уже и след простыл... ой, извините, вижу, читает...

А ему, может, снаружи ПЛИС важны срезы тактовой частоты, а не фронты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я немного понял из того, что мне тут говорят, завтра попробую разобраться

 

Задача учебно-производственная, скажем так. Назначение - тактирование памяти.

 

Пока наиболее понятным представляется решение логического умножения входного сигнала на некую переменную и передача на выход. Вопрос - а как это сделать? Функция умножения ведь не определена для сигналов?

Просто конструкция вида out<=CLK*enable не заработает же?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока наиболее понятным представляется решение логического умножения входного сигнала на некую переменную и передача на выход. Вопрос - а как это сделать? Функция умножения ведь не определена для сигналов?

Просто конструкция вида out<=CLK*enable не заработает же?

Не в обиду, но, если Вы задаете такие вопросы, то Вам стоит разобраться с базовыми вещами.

 

 

P.S. И, пока Вы еще в самом начале обучения, переходите лучше на Verilog.  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я это и сам прекрасно понимаю. Вопрос лишь в том, где читать.

Прочитал "Проектирование систем на микросхемах с программируемой структурой"

Прочитал "VHDL Tutorial Peter J. Ashenden"

Пролистал еще много других.

Что дальше читать? Большинство из них опять же посвящены основан все тех же языков и мало что о реализациях. Попутно еще разбираю разные примеры из сети. Вот попытался тут спросить как мне решить свою проблему, узнал много новых слов.

 

А чем лучше учить Verilog? И да, нас немного человек в отделе, но кто есть - пишут на VHDL. Хотя мне, как имевшему опыт писания на С++,этот язык совсем не нравится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...