Перейти к содержанию
    

не понятна разница в коде

Но к сожалению именно его я и описал,конечный автомат, по крайней мере старался.

Если где ошибаюсь, ткните мордочкой :).

Имелся ввиду следующий граф FSM по Муру на 16 состояний для этого энкодера (см., приложение).

Ну и, разумеется, перед FSM должна быть предварительная анти-дребезговая обработка сигналов Х1, Х0 что идут от энкодера, с фиксацией результата на регистре.

Graph_FSM.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот я тоже хочу погрузиться в жестокий мир FPGA. Раньше на плисках немного писал в AHDL, но это было давно. А на данный момент есть задачи которые можно на плисках собрать. Ну и посмотрел, какие вещи на них делают. Глазы на лоб.

Вы хороший пример взяли, чтобы учиться, но неверно подошли к вопросу. В начале надо было раздобыть мат часть, а потом кодить.

Вот, к примеру, описание квадратурного энкодера в микроконтроллерах TI TMS320 http://www.ti.com/lit/ug/sprug05a/sprug05a.pdf Там есть описание, стейт-машина, схемы и регистровые поля - идеально для начинаний. Рекомендую сделать полный аналог в качестве обучения :-) По этому описанию 1 в 1 содран периферийный блок энкодера в кортесе М4F производства НИИЕТ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток. )))

Итак суть проблемы.

Пытаюсь , значит, описать счётчик для инкрементального энкодера. Обработка двух битного кода грея.

Сделано по синхронной схеме. 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 если я правильно понял, что Вам надо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имелся ввиду следующий граф FSM по Муру на 16 состояний для этого энкодера (см., приложение).

Ну и, разумеется, перед FSM должна быть предварительная анти-дребезговая обработка сигналов Х1, Х0 что идут от энкодера, с фиксацией результата на регистре.

 

В общем я посмотрел на этот граф, ну это всё то же, на что и я ссылку давал.

Реализация этого графа уже в себе несёт анти-дребезговую обработку сигналов Х1, Х0 что идут от энкодера.

Ну и у меня так же и написано.

 

У меня в данной задаче проблемы были связанны не с реализацией алгоритма(пока это простые алгоритмы), а с тем что не учитывалась специфика реализации на плис. Нужно побольше узнать о специфике применения ПЛИС.

Последнее время просто часто писал на АСМЕ для AVR, а там всё тривиально - как написано, так и работать будет.

А тут кукиш, вот и возник этот топик. :)

 

 

Вы хороший пример взяли, чтобы учиться, но неверно подошли к вопросу. В начале надо было раздобыть мат часть, а потом кодить.

Вот, к примеру, описание квадратурного энкодера в микроконтроллерах TI TMS320 http://www.ti.com/lit/ug/sprug05a/sprug05a.pdf Там есть описание, стейт-машина, схемы и регистровые поля - идеально для начинаний. Рекомендую сделать полный аналог в качестве обучения :-) По этому описанию 1 в 1 содран периферийный блок энкодера в кортесе М4F производства НИИЕТ.

 

Спасибо за совет, может как нибудь.

А про мат часть, сначала и прочитал(ссылку я давал). Просто такой энкодер очень простой и даже читать то особо не о чём.

счет идёт просто: изменился, один сигнал смотри в какую сторону да и всё.

И дребезг сам собой подавляется т.к. количество переключений в момент дребезга всегда нечётно и если их отслеживать: то прибавлять то отнимать, результат всегда окажется верным.

 

...........

PS если я правильно понял, что Вам надо...

 

Спасибо, думаю это то что надо, и уверен что будет работать.(возьму на заметку метод).

 

Тем не менее мой алгоритм тоже хорошо работает, проверено уже!!!!!!!

 

Я тут много обсуждений читал,

блин вообще как то приятно обсуждать вопросы на этом форуме. Многие стараются помочь, с пониманием :).

И это не только мне, а многим начинающим.

За это отдельное спасибо.

 

Когда нибудь у меня тоже будет достаточно опыта в области применения плис, и тоже кому нибудь помогу. :)

Изменено пользователем T00T

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...