Professional Documents
Culture Documents
ТПКС ЛР2.1
ТПКС ЛР2.1
ЗВІТ
про виконання лабораторної роботи № 2.1
з дисципліни: «Технології проектування комп’ютерних систем»
Київ 2020
Мета: визначення методів проектування послідовних пристроїв і їх реалізації
на мікросхемах програмованої логіки FPGA
Завдання: Спроектувати і реалізувати на мікросхемах програмованої логіки
FPGA модель пристрою згідно заданого варіанту.
При проектуванні і реалізації моделі:
Clk підключається до вбудованої синхронізації на платі.
NET "CLK_50MHZ" LOC = "C9" | IOSTANDARD = LVCMOS33 ;
Виходи до індикаторів:
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
Порядок виконання роботи
Лістинг лічильника
--підключення бібліотеки 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–моделі лічильника
Компіляція успішна!
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;
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;
Компіляція успішна!
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;
-- Оголошення сигналіва
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
);
Компіляція TestBench
Компіляція успішна!
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;
--початок архітектури
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;
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;
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;
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 En : STD_LOGIC;
begin
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;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY testbench IS
END testbench;
-- 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
);
END;
Перевірка синтаксу модуля:
Перевірка схеми:
Ієрархія VHDL-моделей в проекті
Отримуємо:
У вікні Design >> Hierarchy повинен з’явитися файл UCF:
В консолі:
Процеси Translate, Map та Place&Route в Implement Design завершено
успішно!
В консолі:
Отримуємо:
Натискаємо OK.
Вказуємо файл схеми counter8.bit: