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

Программирование ПЛИС

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

 

ARM + LCD + Camera

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

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


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

В ПЛИС у вас получилась асинхронная схема. Для ПЛИС это не гуд (в особенности для выходного сигнала WR).

 

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


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

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

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


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

Вам нужна тактовая частота и все тригера, которые есть в схеме, должны напрямую от нее тактироваться (без всякой логики в цепях тактирования). Выходы (особенно типа WR) так же должны идти напрямую с выходов тригеров, иначе там могут быть иголки из за гонок

 

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


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

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

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


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

мне нужен пример использования внутреннего генератора ПЛИС xilinx
Как найдете - напишите в Xilinx. Они не в курсе, что в их FPGA есть внутренний генератор :rolleyes:

 

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


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

Как найдете - напишите в Xilinx. Они не в курсе, что в их FPGA есть внутренний генератор :rolleyes:

Парень, кмк, имел ввиду PLL :)

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


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

дк, обязательно внешний генератор юзать чтоль?

и еще вопросик. есть код(для проверки работоспособности):

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

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


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

дк, обязательно внешний генератор юзать чтоль
Да

а после прошивки шаговый двигатель просто шагает безостановочно
Что написали, то он и делает.

Ответьте на простой вопрос - с какой скоростью он у вас шагает? Где задается частота переключения фаз ШД?

 

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


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

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

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


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

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

 

И вообще, почитайте какой нибудь букварь по HDL. HDL - это не С! Это язык описания аппаратуры, а не язык программирования

 

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


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

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

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

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

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

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

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

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

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

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