|
Непонятные глюки в проекте |
|
|
|
Sep 4 2012, 04:54
|
Частый гость
 
Группа: Участник
Сообщений: 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 Гц. Вроде заработало. В чем могла быть причина сбоя не понятно. Модель ничего не показывает. Инкрементная компиляция отключена. Проглядеть все цепочки сигнал тапом пока небыло возможности. Если у кого нибудь есть идеи по поводу причин данных сбоев пожалуйса напишите.
|
|
|
|
|
 |
Ответов
|
Sep 9 2012, 14:20
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 9 2012, 18:05
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|