|
|
  |
Программирование ПЛИС, совсем запутался... |
|
|
|
Apr 17 2011, 18:08
|

Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 11-11-09
Пользователь №: 53 561

|
дк, обязательно внешний генератор юзать чтоль? и еще вопросик. есть код(для проверки работоспособности): test_bench: Код LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL;
ENTITY dem_al_TB_vhd IS END dem_al_TB_vhd;
ARCHITECTURE behavior OF dem_al_TB_vhd IS
-- Component Declaration for the Unit Under Test (UUT) COMPONENT dem_al PORT( Tg : IN std_logic; knopka_90 : IN std_logic; knopka_Min_90 : IN std_logic; Enable : OUT std_logic; FF : OUT std_logic_vector(1 to 12); Dir_1 : OUT std_logic; Dir_2 : OUT std_logic; Step_1 : OUT std_logic; Step_2 : OUT std_logic ); END COMPONENT;
--Inputs SIGNAL Tg : std_logic := '0'; SIGNAL knopka_90 : std_logic := '0'; SIGNAL knopka_Min_90 : std_logic := '0';
--Outputs SIGNAL Enable : std_logic; SIGNAL FF : std_logic_vector(1 to 12); SIGNAL Dir_1 : std_logic; SIGNAL Dir_2 : std_logic; SIGNAL Step_1 : std_logic; SIGNAL Step_2 : std_logic;
BEGIN
-- Instantiate the Unit Under Test (UUT) uut: dem_al PORT MAP( Tg => Tg, knopka_90 => knopka_90, knopka_Min_90 => knopka_Min_90, Enable => Enable, FF => FF, Dir_1 => Dir_1, Dir_2 => Dir_2, Step_1 => Step_1, Step_2 => Step_2 );
Tg <= not Tg after 10 ms; knopka_90 <= '1' after 20 ms, '0' after 30 ms;
END; vhdl: Код library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all;
entity dem_al is Port ( Tg : in STD_LOGIC; knopka_90 : in STD_LOGIC; knopka_Min_90 : in STD_LOGIC; Enable : out STD_LOGIC; FF : out STD_LOGIC_VECTOR(1 to 12) := "000000000000"; Dir_1 : out STD_LOGIC; Dir_2 : out STD_LOGIC; Step_1 : out STD_LOGIC; Step_2 : out STD_LOGIC); end dem_al;
architecture Behavioral of dem_al is
begin
process (Tg) variable k: integer; variable F: integer := 600; --чтобы не было неуказанного начала шага в момент включения begin if (knopka_90='1') then --определяем направление вращения (по часовой) k:=1; --для определения вращения каждого двигателя на разных этапах движения F:=0; --счетчик для выполнения шага(для плавности разгона. определяет паузу между импульсами) end if; if (knopka_min_90='1') then --определяем направление вращения (против часовой) k:=0; F:=0; end if; if (F<586) then --когда угол меньше 90 Enable<='1'; -- сигнал активного состояния для драйвера PLS... if (Tg='1') then -- Когда тактовый сигнал=1 F:=F+1; -- Складываем для остановки при угле=90гр. FF<=CONV_STD_LOGIC_VECTOR(F,12); --для просмотра F if (k=1) then --определяем направление вращения первого двигателя Dir_1<='1'; elsif (k=0) then Dir_1<='0'; end if; if (F=1 or F=17 or F=25 or F=29 or F=31 or F=32) then -- Первая фаза разгона в противофазе if (k=1) then --определяем направление вращения второго двигателя Dir_2<='0'; elsif (k=0) then Dir_2<='1'; end if; Step_1<='1'; --шаг первого Step_2<='1'; --шаг второго elsif (F=42 or F=47 or F=50 or F=52 or F=53) then -- Вторая фаза разгона первым Step_1<='1'; elsif (F=55 or F=56) then -- Третья фаза разгона синфазно if (k=1) then Dir_2<='1'; elsif (k=0) then Dir_2<='0'; end if; Step_1<='1'; Step_2<='1'; elsif (F>56 and F<531) then -- Движение синфазно if (k=1) then Dir_2<='1'; elsif (k=0) then Dir_2<='0'; end if; Step_1<='1'; Step_2<='1'; elsif (F=534 or F=536 or F=539 or F=544 or F=554) then -- Вторая фаза торможения первым Step_1<='1'; elsif(F=555 or F=557 or F=561 or F=569 or F=585) then -- Третья фаза торможения в противофазе if (k=1) then Dir_2<='0'; elsif (k=0) then Dir_2<='1'; end if; Step_1<='1'; Step_2<='1'; end if; else --когда тактовый=0 и F>585 (угол больше 90) Step_1<='0'; Step_2<='0'; Enable<='0'; end if; end if; end process;
end Behavioral; т.е. есть два движка. второй закреплен на валу первого. суммарный угол поворота=90 градусов. в симуляции все работает. а после прошивки шаговый двигатель просто шагает безостановочно и все. еще нет никаких пропусков импульса в соответствии с условием сравнения F. но в начальный момент, когда F=600 двигатели не шагают. Условие на проверку направления работает.
Сообщение отредактировал stu - Apr 17 2011, 18:25
--------------------
Мы ведь работаем, чтобы жить, а не живем, чтобы работать??? ;)
|
|
|
|
|
Apr 18 2011, 05:35
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата дк, обязательно внешний генератор юзать чтоль Да Цитата а после прошивки шаговый двигатель просто шагает безостановочно Что написали, то он и делает. Ответьте на простой вопрос - с какой скоростью он у вас шагает? Где задается частота переключения фаз ШД?
|
|
|
|
|
Apr 19 2011, 04:36
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(stu @ Apr 18 2011, 23:29)  со скоростью зависящей от частоты с генератора. какой поставить период с такой и будет. У вас в 'проге' вообще нет входа для генератора. Tg - это не тактовый сигнал. Для того, что бы он стал тактовым (точнее клоком), внутренность process'а должна быть помещена в if rising_edge(Tg) (единственное исключение - асинхронный сброс) И вообще, почитайте какой нибудь букварь по HDL. HDL - это не С! Это язык описания аппаратуры, а не язык программирования
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|