Jump to content

    

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

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

 

ARM + LCD + Camera

Edited by Ivan Kuznetzov

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

Share this post


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

 

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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 двигатели не шагают. Условие на проверку направления работает.

Edited by stu

Share this post


Link to post
Share on other sites
дк, обязательно внешний генератор юзать чтоль
Да

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


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

 

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this