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

Когда нет глобального СБРОСа

Всегда применял глобальный Сброс!

 

НО! Нарвался на оговорку заказчика, что нет в проекте внешнего сброса.

1.Необходимости в PLL у дизайна нет (чтобы взять для сброса сигнал LOCK в качестве недостающего Сброса).

Была оговорка, что для такого случая надо обязательно сделать дополнительную задержку от разрешения LOCK, чтобы была гарантия стабильной частоты от PLL.

2.Была тут информация, что можно в дизайне задавать нужное состояние триггеров простым присвоением при создании.

И сей факт считаю интересным для явного формирования сигнала Сброс. Смысл- прописать состояние одного триггера и если он действительно послушно задал свое состояние, как было в проекте,- то формирователь сброса должен сформировать на счетчке задержанный сигнал перебрасывания его состояние в обратное. Это и будет сигнал сброса.

 

Что народ еще применял для начальной установки? Спасибо!

 

Как вариант, работающий на симуляции. Можно и проще, но, то что озвучивалась выглядит. Надеюсь такое будет работать "на железе"

 

entity freset is
generic (TEMP_DELAY :integer);
    port (
        CLK_INP        : in STD_LOGIC;
        SENSOR_INP    : in STD_LOGIC;
        RESET_OUT    : out STD_LOGIC);
end freset;

architecture res_body of freset is
signal cnt_div_s: INTEGER range TEMP_DELAY-1 downto 0 := (TEMP_DELAY-1);-------  начальное состояние

begin
AVT_OUT_machine: process (CLK_INP)
begin
    if rising_edge(CLK_INP) then
        if cnt_div_s /= 0 and SENSOR_INP = '1' then
            cnt_div_s <= cnt_div_s-1;
            RESET_OUT <= '0';
        else
            RESET_OUT <= '1';
        end if;
    end if;
end process;
end res_body;
----------------------------------
    signal init_s : STD_LOGIC:='1';-------  начальное состояние
    signal tnit_s : STD_LOGIC:='0';
    signal RESET  : STD_LOGIC;
begin
nu: process (CLK)
begin
    if rising_edge(CLK) then
    tnit_s <= not RESET;
        if tnit_s ='1' and RESET ='1' then
            init_s <= '0';
        end if;
    end if;
end process nu;

    rest:    freset
generic map(100)
    port map (
        CLK_INP        =>  CLK,
        SENSOR_INP    =>  init_s,
                    
        RESET_OUT    =>  RESET
        );

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


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

xRST_MAIN : srlc32e 
port map (
    q => rst_main_inv, 
    a => "11111", 
    clk => clk, 
    d => '1', 
    ce => '1'
);

rst_main <= (not rst_main_inv);

 

У Xilinx можно как-то так обойтись. У Альтеры наверно тоже есть что-то подобное.

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


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

xRST_MAIN : srlc32e 
port map (
    q => rst_main_inv, 
    a => "11111", 
    clk => clk, 
    d => '1', 
    ce => '1'
);

rst_main <= (not rst_main_inv);

 

У Xilinx можно как-то так обойтись. У Альтеры наверно тоже есть что-то подобное.

 

Для ясности уместно раскрыть сам srlc32e. Идея та же...

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


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

При старте в любом случае регистры инициализируются нулями по умолчанию, так что всё нормально.

 

Кроме того, присвоение сигналам начальных значений уже давно синтезируемо, по крайней мере в XST.

 

Если перепиливать старый прожект (который требовал сброса) не хочется,

то нужно просто сделать этот сброс руками: завести счётчик, он проинициализируется 0 при старте,

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

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


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

Что народ еще применял для начальной установки? Спасибо!

Сделайте свой формирователь сброса.

К нему добавьте сигнал инверсный locked от pll.

И самое главное. Если к ПЛИС подключен микроконтроллер, сделайте регистр в котором можно управлять сбросом узлов схемы в исходное...

 

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


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

Приветствую!

 

Имитировать внешний reset используя сигнал clk и lock от PLL опасно.

Очень может быть что само PLL нужно ресетить чтобы корректно получить lock.

Поэтому счетчик/формирователь глобального ресета лучше питать клоком непосредственно от пина входной частоты.

 

Успехов! Rob.

 

 

 

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


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

Можно еще использовать внешнюю цепочку RC на пине и формирователь одиночного фронта для гашения дребезга. Но это, скорее для маленьких PLD, где счет триггеров на штуки.

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


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

Раньше ставили RC-цепочки, а сейчас ставят супервизоры питания со встроенным power-on-reset. Эти супервизоры сбрасывают всю систему на плате, которая может включать микропроцессоры, ПЛИС и т.д. Можно предусмотреть, чтобы супервизор не вырабатывал сброс раньше, чем загрузятся ПЛИС (использовать сигналы COFIG_DONE и подобные). В любом случае, на плате должен формироваться собственный сброс, даже если не предусмотрена внешняя кнопка. Из этого и следует исходить. Т.е. писать прошивку ПЛИС так, как будто на плате есть асинхронный сброс. Но лучше сначала поговорить с разработчиком платы: вдруг он ньюб, и не поставил супервизор. Тогда надо первым делом устроить ликбез разработчику платы.

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


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

Xilinx не рекомендует просто так использовать глобальный сброс при старте - это потребляет ценный глобальный ресурс разводки, а необходимости в таком сбросе нет, т.к. значения триггеров после загрузки вполне предсказуемы. Если значение по умолчанию (а это, как правило, ноль) не устраивает, то можно воспользоваться блоком initial (Verilog), который хотя и является по стандарту несинтезируемым, но у Xilinx и Altera работает (это, afair, документировано). Этот же приём закрывает проблему с симулятором, которому нужно знать начальные значения регистров.

 

Общая рекомендация такая: где не важно исходное значение, ничего не указывать, где важно, явно указать в initial блоке. А сброс использовать только для логики, которая в этом нуждается на рантайме.

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


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

Я ставлю счётчик необходимой разрядноси. Инвертированный старший разряд использую как Enable для этого счётчика и как ресет для своих схем.

С тем, чтобы начальное значение счётчика было нулём, проблем никогда не было.

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


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

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

 

С небольшой оговоркой, GSR - глобальный сброс в ПЛИС, который отпускается при старте микросхемы, сигнал асинхронный со всеми вытекающими. Поэтому приведу цитату из этой статьи http://www.eetimes.com/document.asp?doc_id=1278998

 

After using the GSR to set the initial state of the entire design, use explicit resets for logic elements, like state machines, that require a synchronous reset. Generate the synchronized version of the explicit reset using either a standard metastability resolution circuit or a reset bridge.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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