В данном Уроке мы с Вами не вдаваясь в подробности языка программирования и нюансов настроек напишем свою первую программу, зальем ее и проверим как она работает. Работать мы будем с 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 памяти рассмотрим в следующем уроке.