|
Непонятные глюки в проекте |
|
|
|
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 4 2012, 05:29
|
Знающий
   
Группа: Участник
Сообщений: 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 Кгц.
|
|
|
|
|
Sep 4 2012, 06:05
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Цитата(seldim @ Sep 4 2012, 09:51)  PLL функция ведь от производителя и по моим понятиям должна работать во всем задаваемом диапазоне По документации 62,5 кГц входит в диапазон работы PLL?
|
|
|
|
|
Sep 4 2012, 17:33
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 4 2012, 18:38
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 6 2012, 18:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(seldim @ Sep 4 2012, 21:33)  То есть после загрузки плис при указании в квартусе начального значения счетчика := 0 возможно что счетчик окажется не в нулевом значении? Я не знаю, можно ли в vhdl указать начальное значение счетчику, в верилоге это initial - структура работает только для моделирования, синтезатором игнорируется, но для альтера по умолчанию все значения на регистрах - 0. Но вообще, при определенных условиях можно после сброса загнать регистр (ну или схемы хранения, счетчики, значения автоматов) в непредсказуемое состояние при заданном нулевом - в случае метастабильности. Пример - 2 триггера, выход второго поступает на вход первого, сброс синхронный 1 такт и софтовый - т.е. перестало работать и требуется локальный сброс. Ограничений нет, получилось так, что изменение сброса почти совпадает с фронтом, но первый его "хватает" на первый такт (и при этом хватает выход второго триггера, который еще не обнулился и может быть любым), а второй на следующий. Результат - если на выходе второго случайно была 1, а первый требовалось по сбросу скинуть в 0, то ахтунг  . Судя по коду, у Вас сброс будет иметь длительность ~40нс * 65535, т.е. менее 4*10-(3)с. Если его подавать как синхронный на регистры с рабочей частотй 2Гц (она была упомянута), где гарантия, что он сработает? Опять же, судя по коду (vhdl плохо знаю, тут могу ошибиться), сброс - комбинационный, т.е. не выход регистра? Если это так, то абсолютно точно будет гонка сигналов, т.е. сброс будет представлять из себя не единичный переход из 0 в 1, а несколько раз с непонятной длительностью и дальнейшее поведения всей схемы - непредсказуемо. Если все ограничения грамотно описать в TQ, все данные ситуации будут им определены как ошибочные и все расписано подробным образом.
|
|
|
|
|
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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Sep 10 2012, 05:48
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 10 2012, 12:35
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 11 2012, 07:11
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(seldim @ Sep 10 2012, 20:46)  А с асинхронщиной буду думать, что делать. Открываете handbook и в разделе Recommended Design Practices получаете рабочие рекомендации. По сути все Ваши вторичные клоки надо преобразовать в ena для основного клока. Для примера
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|