реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Программирование ПЛИС, совсем запутался...
Ivan Kuznetzov
сообщение Feb 8 2011, 16:07
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Делаю подобие "видеоглазка", но есть одна проблема - искажение изображения, помогите пожалуйста!

ARM + LCD + Camera

Сообщение отредактировал Ivan Kuznetzov - Feb 8 2011, 16:25


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 9 2011, 08:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В ПЛИС у вас получилась асинхронная схема. Для ПЛИС это не гуд (в особенности для выходного сигнала WR).
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 11 2011, 16:49
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



подскажите пожалуйста, как надо сделать? я не специалист по плисам...


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 11 2011, 18:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Вам нужна тактовая частота и все тригера, которые есть в схеме, должны напрямую от нее тактироваться (без всякой логики в цепях тактирования). Выходы (особенно типа WR) так же должны идти напрямую с выходов тригеров, иначе там могут быть иголки из за гонок
Go to the top of the page
 
+Quote Post
stu
сообщение Apr 10 2011, 10:52
Сообщение #5


Местный
***

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



Привет. у меня немного другая ситуация)) в инете не нашел поэтому пишу сюда. мне нужен пример использования внутреннего генератора ПЛИС xilinx. опишите пжлст, если не затруднит


--------------------
Мы ведь работаем, чтобы жить, а не живем, чтобы работать??? ;)
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 10 2011, 15:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(stu @ Apr 10 2011, 14:52) *
мне нужен пример использования внутреннего генератора ПЛИС xilinx
Как найдете - напишите в Xilinx. Они не в курсе, что в их FPGA есть внутренний генератор rolleyes.gif
Go to the top of the page
 
+Quote Post
nk@
сообщение Apr 10 2011, 17:06
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 8-12-09
Пользователь №: 54 138



Цитата(XVR @ Apr 10 2011, 18:29) *
Как найдете - напишите в Xilinx. Они не в курсе, что в их FPGA есть внутренний генератор rolleyes.gif

Парень, кмк, имел ввиду PLL sm.gif
Go to the top of the page
 
+Quote Post
stu
сообщение Apr 17 2011, 18:08
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Мы ведь работаем, чтобы жить, а не живем, чтобы работать??? ;)
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 18 2011, 05:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
дк, обязательно внешний генератор юзать чтоль
Да
Цитата
а после прошивки шаговый двигатель просто шагает безостановочно
Что написали, то он и делает.
Ответьте на простой вопрос - с какой скоростью он у вас шагает? Где задается частота переключения фаз ШД?
Go to the top of the page
 
+Quote Post
stu
сообщение Apr 18 2011, 19:29
Сообщение #10


Местный
***

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



со скоростью зависящей от частоты с генератора. какой поставить период с такой и будет. но в проге есть условия, при выполнении которых некоторые импульсы не должны отрабатываться. на них не реагирует. я не могу понять: в начальный момент, когда F=600 условие F<586 срабатывает норм, потом при его сбросе, после нажатия кнопки - нет.


--------------------
Мы ведь работаем, чтобы жить, а не живем, чтобы работать??? ;)
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 19 2011, 04:36
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

И вообще, почитайте какой нибудь букварь по HDL. HDL - это не С! Это язык описания аппаратуры, а не язык программирования
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016