Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятные глюки в проекте
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
seldim
Здравствуйте. Есть проект задачей которого является обработка набока кнопок (антидребезг 30 ms, проверка на залипание 5 сек), выдача данных (информация от обработчика кнопок) во внешний контроллер биполярного кода по паралельной шине, прием данных из этого контроллера и выдача их на светодиоды. ПЛИС циклон 4. Сброс организован внутри ПЛИС на счетчике. Внешний генератор 25 МГц. Для обработки кнопок был сделан делитель частоты до 610 Гц и 2 Гц (предварительно 25 МГц на PLL поделены до 62,5 КГц).
Проблема в следующем: проект заработал, но были неправильно выбраны значения счетчика для 5 сек проверки на залипание (признак залипания кнопки появлялся через 7 сек а не через 5). При смене значения счетчика при котором надо выставить признак залипания кнопки у меня ломалася не обработчик кнопок, а весь проект. Переставал обслуживаться контроллер биполярного кода, хотя его управление никаким образом не связано с обработчиком кнопок. Вторая проблема со схемой сброса. Сначала ее сделал от частоты генератора но значения счетчика на котором происходил сброс (65534) слишком большое и я решил попробовать перейти на частоту 62,5 КГц от PLL соответственно разрядность счетчика значительно уменьшилась, но возникла ситуация аналогичная предыдущей - ничего не работает! Сейчас оставил генератор сброса на частоте 25 МГц, а в обработчике кнопок залипание проверяю от частоты не 2 Гц а 610 Гц. Вроде заработало. В чем могла быть причина сбоя не понятно. Модель ничего не показывает. Инкрементная компиляция отключена. Проглядеть все цепочки сигнал тапом пока небыло возможности. Если у кого нибудь есть идеи по поводу причин данных сбоев пожалуйса напишите.
vadimp61
Цитата(seldim @ Sep 4 2012, 08:54) *
Здравствуйте. Есть проект задачей которого является обработка набока кнопок (антидребезг 30 ms, проверка на залипание 5 сек), выдача данных (информация от обработчика кнопок) во внешний контроллер биполярного кода по паралельной шине, прием данных из этого контроллера и выдача их на светодиоды. ПЛИС циклон 4. Сброс организован внутри ПЛИС на счетчике. Внешний генератор 25 МГц. Для обработки кнопок был сделан делитель частоты до 610 Гц и 2 Гц (предварительно 25 МГц на PLL поделены до 62,5 КГц).
Проблема в следующем: проект заработал, но были неправильно выбраны значения счетчика для 5 сек проверки на залипание (признак залипания кнопки появлялся через 7 сек а не через 5). При смене значения счетчика при котором надо выставить признак залипания кнопки у меня ломалася не обработчик кнопок, а весь проект. Переставал обслуживаться контроллер биполярного кода, хотя его управление никаким образом не связано с обработчиком кнопок. Вторая проблема со схемой сброса. Сначала ее сделал от частоты генератора но значения счетчика на котором происходил сброс (65534) слишком большое и я решил попробовать перейти на частоту 62,5 КГц от PLL соответственно разрядность счетчика значительно уменьшилась, но возникла ситуация аналогичная предыдущей - ничего не работает! Сейчас оставил генератор сброса на частоте 25 МГц, а в обработчике кнопок залипание проверяю от частоты не 2 Гц а 610 Гц. Вроде заработало. В чем могла быть причина сбоя не понятно. Модель ничего не показывает. Инкрементная компиляция отключена. Проглядеть все цепочки сигнал тапом пока небыло возможности. Если у кого нибудь есть идеи по поводу причин данных сбоев пожалуйса напишите.

А зачем PLL применяли, возможно на низких частотах оно глючит? Поделите 25Мгц по модулю 200 и потом Т триггером еще на 2 -получите меандр 62,5 Кгц.
seldim
PLL функция ведь от производителя и по моим понятиям должна работать во всем задаваемом диапазоне
troiden
Цитата(seldim @ Sep 4 2012, 09:51) *
PLL функция ведь от производителя и по моим понятиям должна работать во всем задаваемом диапазоне

По документации 62,5 кГц входит в диапазон работы PLL?
seldim
В мегафункции делитель 400 при входной частоте 25 МГц дают 62, 5 КГц. Если есть ограничения на PLL покажите ссылочку.
bogaev_roman
Вы все частоты правильно прописали в sdc и временные ошибки отсутствуют? Сами по себе частоты низкие, но описанная ситуация похожа на невыполнение временных соотношений. Со сбросом тоже вопрос - Вы его подаете как синхронный и он один для всех триггеров?
alexPec
Цитата(bogaev_roman @ Sep 4 2012, 15:43) *
Вы все частоты правильно прописали в sdc и временные ошибки отсутствуют? Сами по себе частоты низкие, но описанная ситуация похожа на невыполнение временных соотношений. Со сбросом тоже вопрос - Вы его подаете как синхронный и он один для всех триггеров?

Согласен, я бы еще отчет таймквеста на месте ТС посмотрел, какие клоки он увидел, совпадают ли они с действительностью и нет ли отрицательных слэков.
seldim
По времянке могут быть вопросы, но работа контроллера зависит только от сброса, после которого инициализируется контроллер. Если бы проблема была во времянках то переход от 16 разрядного счетчика на частоте 25 МГц на 8-и разрядный счетчик на 62,5 КГц ситуацию должен только значительно улучшить, а работа наоборот прекращалась. Вот это и ставит в тупик. Если брать задержку одного тригера 7 ns то на 8-и разрядах задержка 56 ns при длительности тактового импульса 16000 ns без ТС видно что здесь должно работать.
bogaev_roman
Цитата(seldim @ Sep 4 2012, 20:23) *
Если бы проблема была во времянках то переход от 16 разрядного счетчика на частоте 25 МГц на 8-и разрядный счетчик на 62,5 КГц ситуацию должен только значительно улучшить, а работа наоборот прекращалась. Вот это и ставит в тупик. Если брать задержку одного тригера 7 ns то на 8-и разрядах задержка 56 ns при длительности тактового импульса 16000 ns без ТС видно что здесь должно работать.

Я не видел времянки и результата TQ, не видел описания работы (может там куча словев логики). Не знаю, пустил ли вообще квартус частоту по линии частот. Не знаю - возможно получаемый сброс - синхронный, но никаках не описан как и частоты и триггеры падают в метастабильность, а счетчик по сбросу не в нуле, а в каком то другом состоянии.
seldim
То есть после загрузки плис при указании в квартусе начального значения счетчика := 0 возможно что счетчик окажется не в нулевом значении?
код сброса следующий:
Код
LIBRARY ieee;    
    use IEEE.Std_logic_1164.all;
    use IEEE.Std_logic_unsigned.all;
    use IEEE.std_logic_arith.all;
    use IEEE.numeric_std.all;
ENTITY Reset_gen IS        
    PORT
        (
            CLK_25_MHz        : IN    STD_LOGIC;
            Reset            : out    std_logic
        );
    END Reset_gen;

ARCHITECTURE arhitektura OF Reset_gen IS

signal CLK_25_MHz_count    : integer range 0 to 65535 := 0;
signal reset_int        : std_logic := '0';                                                                
    BEGIN
        PROCESS (CLK_25_MHz, CLK_25_MHz_count)
            BEGIN
                if CLK_25_MHz'EVENT and CLK_25_MHz = '1' and CLK_25_MHz_count < 65534  THEN
                    CLK_25_MHz_count <= CLK_25_MHz_count + 1;
                end if;
        END PROCESS;
    Reset <= '0'    when CLK_25_MHz_count < 65534 else '1';

    END arhitektura;
Alexey K
У вас сброс постоянно в лог 1 после отсчета счетчика(если это конечно не то что надо).
Ну и подключать одновременно numeric_std и std_logic_arith + std_logic_unsigned не стоит.
(проблемы с дополнительным кодом могут быть связаны с этим)
Или numeric_std или std_logic_arith + std_logic_unsigned.
Ну и в принципе шаблон счетчика с разрешением можно посмотреть в quartus.

seldim
Да так должно быть сброс генерится 1 раз по включению питания. На счет библиотек спасибо я их один раз подключил кокда начал изучать HDL так и таскаю. Разберусь оставлю нужные.
bogaev_roman
Цитата(seldim @ Sep 4 2012, 21:33) *
То есть после загрузки плис при указании в квартусе начального значения счетчика := 0 возможно что счетчик окажется не в нулевом значении?

Я не знаю, можно ли в vhdl указать начальное значение счетчику, в верилоге это initial - структура работает только для моделирования, синтезатором игнорируется, но для альтера по умолчанию все значения на регистрах - 0. Но вообще, при определенных условиях можно после сброса загнать регистр (ну или схемы хранения, счетчики, значения автоматов) в непредсказуемое состояние при заданном нулевом - в случае метастабильности.
Пример - 2 триггера, выход второго поступает на вход первого, сброс синхронный 1 такт и софтовый - т.е. перестало работать и требуется локальный сброс. Ограничений нет, получилось так, что изменение сброса почти совпадает с фронтом, но первый его "хватает" на первый такт (и при этом хватает выход второго триггера, который еще не обнулился и может быть любым), а второй на следующий. Результат - если на выходе второго случайно была 1, а первый требовалось по сбросу скинуть в 0, то ахтунг maniac.gif .
Судя по коду, у Вас сброс будет иметь длительность ~40нс * 65535, т.е. менее 4*10-(3)с. Если его подавать как синхронный на регистры с рабочей частотй 2Гц (она была упомянута), где гарантия, что он сработает?
Опять же, судя по коду (vhdl плохо знаю, тут могу ошибиться), сброс - комбинационный, т.е. не выход регистра? Если это так, то абсолютно точно будет гонка сигналов, т.е. сброс будет представлять из себя не единичный переход из 0 в 1, а несколько раз с непонятной длительностью и дальнейшее поведения всей схемы - непредсказуемо.
Если все ограничения грамотно описать в TQ, все данные ситуации будут им определены как ошибочные и все расписано подробным образом.
seldim
Да действительно он без регистра этоя обязательно исправлю. Спасибо за подсказку. Возмоно это и есть причина второго глюка. Остается вопрос с как исправление значения счетчика в обработчике кнопок, который является только источником данных портится управление контроллером. Может имеет смыст использовать инкрементную компиляцию?
bogaev_roman
Цитата(seldim @ Sep 7 2012, 07:01) *
Остается вопрос с как исправление значения счетчика в обработчике кнопок, который является только источником данных портится управление контроллером. Может имеет смыст использовать инкрементную компиляцию?

А чем инкрементальная компиляция поможет?
Приведите хотя бы на словах, что есть управление контроллером, каким образом сброс используется в контроллере, на какой частоте работает сам контроллер и его управление, есть ли пересинхронизация, если частоты разные, сброс синхронный/асинхронный. В каком месте конкретно сбоит если возможно определить. Экстрасенсов я думаю здесь нет biggrin.gif
seldim
Контроллер работает под управление хоста (в моем случае ПЛИС). Паралельная двунаправленная шина 16 разрядов, входные (для контроллера) сигналы записи и чтения их несколько. Сигнал записи в регист конфигурации контроллера, он в ПЛИС формируется после ресета и только 1 раз, сигнал записи первого слова, второго слова, и сигналы чтения тоже 2 + сигнал выбора приемного ФИФО. Сигналы записи и чтения формируются по прерываниям от контроллера:
Код
/*
Данный модуль обеспечивает формирование сигналов записи и чтения для контроллера HI-3584 при наличии
сигнала готовности, а также внутренных сигналов чтения с мньшей длительностью для достоверного чтения
данных из контроллера HI-3584. Также данный модуль осуществляет контроль исправности входных линий БК
по наличию прерываний от каждого приемника раз в 1 мс.
*/
LIBRARY ieee;    
    use IEEE.Std_logic_1164.all;
    use IEEE.Std_logic_unsigned.all;
    use IEEE.std_logic_arith.all;
    use IEEE.numeric_std.all;


ENTITY int_drv IS        
    
    PORT
        (
            holt_redy        : IN    STD_LOGIC;        -- Входной сигнал готовности HI-3584 к работе
            clk_5_MHz        : IN    STD_LOGIC;    -- Вход частоты 5 МГц            ----|______|------|______|-
            clk_5_MHz_mod    : IN    STD_LOGIC;        -- Вход измененной частоты 5 МГц        ------|___|---------|___|--
            clk_25_MHz        : IN    STD_LOGIC;    -- Вход частоты 25 МГц
            int_tx            : IN    STD_LOGIC;    -- Вход прерывания от передатчика БК
            int_pr1            : IN    STD_LOGIC;    -- Вход прерывания от приемника 1 БК
            int_pr2            : IN    STD_LOGIC;    -- Вход прерывания от приемника 2 БК
            clk_62_5_KHz    : IN    STD_LOGIC;        -- Вход частоты 62.5 КГц
            pl1                : out    std_logic;    -- Выход сигнала записи младшего слова в HI-3584
            pl2                : out    std_logic;    -- Выход сигнала записи старшего слова в HI-3584
            sel                : out    std_logic;    -- Выход сигнала выбора слов при чтении данных из HI-3584
            en1_holt            : out    std_logic;        -- Выход сигнала чтения первого приемника БК
            en2_holt            : out    std_logic;        -- Выход сигнала чтения второго приемника БК
            en1                : out    std_logic;    -- Выход сигнала чтения первого приемника БК (внутренний)
            en2                : out    std_logic;    -- Выход сигнала чтения второго приемника БК (внутренний)
            Line1_ispr        : out    std_logic;        -- Выход исправности первой линии БК
            Line2_ispr        : out    std_logic        -- Выход исправности второй линии БК
        );
    END int_drv;

ARCHITECTURE arhitektura OF int_drv IS

signal         Transmit                : std_logic := '0';    -- признак процеса обслуживания преравания от передатчика
signal         WR_RD_word_count                  : std_LOGIC := '0';    -- счетчик записей и чтений
signal         pl1_in                : std_logic := '1';    
signal         pl2_in                : std_logic := '1';
signal         pr1_read                : std_logic := '0';    -- признак процеса обслуживания преравания от приемника 1
signal         pr2_read                : std_logic := '0';    -- признак процеса обслуживания преравания от приемника 2
signal         int                : std_logic := '0';    -- признак наличия прерываний
signal         sel1                : std_logic := '0';
signal         sel2                : std_logic := '0';                                        
signal         en1_in                : std_logic := '1';
signal         en2_in                : std_logic := '1';
signal         en1_holt_in            : std_logic := '1';
signal         en2_holt_in            : std_logic := '1';
signal         count_pausa_line1    : integer range 0 to 63;
signal         count_pausa_line2    : integer range 0 to 63;

    BEGIN

pl1 <= pl1_in;
pl2 <= pl2_in;

sel <= sel1 or sel2;
en1_holt <= en1_holt_in;
en2_holt <= en2_holt_in;
en1 <= en1_in;
en2 <= en2_in;

-------------------------------------------------------------
-- Контроль исправности линии 1 БК
        PROCESS (clk_62_5_KHz, int_pr1, count_pausa_line1)
            BEGIN
                if int_pr1 = '0' then count_pausa_line1 <= 0;
                    elsif clk_62_5_KHz'EVENT and clk_62_5_KHz = '1' and count_pausa_line1 < 63 THEN
                    count_pausa_line1 <= count_pausa_line1 + 1;
                end if;
            END PROCESS;
Line1_ispr <= '0' when count_pausa_line1 = 63 else '1';

-- Контроль исправности линии 1 БК
        PROCESS (clk_62_5_KHz, int_pr2, count_pausa_line2)
            BEGIN
                if int_pr2 = '0' then count_pausa_line2 <= 0;
                    elsif clk_62_5_KHz'EVENT and clk_62_5_KHz = '1' and count_pausa_line2 < 63 THEN
                    count_pausa_line2 <= count_pausa_line2 + 1;
                end if;
            END PROCESS;
Line2_ispr <= '0' when count_pausa_line2 = 63 else '1';

-------------------------------- Обрабатываем прерывания от Хольта ------------------------------
int <= ( int_tx or not int_pr1 or not int_pr2) and holt_redy; --         

-- Последовательная обработка прерываний передатчик -> приемник 1 -> приемник 2 - > передатчик
        PROCESS (Int, int_tx, int_pr1, int_pr2, clk_5_MHz)
            BEGIN
                if int = '0' then Transmit <= '0'; pr1_read <= '0'; pr2_read <= '0';
                    elsif clk_5_MHz'EVENT and clk_5_MHz = '0' THEN
                        if int_tx = '1' and pr1_read = '0' and pr2_read = '0' then Transmit <= '1';
                                                                                     pr1_read <= '0';
                                                                                     pr2_read <= '0';
                            else if int_pr1 = '0' and pr2_read = '0' then pr1_read <= '1';
                                                                           Transmit <= '0';
                                                                           pr2_read <= '0';
                                else if int_pr2 = '0' then pr2_read <= '1';
                                                                pr1_read <= '0';
                                                                                                                                                Transmit <= '0';
                                                                                                                     else  pr1_read <= '0';
                                            pr2_read <= '0';
                                                                                                                            Тransmit <= '0';
                                end if;
                        end if;
                    end if;
                end if;
            END PROCESS;
-- счетчик записей и чтений        
        PROCESS (int, Transmit, pr1_read, pr2_read, clk_5_MHz)
            BEGIN
                if int = '0' then WR_RD_word_count <= '0';
                    elsif clk_5_MHz'EVENT and clk_5_MHz = '1' and (Transmit = '1' or pr1_read = '1' or pr2_read = '1') THEN
                    WR_RD_word_count <= not WR_RD_word_count;
                end if;
            END PROCESS;

------------------------------- Формируем сигналы записи слов в Хольт ----------------------------------
----- Формируем Pl1, Pl2 ---------------------------------------------------------------------------------
                
        pl1_in <= (WR_RD_word_count or clk_5_MHz or not Transmit or not holt_redy);
        pl2_in <= (not WR_RD_word_count or clk_5_MHz or not Transmit or not holt_redy);

------------------------------ Формируем сигналы чтения из Хольта------------------------------------

        en1_in <= (clk_5_MHz or not pr1_read or not holt_redy);
        en1_holt_in <= (clk_5_MHz_mod or not pr1_read or not holt_redy);
        
        en2_in <= (clk_5_MHz or not pr2_read or not holt_redy);
        en2_holt_in <= (clk_5_MHz_mod or not pr2_read or not holt_redy);
            
        PROCESS (int_pr1, en1_holt_in) -- Второе чтение должно сопровождаться высоким уровнем сигнала sel
            BEGIN
                if int_pr1 = '1' then sel1 <= '0';-- Использовать Int
                    elsif en1_holt_in'EVENT and en1_holt_in = '1' THEN
                    sel1 <= '1';
                end if;
            END PROCESS;

        PROCESS (int_pr2, en2_holt_in) -- Второе чтение должно сопровождаться высоким уровнем сигнала se2
            BEGIN
                if int_pr2 = '1' then sel2 <= '0'; -- Использовать Int
                    elsif en2_holt_in'EVENT and en2_holt_in = '1' THEN
                    sel2 <= '1';
                end if;
            END PROCESS;        
    END arhitektura;


Сброс на контроллер асинхронный. Заложеный в ПЛИС сброс больше требуемого. Дополнительной тактовой частоты на контроллере нет. Для работы используются только сигналы записи и чтения. В общем по прерыванию от передатчика контроллера производятся две записи. Данные это 8 разрядный адрес слова (адрес задан константами), данные с обработки кнопок. Тоесть меняя фильтры в обработчике кнопок могут максимум испортиться данные, а у меня перестает работать все. К сожалению пока не могу полазить сигнал тапом и локализовать место отказа. Собственно поэтому пока и приходится анализировать код.
Maverick
Цитата(seldim @ Sep 9 2012, 17:20) *
Контроллер работает под управление хоста (в моем случае ПЛИС). Паралельная двунаправленная шина 16 разрядов, входные (для контроллера) сигналы записи и чтения их несколько. Сигнал записи в регист конфигурации контроллера, он в ПЛИС формируется после ресета и только 1 раз, сигнал записи первого слова, второго слова, и сигналы чтения тоже 2 + сигнал выбора приемного ФИФО. Сигналы записи и чтения формируются по прерываниям от контроллера:
Код
/*
Данный модуль обеспечивает формирование сигналов записи и чтения для контроллера HI-3584 при наличии
сигнала готовности, а также внутренных сигналов чтения с мньшей длительностью для достоверного чтения
данных из контроллера HI-3584. Также данный модуль осуществляет контроль исправности входных линий БК
по наличию прерываний от каждого приемника раз в 1 мс.
*/
LIBRARY ieee;    
    use IEEE.Std_logic_1164.all;
    use IEEE.Std_logic_unsigned.all;
    use IEEE.std_logic_arith.all;
    use IEEE.numeric_std.all;


ENTITY int_drv IS        
    
    PORT
        (
            holt_redy        : IN    STD_LOGIC;        -- Входной сигнал готовности HI-3584 к работе
            clk_5_MHz        : IN    STD_LOGIC;    -- Вход частоты 5 МГц            ----|______|------|______|-
            clk_5_MHz_mod    : IN    STD_LOGIC;        -- Вход измененной частоты 5 МГц        ------|___|---------|___|--
            clk_25_MHz        : IN    STD_LOGIC;    -- Вход частоты 25 МГц
            int_tx            : IN    STD_LOGIC;    -- Вход прерывания от передатчика БК
            int_pr1            : IN    STD_LOGIC;    -- Вход прерывания от приемника 1 БК
            int_pr2            : IN    STD_LOGIC;    -- Вход прерывания от приемника 2 БК
            clk_62_5_KHz    : IN    STD_LOGIC;        -- Вход частоты 62.5 КГц
            pl1                : out    std_logic;    -- Выход сигнала записи младшего слова в HI-3584
            pl2                : out    std_logic;    -- Выход сигнала записи старшего слова в HI-3584
            sel                : out    std_logic;    -- Выход сигнала выбора слов при чтении данных из HI-3584
            en1_holt            : out    std_logic;        -- Выход сигнала чтения первого приемника БК
            en2_holt            : out    std_logic;        -- Выход сигнала чтения второго приемника БК
            en1                : out    std_logic;    -- Выход сигнала чтения первого приемника БК (внутренний)
            en2                : out    std_logic;    -- Выход сигнала чтения второго приемника БК (внутренний)
            Line1_ispr        : out    std_logic;        -- Выход исправности первой линии БК
            Line2_ispr        : out    std_logic        -- Выход исправности второй линии БК
        );
    END int_drv;

ARCHITECTURE arhitektura OF int_drv IS

signal         Transmit                : std_logic := '0';    -- признак процеса обслуживания преравания от передатчика
signal         WR_RD_word_count                  : std_LOGIC := '0';    -- счетчик записей и чтений
signal         pl1_in                : std_logic := '1';    
signal         pl2_in                : std_logic := '1';
signal         pr1_read                : std_logic := '0';    -- признак процеса обслуживания преравания от приемника 1
signal         pr2_read                : std_logic := '0';    -- признак процеса обслуживания преравания от приемника 2
signal         int                : std_logic := '0';    -- признак наличия прерываний
signal         sel1                : std_logic := '0';
signal         sel2                : std_logic := '0';                                        
signal         en1_in                : std_logic := '1';
signal         en2_in                : std_logic := '1';
signal         en1_holt_in            : std_logic := '1';
signal         en2_holt_in            : std_logic := '1';
signal         count_pausa_line1    : integer range 0 to 63;
signal         count_pausa_line2    : integer range 0 to 63;

    BEGIN

pl1 <= pl1_in;
pl2 <= pl2_in;

sel <= sel1 or sel2;
en1_holt <= en1_holt_in;
en2_holt <= en2_holt_in;
en1 <= en1_in;
en2 <= en2_in;

-------------------------------------------------------------
-- Контроль исправности линии 1 БК
        PROCESS (clk_62_5_KHz, int_pr1, count_pausa_line1)
            BEGIN
                if int_pr1 = '0' then count_pausa_line1 <= 0;
                    elsif clk_62_5_KHz'EVENT and clk_62_5_KHz = '1' and count_pausa_line1 < 63 THEN
                    count_pausa_line1 <= count_pausa_line1 + 1;
                end if;
            END PROCESS;
Line1_ispr <= '0' when count_pausa_line1 = 63 else '1';

-- Контроль исправности линии 1 БК
        PROCESS (clk_62_5_KHz, int_pr2, count_pausa_line2)
            BEGIN
                if int_pr2 = '0' then count_pausa_line2 <= 0;
                    elsif clk_62_5_KHz'EVENT and clk_62_5_KHz = '1' and count_pausa_line2 < 63 THEN
                    count_pausa_line2 <= count_pausa_line2 + 1;
                end if;
            END PROCESS;
Line2_ispr <= '0' when count_pausa_line2 = 63 else '1';

-------------------------------- Обрабатываем прерывания от Хольта ------------------------------
int <= ( int_tx or not int_pr1 or not int_pr2) and holt_redy; --         

-- Последовательная обработка прерываний передатчик -> приемник 1 -> приемник 2 - > передатчик
        PROCESS (Int, int_tx, int_pr1, int_pr2, clk_5_MHz)
            BEGIN
                if int = '0' then Transmit <= '0'; pr1_read <= '0'; pr2_read <= '0';
                    elsif clk_5_MHz'EVENT and clk_5_MHz = '0' THEN
                        if int_tx = '1' and pr1_read = '0' and pr2_read = '0' then Transmit <= '1';
                                                                                     pr1_read <= '0';
                                                                                     pr2_read <= '0';
                            else if int_pr1 = '0' and pr2_read = '0' then pr1_read <= '1';
                                                                           Transmit <= '0';
                                                                           pr2_read <= '0';
                                else if int_pr2 = '0' then pr2_read <= '1';
                                                                pr1_read <= '0';
                                                                                                                                                Transmit <= '0';
                                                                                                                     else  pr1_read <= '0';
                                            pr2_read <= '0';
                                                                                                                            Тransmit <= '0';
                                end if;
                        end if;
                    end if;
                end if;
            END PROCESS;
-- счетчик записей и чтений        
        PROCESS (int, Transmit, pr1_read, pr2_read, clk_5_MHz)
            BEGIN
                if int = '0' then WR_RD_word_count <= '0';
                    elsif clk_5_MHz'EVENT and clk_5_MHz = '1' and (Transmit = '1' or pr1_read = '1' or pr2_read = '1') THEN
                    WR_RD_word_count <= not WR_RD_word_count;
                end if;
            END PROCESS;

------------------------------- Формируем сигналы записи слов в Хольт ----------------------------------
----- Формируем Pl1, Pl2 ---------------------------------------------------------------------------------
                
        pl1_in <= (WR_RD_word_count or clk_5_MHz or not Transmit or not holt_redy);
        pl2_in <= (not WR_RD_word_count or clk_5_MHz or not Transmit or not holt_redy);

------------------------------ Формируем сигналы чтения из Хольта------------------------------------

        en1_in <= (clk_5_MHz or not pr1_read or not holt_redy);
        en1_holt_in <= (clk_5_MHz_mod or not pr1_read or not holt_redy);
        
        en2_in <= (clk_5_MHz or not pr2_read or not holt_redy);
        en2_holt_in <= (clk_5_MHz_mod or not pr2_read or not holt_redy);
            
        PROCESS (int_pr1, en1_holt_in) -- Второе чтение должно сопровождаться высоким уровнем сигнала sel
            BEGIN
                if int_pr1 = '1' then sel1 <= '0';-- Использовать Int
                    elsif en1_holt_in'EVENT and en1_holt_in = '1' THEN
                    sel1 <= '1';
                end if;
            END PROCESS;

        PROCESS (int_pr2, en2_holt_in) -- Второе чтение должно сопровождаться высоким уровнем сигнала se2
            BEGIN
                if int_pr2 = '1' then sel2 <= '0'; -- Использовать Int
                    elsif en2_holt_in'EVENT and en2_holt_in = '1' THEN
                    sel2 <= '1';
                end if;
            END PROCESS;        
    END arhitektura;


Сброс на контроллер асинхронный. Заложеный в ПЛИС сброс больше требуемого. Дополнительной тактовой частоты на контроллере нет. Для работы используются только сигналы записи и чтения. В общем по прерыванию от передатчика контроллера производятся две записи. Данные это 8 разрядный адрес слова (адрес задан константами), данные с обработки кнопок. Тоесть меняя фильтры в обработчике кнопок могут максимум испортиться данные, а у меня перестает работать все. К сожалению пока не могу полазить сигнал тапом и локализовать место отказа. Собственно поэтому пока и приходится анализировать код.

на какой частоте работает ПЛИС и контроллер HI-3584? Где данные частоты в процессах? Вы асинхронную логику пытаетесь описать? Если да то плохая идея....
Какие сигналы приходят в ПЛИС?
seldim
Вроде уже писал. Запись данных в контроллер синхронизируется сигналами записи, Чтение синхронизируется сигналами чтения. Дополнительных частот синхронизации у контроллера не предусмотренно. Временные характеристики сигналов чтения и записи, которые формируются в ПЛИС соответствуют требованиям на контроллер. Сигналы записив контроллер : PL1 - для младших 16 бит, Pl2- для старших 16 бит. Сигналы чтения : En1 - сигнал чтения первого буфера, En2 - сигнал чтения второго буфера (вроде в коде все они описаны). Сигналы должны идти низким уровнем. Данные получаю так :
Код
/*
Данный модуль обеспечивает управление шиной данных между контроллером HI-3584 и ПЛИС
*/
LIBRARY ieee;    
    use IEEE.Std_logic_1164.all;
    use IEEE.Std_logic_unsigned.all;
    use IEEE.std_logic_arith.all;
    use IEEE.numeric_std.all;


ENTITY bus_drv IS        
    
    PORT    
        (
            clk_25_MHz        : in    std_logic;        -- входная частота 25 МГц
            cwstr                : in    std_logic;        -- сигнал записи в конфигурационный регистр HI-3584
            pl1                : in    std_logic;        -- сигнал записи младшего слова в HI-3584
            pl2                : in    std_logic;        -- сигнал записи старшего слова в HI-3584
            en1                : in    std_logic;        -- сигнал чтения слова из первого приемника БК HI-3584
            en2                : in    std_logic;        -- сигнал чтения слова из второго приемника БК HI-3584
            sel                : in    std_logic;        -- сигнал выбора старшего / младшего слова при чтении из приемников
            word1                : in    std_logic_vector (31 downto 0);    -- первое слово для передатчика
            word2                : in    std_logic_vector (31 downto 0);    -- второе слово для передатчика
            word3                : in    std_logic_vector (31 downto 0);    -- третье слово для передатчика
            word4                : in    std_logic_vector (31 downto 0);    -- четвертое слово для передатчика
            Data_in_out        : inout    std_logic_vector (15 downto 0);     -- шина данных
            Data_pr1            : out    std_logic_vector (31 downto 0);         -- данные принятые от первого приемника
            Data_pr2            : out    std_logic_vector (31 downto 0)        -- данные принятые от второго приемника
        );
    END bus_drv;

ARCHITECTURE arhitektura OF bus_drv IS
signal         holt_wr                : std_logic;             -- признак любой записи в контроллер HI-3584
signal         Buf_out                : std_logic_vector (15 downto 0):= (Others => '0'); -- буфер для записи в HI-3584
signal         Buf_pr1_1            : std_logic_vector (15 downto 0):= (Others => '0'); -- буфер младшего слова Пр 1
signal         Buf_pr1_2            : std_logic_vector (15 downto 0):= (Others => '0'); -- буфер старшего слова Пр 1
signal         Buf_pr2_1            : std_logic_vector (15 downto 0):= (Others => '0'); -- буфер младшего слова Пр 2
signal         Buf_pr2_2            : std_logic_vector (15 downto 0):= (Others => '0'); -- буфер старшего слова Пр 2
signal         pl_count            : integer range 0 to 3; -- счетчик слов записаных в HI-3584
    BEGIN

data_in_out <= buf_out when holt_wr = '0' else "ZZZZZZZZZZZZZZZZ";
Data_pr1(15 downto 0) <= Buf_pr1_1(15 downto 0);
Data_pr1(31 downto 16) <= Buf_pr1_2(15 downto 0);
Data_pr2(15 downto 0) <= Buf_pr2_1(15 downto 0);
Data_pr2(31 downto 16) <= Buf_pr2_2(15 downto 0);

------ Любая запись в HI-3584 формирует сигнал holt_wr имеющий сдвинутый нарастающий фронт-----
        PROCESS (clk_25_MHz, cwstr, pl1, pl2 )
            BEGIN
                if cwstr = '0' or pl1 = '0' or pl2 = '0' then holt_wr <= '0';
                elsif clk_25_MHz'EVENT and clk_25_MHz = '0' THEN
                    holt_wr <= '1';
                end if;
            END PROCESS;        
    
-- Процес подсчета выдаваемых слов
        PROCESS (cwstr, pl2)
            BEGIN
                if cwstr = '0' then pl_count <= 0;    
                    elsif pl2'EVENT and pl2 = '1' THEN
                      if pl_count = 3 then pl_count <= 0;
                      else pl_count <= pl_count + 1;
                      end if;
                end if;
            END PROCESS;

------------------------------- формирование буфера для записи в HI-3584 --------------------------------------------         
        PROCESS (Holt_wr,  cwstr, pl1, pl2)
            BEGIN
                if Holt_wr'EVENT and Holt_wr = '0' THEN
                    if cwstr = '0' then Buf_out <= X"8030";
                        else if pl_count = 0 and pl1 = '0' then Buf_out(15 downto 0) <= word1(15 downto 0);
                            else if pl_count = 0 and pl2 = '0' then Buf_out(15 downto 0) <= word1(31 downto 16);
                                else if pl_count = 1 and pl1 = '0' then Buf_out(15 downto 0) <= word2(15 downto 0);
                                    else if pl_count = 1 and pl2 = '0' then Buf_out(15 downto 0) <= word2(31 downto 16);
                                        else if pl_count = 2 and pl1 = '0' then Buf_out(15 downto 0) <= word3(15 downto 0);
                                            else if pl_count = 2 and pl2 = '0' then Buf_out(15 downto 0) <= word3(31 downto 16);
                                                else if pl_count = 3 and pl1 = '0' then Buf_out(15 downto 0) <= word4(15 downto 0);
                                                    else if pl_count = 3 and pl2 = '0'  then Buf_out(15 downto 0) <= word4(31 downto 16);
                                                    end if;
                                                end if;
                                            end if;
                                        end if;
                                    end if;
                                end if;
                            end if;
                        end if;
                    end if;
                end if;
            END PROCESS;
            
------------------------------ Чтение данных из HI-3584 ------------------------------------------------
        PROCESS (en1, sel)
            BEGIN
                if en1'EVENT and en1 = '1' and sel = '0' THEN
                    Buf_pr1_1 <= Data_in_out;
                end if;
            END PROCESS;
        PROCESS (en1, sel)
            BEGIN
                if en1'EVENT and en1 = '1' and sel = '1' THEN
                    Buf_pr1_2 <= Data_in_out;
                end if;
            END PROCESS;
        
        
        PROCESS (en2, sel)
            BEGIN
                if en2'EVENT and en2 = '1' and sel = '0' THEN
                    Buf_pr2_1 <= Data_in_out;
                end if;
            END PROCESS;
        PROCESS (en2, sel)
            BEGIN
                if en2'EVENT and en2 = '1' and sel = '1' THEN
                    Buf_pr2_2 <= Data_in_out;
                end if;
            END PROCESS;    
    
    
    END arhitektura;
XVR
У вас получилась асинхронная схема (или синхронная с множеством клоковых доменов и без каких либо CDC цепей). Работать не будет sad.gif
seldim
Для исключения метастабильности используются разные сигналы чтения для контроллера и для ПЛИС. Сигналы которые идут на контроллер дольше стоят в низком уровне. Для этого использую две частоты 5 МГц. Частоты 5 МГц и 5Мгц с измененной скважностью делаю на PLL. В коде обработчика прерываний в коментариях они условно прорисованы только сдвинулись при вставке. При записи в контроллер делаю задержку данных на шине с помощью частоты 25 МГц. картинки хорошие.

Думаю что пока не пройдусь сигнал тапом гадать бесполезно
sazh
Цитата(seldim @ Sep 10 2012, 10:35) *
Для исключения метастабильности используются разные сигналы чтения для контроллера и для ПЛИС. Сигналы которые идут на контроллер дольше стоят в низком уровне. Для этого использую две частоты 5 МГц. Частоты 5 МГц и 5Мгц с измененной скважностью делаю на PLL. В коде обработчика прерываний в коментариях они условно прорисованы только сдвинулись при вставке. При записи в контроллер делаю задержку данных на шине с помощью частоты 25 МГц. картинки хорошие.

Думаю что пока не пройдусь сигнал тапом гадать бесполезно

Здесь никто Вам не поможет. Меняйте стиль проектитрования (налепить 5 тактовых клока в одном проекте). Весь этот arinc-429 делается параметризированным на любой системной частоте Вашего процессора.
Все эти контроллеры делаются только для навесна прямо на шину процессора или микроконтроллера.
Приемники передатчики на плис arinc 429 на делать самому и вешать на драйвера hi8588, hi8585
bogaev_roman
to seldim. Сброс на логику блока управления записью/чтения - их много и они по описанию синхронные
Код
PROCESS (clk_62_5_KHz, int_pr2, count_pausa_line2)
            BEGIN
                if int_pr2 = '0' then count_pausa_line2 <= 0;
                    elsif clk_62_5_KHz'EVENT


Но не это главное. Тут сплошная аснихронщина.Сигнал pr1_read формируется на частоте clk_5_MHz. Сигнал en1_holt_in таким образом получается совместным от clk_5_MHz, clk_5_MHz_mod и holt_redy, а далее используется в качестве тактовой для sel1 (и опять же сброс там int_pr1). Она же дальше сама будет использоваться тактовой. Тут суммарно не 5 частот (в моем понимании), а 20 будет. И они не описаны в TQ, сам квартус их не пустит по линиям чатот, а логику распихает как фишка ляжет. И, возможно, это и будет работать как-то, вследсвие малых частот, но работать будет нестабильно.
Советую избавляться от асинхронщины и перейти к меньшему кол-ву частот. Почитать для начала статьи Каршенбойма "краткий курс hdl" http://www.kit-e.ru/articles/circuit/2009_02_102.php
seldim
Насчет контроллера внутри ПЛИС с объвязкой из драйверов думал, но когда разводил плату боялся, что не успею реализовать, и заложил их в обычном макете, а результат макет работает а это изделие окозалось проблемным.А с асинхронщиной буду думать, что делать.
sazh
Цитата(seldim @ Sep 10 2012, 20:46) *
А с асинхронщиной буду думать, что делать.


Открываете handbook и в разделе Recommended Design Practices получаете рабочие рекомендации.
По сути все Ваши вторичные клоки надо преобразовать в ena для основного клока.
Для примера
seldim
Спасибо посмотрю.

Реализацию контроллеров аринга в ПЛИС я уже сделал, но старую реализацию надо довести до конца.
seldim
Всем откликнувшимся хочу сказать огромное спасибо, особенно sazh за ссылочку Recommended Design Practices. Переделал полностью управление контроллером на чатоту 5 МГц. Остальные схемы перевел на одну чатоту и сделал переходы между доменами. Результат - все заработало с первого включения.
Вроде переосмыслил свое понимание синхронных схем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.