Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Sbornik_PLIS

.pdf
Скачиваний:
23
Добавлен:
05.01.2023
Размер:
5.21 Mб
Скачать

ПРИЛОЖЕНИЕ 3.1

Листинг файла counter1.vhd

--------------------------------------------------------------------------

--Company:

--Engineer:

--Create Date: 14:17:43 04/30/2013

--Design Name:

--Module Name: counter1 - Behavioral

--Project Name:

--Target Devices:

--Tool versions:

--Description:

--

--Dependencies:

--Revision:

--Revision 0.01 - File Created

--Additional Comments:

--

--------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

--Uncomment the following library declaration if using

--arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL;

--Uncomment the following library declaration if instantiating

--any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity counter1 is

Port ( clk : in STD_LOGIC; clk_out : out STD_LOGIC);

end counter1;

architecture Behavioral of counter1 is

begin process(clk)

variable counter: integer := 0; variable flag: boolean := False; begin

if clk'event and clk = '1' then if counter = 50000000 then

counter := 0; flag := not flag;

else

counter := counter + 1; end if;

if flag = True then clk_out <= '1';

else

clk_out <= '0'; end if;

end if;

end process;

end Behavioral;

51

Листинг файла counter2.vhd

--------------------------------------------------------------------------

--Company:

--Engineer:

--Create Date: 14:34:23 04/30/2013

--Design Name:

--Module Name: counter2 - Behavioral

--Project Name:

--Target Devices:

--Tool versions:

--Description:

--

--Dependencies:

--Revision:

--Revision 0.01 - File Created

--Additional Comments:

--

--------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

--Uncomment the following library declaration if using

--arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL;

--Uncomment the following library declaration if instantiating

--any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity counter2 is

Port ( clk : in STD_LOGIC; clk_out : out STD_LOGIC);

end counter2;

architecture Behavioral of counter2 is

begin process(clk)

variable counter: integer := 0; variable flag: boolean := False; begin

if clk'event and clk = '1' then if counter = 25000000 then

counter := 0; flag := not flag;

else

counter := counter + 1; end if;

if flag = True then clk_out <= '1';

else

clk_out <= '0'; end if;

end if;

end process;

end Behavioral;

52

Листинг файла to_leds.vhd

--------------------------------------------------------------------------

--Company:

--Engineer:

--Create Date: 14:36:35 04/30/2013

--Design Name:

--Module Name: to_leds - Behavioral

--Project Name:

--Target Devices:

--Tool versions:

--Description:

--

--Dependencies:

--Revision:

--Revision 0.01 - File Created

--Additional Comments:

--

--------------------------------------------------------------------------

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 using

--arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL;

--Uncomment the following library declaration if instantiating

--any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity to_leds is

Port ( clk : in STD_LOGIC; btn_res : in STD_LOGIC;

led : out STD_LOGIC_VECTOR (7 downto 0)); end to_leds;

architecture Behavioral of to_leds is

begin

process(clk, btn_res)

variable cnt: STD_LOGIC_VECTOR (7 downto 0) := "00000000"; begin

if clk'event and clk = '1' then

if cnt = (cnt'range => '1') or btn_res = '0' then cnt := "00000000";

else

cnt := cnt + 1; end if;

led <= cnt; end if;

end process;

end Behavioral;

53

ЛАБОРАТОРНАЯ РАБОТА №4

1. Цель работы.

Целью работы является ознакомление с внешним видом проекта, созданным полностью на языке описания аппаратуры VHDL.

Домашнее задание:

2.Задания для выполнения лабораторной работы

2.1Предварительная подготовка к выполнению лабораторной работы

1.Изучить описание к данной лабораторной работе и рекомендованную литературу.

2.Ознакомиться с принципом работы универсального асинхронного при-

емопередатчика (Universal Asynchronous Receiver-Transmitter (UART))

3.Подготовить ответы на контрольные вопросы, приведенные в данном описании лабораторной работы.

4.Подготовить письменный отчет принятой на кафедре формы. Отчет должен содержать:

-титульный лист принятой на кафедре формы;

-номера лабораторной работы, варианта работы и формулировку цели работы;

-исходные данные выполняемого варианта;

-домашний расчет;

-результат выполнения работы;

-краткие выводы по работе.

2.2Выполнение исследований в лаборатории

Разделы выполнения лабораторной работы:

2.2.1.Создание проекта

2.2.2.Добавление и изменение источников VHDL

2.2.3.Вывод информации на компьютер.

Отладочная плата Atlys Spartan-6 оснащена интерфейсом универсального асинхронного приемопередатчика (UART), порт которого обозначен как J17

(Рис. 4.1).

Рис. 4.1. Порт UARTна плате Atlys Spartan-6

54

В данной работе будет задействована только передающая часть интерфейса от платы к компьютеру. Проект является модифицированной версией демонстрационного проекта для работы с GPIO периферией.

2.2.1 Создание проекта

Создание нового проекта нужно выполнить по пункту 2.2.1, но в настройках мастера нового проекта нужно выбрать файл верхнего уровня HDL (Рис.

4.2)

Рис. 4.2. Настройки нового проекта.

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

2.2.2 Добавление и изменение источников VHDL

В этой работе не будут создаваться новые файлы. Нужно добавить уже готовые VHDL файлы в этот проект.

Для этого нужно кликнуть правой кнопкой в свободной областе

«Hierarchy» и выбрать «Add Source» (Рис. 4.3.).

55

Рис. 4.3. Добавление готовых файлов-источников

И добавить следующие файлы: UART_TX_CTRL.vhd, GPIO_demo.vhd, btn_debounce.vhd и pins.ucf.

В появившемся окне (Рис. 4.4)убедиться, что нет ошибок и нажать «OK».

Рис. 4.4. Окно мастера импорта файлов в проект

После импорта в окне иерархии появится уже готовая к созданию конфигурационного файла иерархия (Рис. 4.5.).

56

Рис. 4.5. Иерархия проекта

В данной работе допускается изменения алгоритма работы. Все изменения должны касаться только файла верхнего уровня GPIO_demo.vhd, именно там содержится алгоритм работы. (Файл UART_TX_CTRL.vhd содержит описание работы интерфейса UART; файл btn_debounce.vhd отвечает за исправления явления дребезга контактов для кнопок и файл pins.ucf отвечает за связь с контактами отладочной платы)

Итак, какие строки кода интересны в данном проекте:

with BTN(4)select

LED <= SW when '0',

"00000000"when others;

Данные строки посылают своё состояние на светодиоды всегда, когда не нажата кнопка BTN(4), а когда она нажата – передает 0 на все светодиоды («гасит» их).

btn_reg_process : process (CLK) begin

if (rising_edge(CLK)) then

btnReg <= btnDeBnc(3 downto 0); end if;

end process;

Этот процесс btn_reg_process выполняет функцию избавления от дребезга контактов (иными словами выполняет файл btn_debounce.vhd).

string_load_process : process (CLK)

Процесс string_load_process выполняет одну из главных задач этого проекта – загрузку строк, которые отправляются на передачу. Рассмотрим его более подробно, построчно:

variable STR0 : CHAR_ARRAY(0 to 7) := (X"20", X"20", X"20", X"20", X"20", X"20",

57

X"20",

X"20");

variable STR1 : CHAR_ARRAY(0 to 1) := (X"20", X"20");

Эти две переменные типа CHAR_ARRAY (это пользовательский тип данных, он объявлен вверху файла и представляет собой 8-битный вектор) являются двумя строками, каждые значения которых собой представляют 8- битный вектор.

Строки STR0 и STR1заполнены символами «пробела» X"20" (Так как UART принимает данные в виде 8 бит и интерпретирует их в виде ASCII кода, то и значения, которыми мы оперируем, представляют соответственно

ASCII код).

begin

if (rising_edge(CLK)) then

if (uartState = LD_INIT_STR) then ind := 0;

while ind < 8 loop

if SW(ind) = '0' then

STR0(ind):= std_logic_vector(to_unsigned(character'pos('0'), 8));

elsif SW(ind) = '1' then

STR0(ind):= std_logic_vector(to_unsigned(character'pos('1'), 8));

end if;

ind := ind + 1; end loop;

sendStr <= STR0; strEnd <= 8;

Дальше на каждом цикле тактового счетчика, если состояние UART определено как LD_INIT_STR (т.е. нажата центральная кнопка на плате), то запускается цикл из 8 итераций, в каждой из которых считывается состояние соответствующего переключателя и в соответствующее место строки записывается 8-битное значение ASCIIкода «0» или «1». И строка отправляется на передачу.

elsif (uartState = LD_BTN_STR) then sendStr(0 to 1) <= STR1; strEnd <= 2;

end if; end if;

end process;

Если состояние UART определено как LD_BTN_STR (т.е. нажата любая из четырех оставшихся кнопок), то на передачу отправляются только два 8- битных значения строки STR1, которые содержат в себе ASCII значение символа «пробел».

Сохраните все изменения и успешно создайте конфигурационный файл (Пункт 1.4), а после загрузите его в отладочную плату (Пункт 1.5)

2.2.3. Вывод информации на компьютер

58

После конфигурирования платы не отключая питаниянужно вытащить кабель«плата-компьютер» из разъема PROG и подключить к разъему UART

(Рис. 4.1)

После подключения к разъему UART нужно запустить терминал Tera Term

В настройках подключения выбрать Serial и порт, отвечающий за подключенную плату (Рис. 4.6)

Рис. 4.6 Настройки терминала Tera Term

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

Рис 4.7. Пример комбинации переключателей

И после, нажав центральную кнопку в терминале должно высветиться следующее (Рис. 4.8):

59

Рис 4.8. Вывод информации в Tera Term

Это значит, что всё работает так, как и планировалось.

Можно изменить код проекта и попробовать новые функции или другой вывод информации.

3. Методические указания

Одной из важнейших задач проектирования микропроцессорных систем (МПС) является организация взаимодействия с устройствами ввода-вывода (УВВ) – источниками и приемниками данных. Устройства ввода-вывода различаются: разрядностью данных; быстродействием; управляющими сигналами; типом протокола, т.е. определенным порядком обмена.

Данные в УВВ изменяются в произвольный или определенный момент времени.

Соединение УВВ с системной шиной МПС осуществляется с помощью интерфейса ввода/вывода, который согласовывает сигналы УВВ с системной шиной МПС.

Как правило, интерфейс состоит из одного или нескольких портов ввода/вывода и схем управления ими. При проектировании интерфейса ввода/вывода необходимо обеспечить: хранение информации, поступающей от УВВ; доступ к информации со стороны микропроцессора; управление обменом; преобразование форматов данных.

Последовательный интерфейс использует одну сигнальную линию для передачи данных, по которой биты информации передаются друг за другом последовательно. При последовательной передаче сокращается количество сигнальных линий, что упрощает разводку проводников на печатной плате, уменьшает габариты устройства и позволяет делать более помехозащищенные интерфейсы. При последовательной передаче каждый информационный бит должен сопровождаться импульсом синхронизации — стробом. Если импульсы синхронизации передаются от одного устройства к другому по выде-

60

Соседние файлы в предмете Микропроцессорные устройства