Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
 
Stanislavir
0 / 0 / 0
Регистрация: 15.07.2017
Сообщений: 3
#1

Квадратурный счетчик - Программируемая логика

15.07.2017, 13:39. Просмотров 361. Ответов 1
Метки нет (Все метки)

Здравствуйте!
Задача: реализовать квадратурный счетчик на Xilinx Spartan-3.

Задача очень распространенная, используется для контроля положения двигателей. К ротору двигателя присоединяется энкодер, с которого считываются сигналы. Эти сигналы будут приходить на ПЛИС, который будет подсчитывать угол поворота и направление движения двигателя, а так же (впоследствии) отправлять данные на микроконтроллер или пк для управления двигателем и контроля положения ротора... Про энкодер и принцип работы, кому интересно - понятно написано здесь https://www.terraelectronica.ru/files/mail/s071221-2.pdf.

Написал простенькую программу, ничего сложного, но при Synthesize XST выскакивает ошибка:

ERROR:Xst:797 - "F:/Users/Stas92/Desktop/Xilinx projects/Q_counter/root.vhd" line 22: unsupported Clock statement.

Подскажите пожалуйста, в чем дело, желательно на языке понятным для новичка) код прилагаю ниже

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
entity root is
   Port ( input_A     : in   STD_LOGIC;
           input_B     : in   STD_LOGIC;
             R           : out  STD_LOGIC_VECTOR(31 downto 0) := (others => '0');
             D           : out  STD_LOGIC);
end root;
 
architecture Behavioral of root is
 
signal count      : std_logic_vector(31 downto 0) := (others => '0');
signal direction  : std_logic := '0';
signal xoring     : std_logic := '0';
 
begin 
  Process (input_A, input_B)
  Begin
    If input_A'event then
       xoring <= (input_A xor input_B);
      If (xoring = '0') then
      direction <= '0';   -- вращение по часовой стрелке
       count <= count + 1;
      else
      direction <= '1';   -- вращение против часовой стрелке
        count <= count - 1;
      End if;
    End if;
End process;
 
R <= count;
D <= direction;
 
end Behavioral;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2017, 13:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Квадратурный счетчик (Программируемая логика):

Счетчик
Здравствуйте, Прошу помощи в решении проблемы. Имеется некий агрегат,...

Счетчик на 5 на D-триггерах
Надо нарисовать схему счётчика (синхронный) на D - триггерах с пересчётом до...

Счетчик c предустановкой
Доброго времени суток! Я создаю 30 разрядный счетчик. architecture count of...

Счетчик на вычитание с предустановкой
мне надо чтобы показывало на индикаторе от 4,3,2,1,0. но он мне показывает...

VHDL. Реверсивный счетчик
Всем привет Пытаюсь сделать курсовую ( 2й реверсивный счетчик со сбросом ) ...

Синхронный вычитающий счетчик на JK
Добрый день. Помогите построить счетчик. Используя необходимое количество...

1
Stanislavir
0 / 0 / 0
Регистрация: 15.07.2017
Сообщений: 3
28.08.2017, 18:29  [ТС] #2
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity counter is
  Port ( input_A : in STD_LOGIC;
         input_B : in STD_LOGIC;
			CLK     : in STD_LOGIC;
			D       : out std_logic;
       COUNT_OUT : out std_logic_vector(40 downto 0) :=  (others => '0') );
  end counter;

architecture Behavioral of counter is

signal count_int : std_logic_vector(40 downto 0) :=  (others => '0');
signal dir: STD_LOGIC;
signal X  : STD_LOGIC;

begin

process (X, count_int, dir)
--variable count: natural range 0 to 104857;
--variable dir: natural range 0 to 1;
  begin
    if rising_edge(X) then
	   if input_B = '0' then 
		  count_int <= count_int+1; 
		  dir <= '1'; -- вращение по часовой стрелке
		  else 
		  dir <= '0'; -- вращение против часовой стрелке
		 count_int <= count_int-1;
		end if;	  
    end if; 
  COUNT_OUT <= count_int; 
  D <= dir;
  end process;
  
process (CLK)
  begin
    if rising_edge(CLK) then 
	   if input_A='1' then
        X<='1';
	     else X<='0';
		end if;
    end if;
  end process;

end Behavioral;
Добавлено через 54 секунды
Все заработало, разобрался, настроил передачу по RS используя метод конечных автоматов... спасибо....
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2017, 18:29
Привет! Вот еще темы с решениями:

Вычитающий счетчик на D-триггерах
Доброго времени суток) Дали задание синтезировать вычитающий счетчик с Kсч.=11...

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

DSCH. Реверсивный счетчик
Ребята! Нужно переделать готовую схему в программе так, чтобы по нажатии...

4-х разрядный счетчик на JK-триггерах
Помогите построить подробную схему в logical circuit 4-х разрядного счетчика...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru