Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Когда нет глобального СБРОСа
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Мур
Всегда применял глобальный Сброс!

НО! Нарвался на оговорку заказчика, что нет в проекте внешнего сброса.
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
        );
dm.pogrebnoy
Код
xRST_MAIN : srlc32e
port map (
    q => rst_main_inv,
    a => "11111",
    clk => clk,
    d => '1',
    ce => '1'
);

rst_main <= (not rst_main_inv);


У Xilinx можно как-то так обойтись. У Альтеры наверно тоже есть что-то подобное.
Мур
Цитата(dm.pogrebnoy @ Mar 7 2017, 18:17) *
Код
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. Идея та же...
Dr.Alex
При старте в любом случае регистры инициализируются нулями по умолчанию, так что всё нормально.

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

Если перепиливать старый прожект (который требовал сброса) не хочется,
то нужно просто сделать этот сброс руками: завести счётчик, он проинициализируется 0 при старте,
далее вы его инкрементируете, и создаёте сброс, который держится пока счётчик меньше некоторого значения.
iosifk
Цитата(Мур @ Mar 7 2017, 16:57) *
Что народ еще применял для начальной установки? Спасибо!

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

Имитировать внешний reset используя сигнал clk и lock от PLL опасно.
Очень может быть что само PLL нужно ресетить чтобы корректно получить lock.
Поэтому счетчик/формирователь глобального ресета лучше питать клоком непосредственно от пина входной частоты.

Успехов! Rob.


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

Общая рекомендация такая: где не важно исходное значение, ничего не указывать, где важно, явно указать в initial блоке. А сброс использовать только для логики, которая в этом нуждается на рантайме.
DuHast
Я ставлю счётчик необходимой разрядноси. Инвертированный старший разряд использую как Enable для этого счётчика и как ресет для своих схем.
С тем, чтобы начальное значение счётчика было нулём, проблем никогда не было.
dm.pogrebnoy
Цитата(dxp @ Mar 8 2017, 09:37) *
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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.