You are on page 1of 40

Міністерство освіти та науки України

НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ


Факультет кібербезпеки, комп’ютерної та програмної інженерії

ЗВІТ
про виконання лабораторної роботи № 2.1
з дисципліни: «Технології проектування комп’ютерних систем»

тема роботи: «Реалізація послідовних пристроїв»

Роботу виконала: студентка


групи КС-433
Старостенко А.О.
Роботу перевірила:
Яковенко Л.В.

Київ 2020
Мета: визначення методів проектування послідовних пристроїв і їх реалізації
на мікросхемах програмованої логіки FPGA
Завдання: Спроектувати і реалізувати на мікросхемах програмованої логіки
FPGA модель пристрою згідно заданого варіанту.
При проектуванні і реалізації моделі:
Clk підключається до вбудованої синхронізації на платі.
NET "CLK_50MHZ" LOC = "C9" | IOSTANDARD = LVCMOS33 ;

Скидання rst, напрям зсуву чи рахунку, En до кнопок:


NET "BTN_EAST" LOC = "H13" | IOSTANDARD = LVTTL | PULLDOWN ;
NET "BTN_NORTH" LOC = "V4" | IOSTANDARD = LVTTL | PULLDOWN ;
NET "BTN_SOUTH" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN ;
NET "BTN_WEST" LOC = "D18" | IOSTANDARD = LVTTL | PULLDOWN ;

Виходи до індикаторів:
NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW
| DRIVE= 8 ;
NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW
| DRIVE= 8 ;
NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW
|DRIVE = 8 ;
NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW
|DRIVE = 8 ;
NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW
|DRIVE = 8 ;
NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW
|DRIVE = 8 ;
NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW
|DRIVE = 8 ;
NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW
|DRIVE = 8 ;

Варіант: 13
Тип
Шаг Кер. сигнал Сброс та установка Розрядність
синхронізації
Асинхроний з
+3, -2 En, Up Задній фронт 8
установкой в 11..1
Порядок виконання роботи

1. Створити проект в середовищі Active-HDL.


2. Відповідно до варіанту завдання розробити модель пристрою (регістра або
лічильника).
3. Протестувати роботу регістра / лічильника за допомогою вікна Waveform,
задавати тестові набори через стимулятори.
Використовувати для входу:
- синхронізації - Clock,
- для скидання - Formula (наприклад, 1 0, 0 10 ns),
- для En - Value (константне значення 1),
- для сигналу керування напрямком зсуву (реєстр) або рахунку (лічильник) -
Hotkey. (Вибирається кнопка, яка потім використовується для перемикання
значення сигналу в процесі
моделювання.)
4. Створити VHDL-модель Антибрязкіткової схеми, модель верхнього рівня,
що об’єднує обидва компонента. Виконати його верифікацію за допомогою
TestBench.
5. Створити проект в середовищі ISE WebPack. Підключити код регістру.
Створити VHDL-модель Антибрязкіткової схеми, модель верхнього рівня, що
об’єднує обидва компонента.
Для з’єднання портів пристрою з зовнішніми контактами мікросхеми створити
файл USF.
Хід роботи

1. Створення VHDL-моделі реверсивного лічильника з асинхронним сбросом

2.1.Створення нового файлу VHDL

Обираємо в Design Browser пункт Add New File. У відкришимся вікні у


вкладці Wizards обираємо VHDL Source Code:

Задаємо наступні налаштування:


1.2. Прописуємо VHDL-модель лічильника на мові VHDL

Лістинг лічильника
--підключення бібліотеки IEEE
library IEEE;
--підключення пакетів бібліотеке IEEE
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;

--entity
entity arcount is
--ініціалізація вхідних/вихідних портів
port(
CLK : in std_logic;--вхід синхронізації
R : in std_logic;--асинхроний сброс
En : in std_logic;--вхід дозволу розрахунку
Up : in std_logic;--вхід заданого направлення розрахунку
--вихід
res_out : out std_logic_vector (7 downto 0)
);
end arcount;
--architecture
architecture arcount_arch of arcount is
signal res : std_logic_vector(7 downto 0);

--початок архітектури
begin
--реверсивний лічильник з асинхроним сбросом
process(CLK, R)
--буферна зміна
variable buf : integer;
--початок процесу
begin
--Якщо сброс R true, то
if(R = '0') then
res <= (others => '1'); --виконуємо сброс
--Якщо задній фронт синхроімпульсу
elsif (CLK'EVENT and CLK='0') then
--Перевірка дозволу на розрахунок
if(En = '1') then
--Якщо Up true
if ( Up = '0') then
--Шаг +3
buf := 3;
-- Up false
else
--Шаг -2
buf := -2;
end if;
-- Додаємо шаг
res <= res + buf;
end if;
end if;
--Змінення вихідного стану лічильника
res_out <= res;
end process;
end arcount_arch;
Компіляція VHDL–моделі лічильника

Компіляція успішна!

2. Тестування роботи лічильника за допомоги вікна Waveform


Задаємо тестові набори через стимулятори:
Моделювання реверсивного лічильника з асинхронним сбросом
3. Створення VHDL–моделі Антибрязкіткової схеми
Лістинг Антибрязкіткової схеми
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY debounce IS
GENERIC(
clk_freq : INTEGER := 50_000_000; --system clock frequency in Hz
stable_time : INTEGER := 10); --time button must remain stable in ms
PORT(
CLK : IN STD_LOGIC; --input clock
R : IN STD_LOGIC; --asynchronous active low reset
button : IN STD_LOGIC; --input signal to be debounced
En : OUT STD_LOGIC); --debounced signal
END debounce;

ARCHITECTURE logic OF debounce IS


SIGNAL flipflops : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops
SIGNAL counter_set : STD_LOGIC; --sync reset to zero
BEGIN

counter_set <= flipflops(0) xor flipflops(1); -- determine when


-- to start/reset counter

PROCESS(CLK, R)
--counter for timing
VARIABLE count : INTEGER RANGE 0 TO clk_freq*stable_time/1000;
BEGIN
IF(R = '0') THEN --reset
flipflops(1 DOWNTO 0) <= "00"; --clear input flipflops
En <= '0'; --clear result register
ELSIF(CLK'EVENT and CLK = '0') THEN --rising clock edge
flipflops(0) <= button; --store button value in 1st flipflop
flipflops(1) <= flipflops(0); --store 1st flipflop value in 2nd flipflop
If(counter_set = '1') THEN --reset counter because input is changing
count := 0; --clear the counter
--stable input time is not yet met
ELSIF(count < clk_freq*stable_time/1000) THEN
count := count + 1; --increment counter
ELSE --stable input time is met
En <= flipflops(1); --output the stable value
END IF;
END IF;
END PROCESS;
END logic;

Компіляція Антибрязкітної схеми

Компіляція успішна!

Модуляція Антибрязкітної схеми

Задаємо тестові набори:


Часова діаграма Антибрязкітної схеми
4. Схема реверсивного лічильника з антибрязкітною схемою на вході
управління

5. Створення TestBench
Лістинг Test Bench
library ieee;
use ieee.std_logic_1164.all;

entity count_tb is
end count_tb;

architecture tb of count_tb is
-- I/O порти лічильника
component arcount
port(
CLK : in STD_LOGIC;
R : in STD_LOGIC;
En : in STD_LOGIC;
Up : in STD_LOGIC;
res_out : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;

-- I/O порти Антибрязкітної схеми


component debounce
generic(
clk_freq : INTEGER := 50000000;
stable_time : INTEGER := 10
);
port(
CLK : in STD_LOGIC;
R : in STD_LOGIC;
button : in STD_LOGIC;
En : out STD_LOGIC
);
end component;

-- Оголошення сигналіва
signal Up : std_logic;
signal CLK : std_logic;
signal R : std_logic;
signal button : std_logic;
signal res_out : std_logic_vector (7 downto 0);
signal En : STD_LOGIC; -- керуючий сигнал лічильника

-- початок архітектури
begin
-- Підключення лічильника для тестування
Counter : arcount -- оператор реалізації компонента
port map(
CLK => CLK,
R => R,
En => En,
Up => Up,
res_out => res_out
);

-- Підключення для тестування Антибрязкітної схеми


U1 : debounce -- оператор реалізації компонента
port map(
CLK => CLK,
R => R,
button => button,
En => En
);

-- Формування тестової послідовності


stimuli : process
begin
Up <= '0', '1' after 20ns, '1' after 25ns, '0' after 40ns, '1' after
55ns, '0' after 75ns, '1' after 100ns;
CLK <= '1', '0' after 10ns, '1' after 15ns, '0' after 20ns, '1' after
25ns, '0' after 30ns, '1' after 35ns, '0' after 40ns, '1' after 45ns, '0' after 50ns,
'1' after 55ns, '0' after 60ns, '1' after 65ns, '0' after 70ns, '1' after 75ns, '0'
after 80ns, '1' after 85ns, '0' after 90ns, '1' after 95ns, '0' after 100ns, '1'
after 105ns, '0' after 120ns;
R <= '0', '1' after 5ns, '0' after 115ns;
button <= '0', '1' after 10ns, '0' after 30ns, '1' after 50ns, '0' after
70ns, '1' after 110ns;
wait;
end process;
end tb;

Компіляція TestBench

Компіляція успішна!

Часова діаграма TestBench


6. Робота в середовище ISE WebPack
6.1. Створення проекту
Обираємо File >> New Project та задаємо наступні налаштування:
6.2. Створення VHDL–моделі лічильника
Обираємо в меню Project >> New Source. У відкришимся вікні обираємо тип
модуля VHDL Module та задаємо назву. Далі задаємо входи та виходи.

Результат створення нового модуля:


Лістинг лічильника
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;

entity arcount is
Port ( CLK : in STD_LOGIC;
R : in STD_LOGIC;
En : in STD_LOGIC;
Up : in STD_LOGIC;
res_out : out STD_LOGIC_VECTOR (7 downto 0));
end arcount;

architecture arcount_arch of arcount is

signal res : std_logic_vector(7 downto 0);

--початок архітектури
begin
--реверсивний лічильник з асинхроним сбросом
process(CLK, R)
--буферна зміна
variable buf : integer;
--початок процесу
begin
--Якщо сброс R true, то
if(R = '0') then
res <= (others => '1'); --виконуємо сброс
--Якщо задній фронт синхроімпульсу
elsif (CLK'EVENT and CLK='0') then
--Перевірка дозволу на розрахунок
if(En = '1') then
--Якщо Up true
if ( Up = '0') then
--Шаг +3
buf := 3;
-- Up false
else
--Шаг -2
buf := -2;
end if;
-- Додаємо шаг
res <= res + buf;
end if;
end if;
--Змінення вихідного стану лічильника
res_out <= res;
end process;

end arcount_arch;

Перевірка синтаксу та створення символів для модуля:

6.3. Створення VHDL–моделі Антибрязкітної схеми


Обираємо в меню Project >> New Source. У відкришимся вікні обираємо тип
модуля VHDL Module та задаємо назву. Далі задаємо входи та виходи.
Результат створення нового модуля:

Лістинг Антибрязкіткової схеми


LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY debounce IS
GENERIC(
clk_freq : INTEGER := 50_000_000; --system clock frequency in Hz
stable_time : INTEGER := 10); --time button must remain stable in ms
PORT(
CLK : IN STD_LOGIC; --input clock
R : IN STD_LOGIC; --asynchronous active low reset
button : IN STD_LOGIC; --input signal to be debounced
En : OUT STD_LOGIC); --debounced signal
END debounce;

ARCHITECTURE logic OF debounce IS


SIGNAL flipflops : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops
SIGNAL counter_set : STD_LOGIC; --sync reset to zero
BEGIN

counter_set <= flipflops(0) xor flipflops(1); -- determine when


-- to start/reset counter
PROCESS(CLK, R)
--counter for timing
VARIABLE count : INTEGER RANGE 0 TO clk_freq*stable_time/1000;
BEGIN
IF(R = '0') THEN --reset
flipflops(1 DOWNTO 0) <= "00"; --clear input flipflops
En <= '0'; --clear result register
ELSIF(CLK'EVENT and CLK = '0') THEN --rising clock edge
flipflops(0) <= button; --store button value in 1st flipflop
flipflops(1) <= flipflops(0); --store 1st flipflop value in 2nd flipflop
If(counter_set = '1') THEN --reset counter because input is changing
count := 0; --clear the counter
--stable input time is not yet met
ELSIF(count < clk_freq*stable_time/1000) THEN
count := count + 1; --increment counter
ELSE --stable input time is met
En <= flipflops(1); --output the stable value
END IF;
END IF;
END PROCESS;
END logic;

Перевірка синтаксу та створення символів для модуля:


6.3. Створення VHDL–моделі схеми лічильника з антибрязкітної схеми
Обираємо в меню Project >> New Source. У відкришимся вікні обираємо тип
модуля VHDL Module та задаємо назву. Далі задаємо входи та виходи.

Результат створення нового модуля:


Лістинг схеми
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity count is
Port ( Up : in STD_LOGIC;
CLK : in STD_LOGIC;
R : in STD_LOGIC;
button : in STD_LOGIC;
res_out : out STD_LOGIC_VECTOR (7 downto 0));
end count;

architecture Behavioral of count is

---- Component declarations -----

component arcount
port(
CLK : in STD_LOGIC;
R : in STD_LOGIC;
En : in STD_LOGIC;
Up : in STD_LOGIC;
res_out : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component debounce
generic(
clk_freq : INTEGER := 50000000;
stable_time : INTEGER := 10
);
port(
CLK : in STD_LOGIC;
R : in STD_LOGIC;
button : in STD_LOGIC;
En : out STD_LOGIC
);
end component;

---- Signal declarations used on the diagram ----

signal En : STD_LOGIC;
begin

---- Component instantiations ----

Counter : arcount
port map(
CLK => CLK,
R => R,
En => En,
Up => Up,
res_out => res_out
);

Debounch : debounce
port map(
CLK => CLK,
R => R,
button => button,
En => En
);

end Behavioral;

Перевірка синтаксу та створення символів для модуля:


6.4. Створення TestBench
Обираємо в меню Project >> New Source. У відкришимся вікні обираємо тип
модуля VHDL Test Bench та задаємо назву:

Далі обираємо модуль з яким зв’язати тест:


Результат створення тесту:

Отримуємо шаблон TestBench:


Лістинг TestBench
-- TestBench Template

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY testbench IS
END testbench;

ARCHITECTURE behavior OF testbench IS

-- Component Declaration

component arcount
port(
CLK : in STD_LOGIC;
R : in STD_LOGIC;
En : in STD_LOGIC;
Up : in STD_LOGIC;
res_out : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;

component debounce
generic(
clk_freq : INTEGER := 50000000;
stable_time : INTEGER := 10
);
port(
CLK : in STD_LOGIC;
R : in STD_LOGIC;
button : in STD_LOGIC;
En : out STD_LOGIC
);
end component;

signal Up : std_logic;
signal CLK : std_logic;
signal R : std_logic;
signal button : std_logic;
signal res_out : std_logic_vector (7 downto 0);
signal En : STD_LOGIC;

begin
-- Components Instantiation
Counter : arcount
port map(
CLK => CLK,
R => R,
En => En,
Up => Up,
res_out => res_out
);

Debounch : debounce
port map(
CLK => CLK,
R => R,
button => button,
En => En
);

-- Test Bench Statements


tb : process
begin
wait for 100 ns; -- wait until global set/reset completes
Up <= '0', '1' after 20ns, '1' after 25ns, '0' after 40ns, '1' after 55ns,
'0' after 75ns, '1' after 100ns;
CLK <= '1', '0' after 10ns, '1' after 15ns, '0' after 20ns, '1' after
25ns, '0' after 30ns, '1' after 35ns, '0' after 40ns, '1' after 45ns, '0' after 50ns,
'1' after 55ns, '0' after 60ns, '1' after 65ns, '0' after 70ns, '1' after 75ns, '0'
after 80ns, '1' after 85ns, '0' after 90ns, '1' after 95ns, '0' after 100ns, '1' after
105ns, '0' after 120ns;
R <= '0', '1' after 5ns, '0' after 115ns;
button <= '0', '1' after 10ns, '0' after 30ns, '1' after 50ns, '0' after
70ns, '1' after 110ns;
wait; -- will wait forever
end process tb;
-- End Test Bench

END;
Перевірка синтаксу модуля:

Для запуску симуляції в дереві проекту Design >> Simulation обираємо


Simulate Behavioral Model.
Вікно симулятора ISim

Симуляція VHDL-моделі лічильника з атибрязкітковою схемою


6.5. Побудова схеми VHDL-моделі лічильника з атибрязкітковою схемою
Обираємо в меню Project >> New Source. У відкришимся вікні обираємо тип
модуля Schematic та задаємо назву:

Cхема VHDL-моделі лічильника з атибрязкітковою схемою

Перевірка схеми:
Ієрархія VHDL-моделей в проекті

6.6. Змінюємо властивості проекту

Тут треба змінити Top-Level Source Type з HDL на Schematic.


Отримуємо наступну ієрархію VHDL-моделей в проекті:

Запускаємо синтакстис схеми обравши Synthesize-XST:

Процес завершено успішно!


6.7. Виконаємо присвоєння виводів портам
У вікні Processes обираємо User Constraints та програму I/O Pin Planning
(PlanAhead) – Post-Synthesis:

З’являється вікно, яке пропонує створити автоматичний файл UCF.


Натискаємо Yes.
З’являється PlanAhead:

Розгортаємо вікно I/O Ports:

Отримуємо:
У вікні Design >> Hierarchy повинен з’явитися файл UCF:

6.8. У вікні Design >> Processes запускаємо Implement Design (Реалізація


розробки):

В консолі:
Процеси Translate, Map та Place&Route в Implement Design завершено
успішно!

6.9. Запускаємо процес Generate Programming File:


Процес завершено успішно!

6.10. Запускаємо процес Configure Target Device:

В консолі:

З’являється вікно ISE IMPACT:


У вікні iMPACT Flows обираємо Create PROM File:

Далі у вікні PROM File Formatter:

Отримуємо:

Натискаємо OK.
Вказуємо файл схеми counter8.bit:

Далі у вікні iMPACT Processess натискаємо Generate File…


Отримуємо повідомлення про успішну генерацію:

Зберігаємо побудований iMPACT Project:

You might also like