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

 
 
> Непонятные глюки в проекте
seldim
сообщение Sep 4 2012, 04:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Здравствуйте. Есть проект задачей которого является обработка набока кнопок (антидребезг 30 ms, проверка на залипание 5 сек), выдача данных (информация от обработчика кнопок) во внешний контроллер биполярного кода по паралельной шине, прием данных из этого контроллера и выдача их на светодиоды. ПЛИС циклон 4. Сброс организован внутри ПЛИС на счетчике. Внешний генератор 25 МГц. Для обработки кнопок был сделан делитель частоты до 610 Гц и 2 Гц (предварительно 25 МГц на PLL поделены до 62,5 КГц).
Проблема в следующем: проект заработал, но были неправильно выбраны значения счетчика для 5 сек проверки на залипание (признак залипания кнопки появлялся через 7 сек а не через 5). При смене значения счетчика при котором надо выставить признак залипания кнопки у меня ломалася не обработчик кнопок, а весь проект. Переставал обслуживаться контроллер биполярного кода, хотя его управление никаким образом не связано с обработчиком кнопок. Вторая проблема со схемой сброса. Сначала ее сделал от частоты генератора но значения счетчика на котором происходил сброс (65534) слишком большое и я решил попробовать перейти на частоту 62,5 КГц от PLL соответственно разрядность счетчика значительно уменьшилась, но возникла ситуация аналогичная предыдущей - ничего не работает! Сейчас оставил генератор сброса на частоте 25 МГц, а в обработчике кнопок залипание проверяю от частоты не 2 Гц а 610 Гц. Вроде заработало. В чем могла быть причина сбоя не понятно. Модель ничего не показывает. Инкрементная компиляция отключена. Проглядеть все цепочки сигнал тапом пока небыло возможности. Если у кого нибудь есть идеи по поводу причин данных сбоев пожалуйса напишите.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
seldim
сообщение Sep 9 2012, 14:20
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Контроллер работает под управление хоста (в моем случае ПЛИС). Паралельная двунаправленная шина 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 разрядный адрес слова (адрес задан константами), данные с обработки кнопок. Тоесть меняя фильтры в обработчике кнопок могут максимум испортиться данные, а у меня перестает работать все. К сожалению пока не могу полазить сигнал тапом и локализовать место отказа. Собственно поэтому пока и приходится анализировать код.

Сообщение отредактировал seldim - Sep 9 2012, 14:22
Go to the top of the page
 
+Quote Post
Maverick
сообщение Sep 9 2012, 18:05
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(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? Где данные частоты в процессах? Вы асинхронную логику пытаетесь описать? Если да то плохая идея....
Какие сигналы приходят в ПЛИС?


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- seldim   Непонятные глюки в проекте   Sep 4 2012, 04:54
- - vadimp61   Цитата(seldim @ Sep 4 2012, 08:54) Здравс...   Sep 4 2012, 05:29
- - seldim   PLL функция ведь от производителя и по моим поняти...   Sep 4 2012, 05:51
|- - troiden   Цитата(seldim @ Sep 4 2012, 09:51) PLL фу...   Sep 4 2012, 06:05
- - seldim   В мегафункции делитель 400 при входной частоте 25 ...   Sep 4 2012, 06:39
- - bogaev_roman   Вы все частоты правильно прописали в sdc и временн...   Sep 4 2012, 11:43
|- - alexPec   Цитата(bogaev_roman @ Sep 4 2012, 15:43) ...   Sep 4 2012, 13:12
- - seldim   По времянке могут быть вопросы, но работа контролл...   Sep 4 2012, 16:23
|- - bogaev_roman   Цитата(seldim @ Sep 4 2012, 20:23) Если б...   Sep 4 2012, 16:44
- - seldim   То есть после загрузки плис при указании в квартус...   Sep 4 2012, 17:33
|- - Alexey K   У вас сброс постоянно в лог 1 после отсчета счетч...   Sep 4 2012, 18:38
|- - bogaev_roman   Цитата(seldim @ Sep 4 2012, 21:33) То ест...   Sep 6 2012, 18:10
- - seldim   Да так должно быть сброс генерится 1 раз по включе...   Sep 5 2012, 02:47
- - seldim   Да действительно он без регистра этоя обязательно ...   Sep 7 2012, 03:01
|- - bogaev_roman   Цитата(seldim @ Sep 7 2012, 07:01) Остает...   Sep 7 2012, 11:18
- - seldim   Вроде уже писал. Запись данных в контроллер синхро...   Sep 10 2012, 05:48
- - XVR   У вас получилась асинхронная схема (или синхронная...   Sep 10 2012, 07:13
- - seldim   Для исключения метастабильности используются разны...   Sep 10 2012, 07:35
|- - sazh   Цитата(seldim @ Sep 10 2012, 10:35) Для и...   Sep 10 2012, 07:58
- - bogaev_roman   to seldim. Сброс на логику блока управления запись...   Sep 10 2012, 12:35
- - seldim   Насчет контроллера внутри ПЛИС с объвязкой из драй...   Sep 10 2012, 17:46
|- - sazh   Цитата(seldim @ Sep 10 2012, 20:46) А с а...   Sep 11 2012, 07:11
- - seldim   Спасибо посмотрю. Реализацию контроллеров аринга ...   Sep 12 2012, 05:15
- - seldim   Всем откликнувшимся хочу сказать огромное спасибо,...   Sep 17 2012, 04:56


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 11:14
Рейтинг@Mail.ru


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