реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Когда нет глобального СБРОСа, Перечислим варианты решения проблемы.
Мур
сообщение Mar 7 2017, 13:57
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 679
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



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

НО! Нарвался на оговорку заказчика, что нет в проекте внешнего сброса.
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
        );
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Mar 7 2017, 14:17
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 689
Регистрация: 11-04-07
Пользователь №: 26 933



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

rst_main <= (not rst_main_inv);


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


--------------------
Go to the top of the page
 
+Quote Post
Мур
сообщение Mar 7 2017, 14:34
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 679
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Цитата(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. Идея та же...
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Mar 7 2017, 14:42
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 251
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



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

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

Если перепиливать старый прожект (который требовал сброса) не хочется,
то нужно просто сделать этот сброс руками: завести счётчик, он проинициализируется 0 при старте,
далее вы его инкрементируете, и создаёте сброс, который держится пока счётчик меньше некоторого значения.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 7 2017, 15:30
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 3 504
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Мур @ Mar 7 2017, 16:57) *
Что народ еще применял для начальной установки? Спасибо!

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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 7 2017, 15:50
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 907
Регистрация: 23-12-04
Пользователь №: 1 643



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

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

Успехов! Rob.


Go to the top of the page
 
+Quote Post
Alex11
сообщение Mar 7 2017, 16:24
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 986
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Можно еще использовать внешнюю цепочку RC на пине и формирователь одиночного фронта для гашения дребезга. Но это, скорее для маленьких PLD, где счет триггеров на штуки.
Go to the top of the page
 
+Quote Post
Shivers
сообщение Mar 7 2017, 16:46
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Раньше ставили RC-цепочки, а сейчас ставят супервизоры питания со встроенным power-on-reset. Эти супервизоры сбрасывают всю систему на плате, которая может включать микропроцессоры, ПЛИС и т.д. Можно предусмотреть, чтобы супервизор не вырабатывал сброс раньше, чем загрузятся ПЛИС (использовать сигналы COFIG_DONE и подобные). В любом случае, на плате должен формироваться собственный сброс, даже если не предусмотрена внешняя кнопка. Из этого и следует исходить. Т.е. писать прошивку ПЛИС так, как будто на плате есть асинхронный сброс. Но лучше сначала поговорить с разработчиком платы: вдруг он ньюб, и не поставил супервизор. Тогда надо первым делом устроить ликбез разработчику платы.
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 8 2017, 06:37
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 345
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
DuHast
сообщение Mar 8 2017, 08:12
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797



Я ставлю счётчик необходимой разрядноси. Инвертированный старший разряд использую как Enable для этого счётчика и как ресет для своих схем.
С тем, чтобы начальное значение счётчика было нулём, проблем никогда не было.
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Mar 8 2017, 18:03
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 689
Регистрация: 11-04-07
Пользователь №: 26 933



Цитата(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.


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd May 2017 - 17:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016