Serhiy_UA 1 11 сентября, 2015 Опубликовано 11 сентября, 2015 · Жалоба Но к сожалению именно его я и описал,конечный автомат, по крайней мере старался. Если где ошибаюсь, ткните мордочкой :). Имелся ввиду следующий граф FSM по Муру на 16 состояний для этого энкодера (см., приложение). Ну и, разумеется, перед FSM должна быть предварительная анти-дребезговая обработка сигналов Х1, Х0 что идут от энкодера, с фиксацией результата на регистре. Graph_FSM.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 11 сентября, 2015 Опубликовано 11 сентября, 2015 · Жалоба Вот я тоже хочу погрузиться в жестокий мир FPGA. Раньше на плисках немного писал в AHDL, но это было давно. А на данный момент есть задачи которые можно на плисках собрать. Ну и посмотрел, какие вещи на них делают. Глазы на лоб. Вы хороший пример взяли, чтобы учиться, но неверно подошли к вопросу. В начале надо было раздобыть мат часть, а потом кодить. Вот, к примеру, описание квадратурного энкодера в микроконтроллерах TI TMS320 http://www.ti.com/lit/ug/sprug05a/sprug05a.pdf Там есть описание, стейт-машина, схемы и регистровые поля - идеально для начинаний. Рекомендую сделать полный аналог в качестве обучения :-) По этому описанию 1 в 1 содран периферийный блок энкодера в кортесе М4F производства НИИЕТ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 сентября, 2015 Опубликовано 11 сентября, 2015 · Жалоба Доброго времени суток. ))) Итак суть проблемы. Пытаюсь , значит, описать счётчик для инкрементального энкодера. Обработка двух битного кода грея. Сделано по синхронной схеме. CLK - порядка 20МГц, а сигналы энкодера 20-30 Кгц. Реализация на Xilinx. This entity reads the signals from the quadrature encoder and maintains a counter, that is incremented or decremented depending on which way the knob is rotated. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity QuadratureDecoder is Port ( QuadA : in STD_LOGIC; QuadB : in STD_LOGIC; Clk : in STD_LOGIC; Position : out STD_LOGIC_VECTOR (7 downto 0)); end QuadratureDecoder; architecture Behavioral of QuadratureDecoder is signal QuadA_Delayed: unsigned(2 downto 0) := "000"; signal QuadB_Delayed: unsigned(2 downto 0) := "000"; signal Count_Enable: STD_LOGIC; signal Count_Direction: STD_LOGIC; signal Count: unsigned(7 downto 0) := "00000000"; begin process (Clk) begin if Clk='1' and Clk'event then QuadA_Delayed <= (QuadA_Delayed(1), QuadA_Delayed(0), QuadA); QuadB_Delayed <= (QuadB_Delayed(1), QuadB_Delayed(0), QuadB); if Count_Enable='1' then if Count_Direction='1' then Count <= Count + 1; Position <= conv_std_logic_vector(Count, 8); else Count <= Count - 1; Position <= conv_std_logic_vector(Count, 8); end if; end if; end if; end process; Count_Enable <= QuadA_Delayed(1) xor QuadA_Delayed(2) xor QuadB_Delayed(1) xor QuadB_Delayed(2); Count_Direction <= QuadA_Delayed(1) xor QuadB_Delayed(2); end Behavioral; схему можно посмотреть в RTL Viewer PS если я правильно понял, что Вам надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T00T 0 11 сентября, 2015 Опубликовано 11 сентября, 2015 (изменено) · Жалоба Имелся ввиду следующий граф FSM по Муру на 16 состояний для этого энкодера (см., приложение). Ну и, разумеется, перед FSM должна быть предварительная анти-дребезговая обработка сигналов Х1, Х0 что идут от энкодера, с фиксацией результата на регистре. В общем я посмотрел на этот граф, ну это всё то же, на что и я ссылку давал. Реализация этого графа уже в себе несёт анти-дребезговую обработку сигналов Х1, Х0 что идут от энкодера. Ну и у меня так же и написано. У меня в данной задаче проблемы были связанны не с реализацией алгоритма(пока это простые алгоритмы), а с тем что не учитывалась специфика реализации на плис. Нужно побольше узнать о специфике применения ПЛИС. Последнее время просто часто писал на АСМЕ для AVR, а там всё тривиально - как написано, так и работать будет. А тут кукиш, вот и возник этот топик. :) Вы хороший пример взяли, чтобы учиться, но неверно подошли к вопросу. В начале надо было раздобыть мат часть, а потом кодить. Вот, к примеру, описание квадратурного энкодера в микроконтроллерах TI TMS320 http://www.ti.com/lit/ug/sprug05a/sprug05a.pdf Там есть описание, стейт-машина, схемы и регистровые поля - идеально для начинаний. Рекомендую сделать полный аналог в качестве обучения :-) По этому описанию 1 в 1 содран периферийный блок энкодера в кортесе М4F производства НИИЕТ. Спасибо за совет, может как нибудь. А про мат часть, сначала и прочитал(ссылку я давал). Просто такой энкодер очень простой и даже читать то особо не о чём. счет идёт просто: изменился, один сигнал смотри в какую сторону да и всё. И дребезг сам собой подавляется т.к. количество переключений в момент дребезга всегда нечётно и если их отслеживать: то прибавлять то отнимать, результат всегда окажется верным. ........... PS если я правильно понял, что Вам надо... Спасибо, думаю это то что надо, и уверен что будет работать.(возьму на заметку метод). Тем не менее мой алгоритм тоже хорошо работает, проверено уже!!!!!!! Я тут много обсуждений читал, блин вообще как то приятно обсуждать вопросы на этом форуме. Многие стараются помочь, с пониманием :). И это не только мне, а многим начинающим. За это отдельное спасибо. Когда нибудь у меня тоже будет достаточно опыта в области применения плис, и тоже кому нибудь помогу. :) Изменено 11 сентября, 2015 пользователем T00T Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться