Подключаемся к PLC XC7A35TFGG484 в среде программирования Vivado, мигаем светодиодами.

В данном Уроке мы с Вами не вдаваясь в подробности языка программирования и нюансов настроек напишем свою первую программу, зальем ее и проверим как она работает. Работать мы будем с PLIC xc7a35tfgg484в среде программирования Vivado.
В наших уроках я буду использовать следующую плату:

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

После нажимаем Далее и вводим название проекта и путь где он будет хранится:
При нажатии далее, мы попадаем в следующее меню, где мы все оставляем без изменений:

В следующем меню мы выбираем тип микросхемы с которой будем работать:
У меня микросхема XC7A35tfgg484abx.
Дальше нажимаем далее два раза и перед нами откроется рабочее окно:

Для ознакомления и проверки что у нас все работает, мы напишем не большую программу для мигания светодиодами. Многие вещи по началу покажутся сложными или не понятными, мы все детали обсудим далее в других уроках. Сейчас у нас цель залить первый наш программный код и убедится, что все работает.
Для начало нам нужно создать файл, где будет у нас описываться логика роботы. Для этого выбираем Design Source и нажимаем плюсик:
Нажимаем далее и добавляем в проект новый исходник:
Вписываем свое название файла и нажимаем кнопку Ок. Дальше нажимаем кнопку Далее и Финиш. На этом этапе файл создан.
Открываем данный файл двойным нажатием на него и вставляем внутрь данный код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

library UNISIM;
use UNISIM.VComponents.all;

entity LED is  Port (
      led0 : out STD_LOGIC;
      led1 : out STD_LOGIC;
      led2 : out STD_LOGIC
);
end LED;

architecture Behavioral of LED is
      signal int_clk : STD_LOGIC;
      signal divider : unsigned(24 downto 0) := (others => ‘0’);
      signal state : unsigned(1 downto 0) := (others => ‘0’);

begin
— Внутренний генератор FPGA
STARTUPE2_inst : STARTUPE2
      port map (
                   CFGCLK => open,
                   CFGMCLK => int_clk,
                   EOS => open,
                   PREQ => open,
                  CLK => ‘0’,
                  GSR => ‘0’,
                  GTS => ‘0’,
                  KEYCLEARB => ‘1’,
                  PACK => ‘0’,
                  USRCCLKO => ‘0’,
                  USRCCLKTS => ‘1’,
                  USRDONEO => ‘1’,
                 USRDONETS => ‘1’
);

process(int_clk)
  begin
      if rising_edge(int_clk) then
          if divider = 16000000 then
              divider <= (others => ‘0’);
             if state = 2 then
                        state <= (others => ‘0’);
           else
                       state <= state + 1;
           end if;
        else
            divider <= divider + 1;
       end if;
  end if;
end process;

process(state)
  begin
      led0 <= ‘0’;
      led1 <= ‘0’;
      led2 <= ‘0’;

  case state is
          when «00» =>led0 <= ‘1’;
          when «01» =>led1 <= ‘1’;
          when «10» =>led2 <= ‘1’;
          when others =>null;
 end case;
end process;
end Behavioral;

Так как это нулевой урок, детально по коду мы пройдемся в следующих уроках. В данном коде мы использовали внутренний таймер для тактирования, он имеет очень плохую точность, но для проверки работы (мигание светодиодов) он нам подойдет. У нас 3 светодиода которые будут мигать по очереди.
Теперь необходимо привязать наши ножки в программе к физическим ножкам. Для этого мы нажимаем Run Sinthesis:

После окончания синтеза, мы можем перейти к нашим ножкам нажав Open Synthesized Design:

Если у Вас не появилось данное окно, проверьте, что Вы находитесь именно в режиме настроек ножек:

Дальше назначаем физические ножки в соответствии с ножками в программе:

На разъеме мои светодиоды сидят на J3:
led0 (C14) — 25N
led1 (F14) — 24P
led2 (F13) — 24N

Пока оставляете как у меня, если у Вас светодиоды сидят на других ножках — переназначьте их. Особенности настроек рассмотрим в следующих уроках.

Теперь нажмем Cntr+S , появится окно, в котором мы должны указать имя файла в котором у нас будут храниться наши настройки ножек:

После сохранения открываем наш файл:

Теперь пришло время открыть файл pinIO.xdc у Вас должно выйти следующее:

set_property PACKAGE_PIN C14 [get_ports led0]
set_property PACKAGE_PIN F14 [get_ports led1]
set_property PACKAGE_PIN F13 [get_ports led2]

set_property IOSTANDARD LVCMOS33 [get_ports led0]
set_property IOSTANDARD LVCMOS33 [get_ports led1]
set_property IOSTANDARD LVCMOS33 [get_ports led2]

# Quad SPI Flash
set_property CONFIG_MODE SPIx4 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]

Строчку # Quad SPI Flash мы дописали вручную, так как у нас на плате есть Flash и мы в ней будем хранить наш программный код.

Дальше мы запускаем снова Run Synthesis по окончанию процессу запускаем Run Inplementation и дожидаемся окончания процесса.
И теперь мы можем нажать кнопку Generate Bitstream, дожидаемся окончания процесса. Если у Вас все прошло благополучно, открываем Open Hardware Manager, подключаем нашу плату до программатора и подаем на не питания. После данных действий нажимаем Open Target:

Если у Вас все подключено верно, наша плата должна увидеться:
Дальше выбираем режим программирование нашего устройства:

Дальше указываем месторасположение нашего файла (обычно он по умолчанию сам добавляется):
И наша программа автоматически заливается. Нам остается только подключить светодиоды к выбранным ножкам и увидеть их мигание.

Но если Вы сейчас снимите питание и снова подадите — у Вас программа не сохраниться, мы залили программу во временную память, где можно проверить как она работает и если, что то пошло не так — можно снять питание и старая программа восстановится. 
Как сохранить программу во Flash памяти рассмотрим в следующем уроке.