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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятные глюки в проекте
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
vadimp61
сообщение Sep 4 2012, 05:29
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 599
Регистрация: 28-08-08
Из: Ростов папа
Пользователь №: 39 872



Цитата(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 Кгц.
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 4 2012, 05:51
Сообщение #3


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

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



PLL функция ведь от производителя и по моим понятиям должна работать во всем задаваемом диапазоне
Go to the top of the page
 
+Quote Post
troiden
сообщение Sep 4 2012, 06:05
Сообщение #4


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

Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069



Цитата(seldim @ Sep 4 2012, 09:51) *
PLL функция ведь от производителя и по моим понятиям должна работать во всем задаваемом диапазоне

По документации 62,5 кГц входит в диапазон работы PLL?
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 4 2012, 06:39
Сообщение #5


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

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



В мегафункции делитель 400 при входной частоте 25 МГц дают 62, 5 КГц. Если есть ограничения на PLL покажите ссылочку.

Сообщение отредактировал seldim - Sep 4 2012, 06:40
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Sep 4 2012, 11:43
Сообщение #6


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Вы все частоты правильно прописали в sdc и временные ошибки отсутствуют? Сами по себе частоты низкие, но описанная ситуация похожа на невыполнение временных соотношений. Со сбросом тоже вопрос - Вы его подаете как синхронный и он один для всех триггеров?
Go to the top of the page
 
+Quote Post
alexPec
сообщение Sep 4 2012, 13:12
Сообщение #7


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

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(bogaev_roman @ Sep 4 2012, 15:43) *
Вы все частоты правильно прописали в sdc и временные ошибки отсутствуют? Сами по себе частоты низкие, но описанная ситуация похожа на невыполнение временных соотношений. Со сбросом тоже вопрос - Вы его подаете как синхронный и он один для всех триггеров?

Согласен, я бы еще отчет таймквеста на месте ТС посмотрел, какие клоки он увидел, совпадают ли они с действительностью и нет ли отрицательных слэков.
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 4 2012, 16:23
Сообщение #8


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

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



По времянке могут быть вопросы, но работа контроллера зависит только от сброса, после которого инициализируется контроллер. Если бы проблема была во времянках то переход от 16 разрядного счетчика на частоте 25 МГц на 8-и разрядный счетчик на 62,5 КГц ситуацию должен только значительно улучшить, а работа наоборот прекращалась. Вот это и ставит в тупик. Если брать задержку одного тригера 7 ns то на 8-и разрядах задержка 56 ns при длительности тактового импульса 16000 ns без ТС видно что здесь должно работать.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Sep 4 2012, 16:44
Сообщение #9


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



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

Я не видел времянки и результата TQ, не видел описания работы (может там куча словев логики). Не знаю, пустил ли вообще квартус частоту по линии частот. Не знаю - возможно получаемый сброс - синхронный, но никаках не описан как и частоты и триггеры падают в метастабильность, а счетчик по сбросу не в нуле, а в каком то другом состоянии.
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 4 2012, 17:33
Сообщение #10


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

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



То есть после загрузки плис при указании в квартусе начального значения счетчика := 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;


Сообщение отредактировал seldim - Sep 4 2012, 17:36
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Sep 4 2012, 18:38
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



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



Сообщение отредактировал Alexey K - Sep 4 2012, 18:59
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 5 2012, 02:47
Сообщение #12


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

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



Да так должно быть сброс генерится 1 раз по включению питания. На счет библиотек спасибо я их один раз подключил кокда начал изучать HDL так и таскаю. Разберусь оставлю нужные.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Sep 6 2012, 18:10
Сообщение #13


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(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, все данные ситуации будут им определены как ошибочные и все расписано подробным образом.
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 7 2012, 03:01
Сообщение #14


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

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



Да действительно он без регистра этоя обязательно исправлю. Спасибо за подсказку. Возмоно это и есть причина второго глюка. Остается вопрос с как исправление значения счетчика в обработчике кнопок, который является только источником данных портится управление контроллером. Может имеет смыст использовать инкрементную компиляцию?
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Sep 7 2012, 11:18
Сообщение #15


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(seldim @ Sep 7 2012, 07:01) *
Остается вопрос с как исправление значения счетчика в обработчике кнопок, который является только источником данных портится управление контроллером. Может имеет смыст использовать инкрементную компиляцию?

А чем инкрементальная компиляция поможет?
Приведите хотя бы на словах, что есть управление контроллером, каким образом сброс используется в контроллере, на какой частоте работает сам контроллер и его управление, есть ли пересинхронизация, если частоты разные, сброс синхронный/асинхронный. В каком месте конкретно сбоит если возможно определить. Экстрасенсов я думаю здесь нет biggrin.gif
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 9 2012, 14:20
Сообщение #16


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

Группа: Участник
Сообщений: 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
Сообщение #17


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

Группа: Модераторы
Сообщений: 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 10 2012, 05:48
Сообщение #18


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

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



Вроде уже писал. Запись данных в контроллер синхронизируется сигналами записи, Чтение синхронизируется сигналами чтения. Дополнительных частот синхронизации у контроллера не предусмотренно. Временные характеристики сигналов чтения и записи, которые формируются в ПЛИС соответствуют требованиям на контроллер. Сигналы записив контроллер : 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;


Сообщение отредактировал seldim - Sep 10 2012, 05:52
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 10 2012, 07:13
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



У вас получилась асинхронная схема (или синхронная с множеством клоковых доменов и без каких либо CDC цепей). Работать не будет sad.gif
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 10 2012, 07:35
Сообщение #20


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

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



Для исключения метастабильности используются разные сигналы чтения для контроллера и для ПЛИС. Сигналы которые идут на контроллер дольше стоят в низком уровне. Для этого использую две частоты 5 МГц. Частоты 5 МГц и 5Мгц с измененной скважностью делаю на PLL. В коде обработчика прерываний в коментариях они условно прорисованы только сдвинулись при вставке. При записи в контроллер делаю задержку данных на шине с помощью частоты 25 МГц. картинки хорошие.

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

Сообщение отредактировал seldim - Sep 10 2012, 07:33
Go to the top of the page
 
+Quote Post
sazh
сообщение Sep 10 2012, 07:58
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



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

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

Здесь никто Вам не поможет. Меняйте стиль проектитрования (налепить 5 тактовых клока в одном проекте). Весь этот arinc-429 делается параметризированным на любой системной частоте Вашего процессора.
Все эти контроллеры делаются только для навесна прямо на шину процессора или микроконтроллера.
Приемники передатчики на плис arinc 429 на делать самому и вешать на драйвера hi8588, hi8585
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Sep 10 2012, 12:35
Сообщение #22


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



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
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 10 2012, 17:46
Сообщение #23


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

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



Насчет контроллера внутри ПЛИС с объвязкой из драйверов думал, но когда разводил плату боялся, что не успею реализовать, и заложил их в обычном макете, а результат макет работает а это изделие окозалось проблемным.А с асинхронщиной буду думать, что делать.
Go to the top of the page
 
+Quote Post
sazh
сообщение Sep 11 2012, 07:11
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(seldim @ Sep 10 2012, 20:46) *
А с асинхронщиной буду думать, что делать.


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

Прикрепленные файлы
Прикрепленный файл  mail_out.rar ( 307.79 килобайт ) Кол-во скачиваний: 17
 
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 12 2012, 05:15
Сообщение #25


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

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



Спасибо посмотрю.

Реализацию контроллеров аринга в ПЛИС я уже сделал, но старую реализацию надо довести до конца.
Go to the top of the page
 
+Quote Post
seldim
сообщение Sep 17 2012, 04:56
Сообщение #26


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

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



Всем откликнувшимся хочу сказать огромное спасибо, особенно sazh за ссылочку Recommended Design Practices. Переделал полностью управление контроллером на чатоту 5 МГц. Остальные схемы перевел на одну чатоту и сделал переходы между доменами. Результат - все заработало с первого включения.
Вроде переосмыслил свое понимание синхронных схем.
Go to the top of the page
 
+Quote Post

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

 


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


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