Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторних робіт №4-7
з дисципліни:
«Проектування комп'ютерних систем та мереж, частина 1»
Лабораторна робота №4
Мета: опанування технікою створення та використання софтконтролерів з архітектурою MIPS.
Хід роботи: Вікно програми XILINX WebPack після завантаження , перевірки та імплементації проекту має наступний вигляд (рис. 1):
Рис. 1 Вікно XILINX із завантаженим проектом.
Імплементована схема проекту має вигляд (рис 2):
Рис. 2 RTL-схема проекту.
Для перевірки правильності функціонування моделі потрібно створити тестовий файл:
…
clock <= not clock after 50ns;
reset <= '0' after 180ns;
…
Результат роботи цього файлу наведено на рисунку 3.
Рис. 3 Результат симуляції проекту.
Як видно з діаграми, значення програмного лічильника збільшується в кожному такті на 4, оскільки саме така ширина інструкції. Програмний лічильник – регістр що вказує на наступну команду у пам’яті. Отже, за результатами видно, що команди вибираються поступово, без переходів.
Лабораторна робота №5
Імплементування та дослідження VHDL моделі софтконтролера XILINX PicoBlaze
Мета роботи: опанування технікою створення і використання 8 бітових софтконтролерів з архітектурою Xilinx PicoBlaze.
Хід роботи:
Тестова програма для PicoBlaze:
Load s7, 01 ; init shifter reg
Output s7, 04
SL0 s7 ; rotate left
Jump NZ, 01
Jump 00
VHDL модель програмної пам’яті з тестовою програмою:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity demo_test is
port( address : in std_logic_vector(7 downto 0);
clk : in std_logic;
dout : out std_logic_vector(15 downto 0));
end;
architecture v1 of demo_test is
constant ROM_WIDTH: INTEGER:= 16;
constant ROM_LENGTH: INTEGER:= 256;
subtype rom_word is std_logic_vector(ROM_WIDTH-1 downto 0);
type rom_table is array (0 to ROM_LENGTH-1) of rom_word;
constant rom: rom_table := rom_table'(
"0000011100000001",
"1000111100000100",
"1010011100000110",
"1101010100000001",
"1101000000000000",
"0000000000000000",
"0000000000000000",
"0000000000000000",
…………………………………
"0000000000000000");
begin
process (clk)
begin
if clk'event and clk = '1' then
dout <= rom(conv_integer(address));
end if;
end process;
end v1;
Завантаження VHDL проекту до САПР
Рис. 1. Завантажений до WebPack VHDL проект софтконтролера Xilinx PicoBlaze
На рис. 1. Показано проектні джерельні файли, що утворюють ієрархію проекту. Тестбенч файлу містить автоматично задані нульові початкові значення вхідних сигналів. Зміни вхідних сигналів змінюються, а саме: на 10 нс сигнал скиду приймає значення 0 і припиняє свою дію; через кожні 15 нс рівень такту інвертується; отже такт має період 30 нс, відповідно частоту зміни 1/30нс =33 МГц.
Інтерфейс софтконтролера
Рис. 2. Інтерфейсні сигнали софтконтролера з архітектурою Xilinx PicoBlaze
На даному рисунку показано два вхідні сигнали: clk і reset, та чотири вихідні сигнали(output + три сигнали для контрольного спостереження на симуляційній часовій діаграмі: out_port_view – інформація, що виводиться на порт, port_id_view – номер порту, write_strobe_view – звернення до порту запису).
Рис. 3. Автоматично створена функційна (RTL) схема софтконтролера з архітектурою PicoBlaze
Симуляційна часова діаграма:
Рис. 4. Часова діаграма симуляційного виконання програмного коду
Лабораторна робота № 6
Імплементування та дослідження VHDL моделі софтконтролера XESS Gnome
Мета: опанування технікою створення і використання 4 бітового софтконтролера з архітектурою XESS Gnome.
Теоретичні відомості:
Рис. 1. Інтерфейсні сигнали софтконтролера з архітектурою Xilinx XESS Gnome
Праворуч розташовані два вхідні сигнали (clk, reset). Реалізовано не весь софтконтролер, а лише його ядро. Підсистеми введення/виведення немає. Її має додати студент. Всі вихідні сигнали розташовано праворуч. Присутність в назві сигналу слова view свідчить про те, що це є синал, трасу якого тз метою налаштування можна побачити на симуляційній часовій діаграмі. Перелічимо вихідні сигнали:
acc_view – вихід акумулятора;
addr_view – шина адреси;
data_view – шина даних;
ir_view – вихід регістра інструкцій;
pc_view – вихід програмного лічильника;
сarry_view – сигнал переносу;
sel_ram_view – сигнал вибору пам’яті даних (регістрового файлу);
we_view – сигнал дозволу запису до пам’яті даних.
Хід роботи:
Завантаження VHDL проекту XESS Gnome до САПР
Рис. 2. Завантажений до WebPack VHDL проект софтконтролера XESS Gnome
На рис. 2. подані проектні джерельні файли, що утворюють ієрархію проекту. В редакторі текстів показано фрагмент тестбенч файлу, що містить автоматично задані нульові початкові значення вхідних сигналів. Темним фоном виділено два рядки, що записані вручну і задають бажані зміни цих вхідних змінних, а саме: на 17 нс сигнал скиду приймає значення 0 і припиняє свою дію; через кожні 25 нс рівень такту інвертується; отже такт має період 50 нс, відповідно частоту зміни 1/50нс = 20 МГц.
Симуляційна часова діаграма виконання тестової програми
Рис. 3. Симуляційна діаграма виконання тестової програми ядром Gnome
На рис. 3. показано трасу зміни сигналу скиду, потім розташовано трасу такту. Далі йдуть траси всіх вихідних сигналів, що присутні в інтерфейсі ядра. Видно, що період такту складає 50 нс, частота тактування дорівнює 20МГц.
Функційна (RTL) схема софтконтролера
Рис. 4. Функційна (RTL) схема софтконтролера з архітектурою XESS Gnome
Лабораторна робота №7
Імплементування та дослідження софтконтролера з шиною wishbone
Мета: опанування технікою створення і використання машин на основі стандартної системної шини wishbone.
Завдання:
В САПР WebPack імплементувати до ПЛІС Virtex-II проект софтконролера “Micro8”, побудований на системній шині wishbone. Результат проектування верифікувати методом часової симуляції. Необхідними змінами в VHDL коді моделі забезпечити візуалізацію с подальшим аналізом часових діаграм циклів, що відбуваються на шині wishbone. Скласти звіт з проведених лабораторних досліджень і захистити його.
Теоретичні відомості:
Передусім розглянемо систему машинних інструкцій того варіанту софтконтролера Micro8, що розглядається в лабораторній роботі. Зауважимо, що відомі декілька модифікацій софтконтролера. Перший варіант софтконтролера мав наступні інструкції: ADD (додавання), NOR (логічного додавання з запереченням), STA та JCC (Jump on Carry, збереження акумулятора в пам’яті і умовний перехід за ознакою переносу). It had a singlecarry bit which was reset by the JCC instruction. При цьому більш складні машинні інструкції інших контролерів вдається запрограмувати кодами софтконтролера Micro8.
Зараз всі машинні інструкції мають наступний двохбайтовий формат.
Рис. 1. – Двохбайтовий формат інструкції процесора контролера Micro8
Старшу частину адреси (high) формують біти B2, B1 та B0 першого байту формату
машинної інструкції of the opcode, а молодші біти (low) адреси або безпосереднє значення (immediate value) задають біти від B7 до B0 другого байту формату. Отже, можна адресувати 2(3+8=11) × 1 byte = 2 KВ пам’яті, тоді як первинний варіант дозволяв адресування (шістьма бітами однобайтового формату інструкції) лише 26 = 64 байти пам’яті. До першого варіанту внесено наступні зміни:
Додано 8 бітовий індексний регістр.
Bit 7 визначає регістр, а саме: акумулятор А (коли В7=0) або індексний регістр Х (коли В7=1).
Чотири первинні інструкції залишилися без змін:
Додані чотири режими адресування (спочатку існував лише один режим
абсолютної адреси):
Додано 8 інструкцій умовного переходу (відносно програмного лічильника PC)
Далі ми розглянемо тестову програму, що виконує Micro8. Подамо текст програми, що “зашита” до програмної пам’яті мікроконтролера Micro8 та імплементується разом з мікроконтролером:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity boot_rom is
port (WB_ADR_I : in std_logic_vector(5 downto 0);
WB_DAT_O : out std_logic_vector(7 downto 0);
WB_STB_I : in std_logic;
WB_ACK_O : out std_logic);
end entity boot_rom;
architecture basic of boot_rom is
constant width : integer := 8;
constant memsize : integer := 64;
type rom_array is array(0 to memsize-1) of std_logic_vector(width-1 downto 0);
constant rom_data : rom_array :=
( «10100000″, «11111111″, — 0000 — a0 ff RESET NORX #$FF
«00100000″, «11111111″, — 0002 — 20 ff POLL1 NORA #$FF
«00001111″, «11111101″, — 0004 — 0f fd ADDA UARTCR
«00100000″, «11111110″, — 0006 — 20 fe NORA #not(TXBE)
«11101111″, «11111000″, — 0008 — ef f8 BNE POLL1
«00100000″, «11111111″, — 000a — 20 ff NORA #$FF
«00010000″, «00110000″, — 000c — 10 30 ADDA MSG,X
«01101000″, «00000110″, — 000e — 68 06 BEQ POLL2
«10000000″, «00000001″, — 0010 — 80 01 ADDX #1
«01001111″, «11111100″, — 0012 — 4f fc STA UARTDR
«11101111″, «11101100″, — 0014 — ef ec BNE POLL1
«00100000″, «11111111″, — 0016 — 20 ff POLL2 NORA #$FF
«00001111″, «11111101″, — 0018 — 0f fd ADDA UARTCR
«00100000″, «11111101″, — 001a — 20 fd NORA #not(RXBF)
«11101111″, «11111000″, — 001c — ef f8 BNE POLL2
«00100000″, «11111111″, — 001e — 20 ff NORA #$FF
«00001111″, «11111100″, — 0020 — 0f fc ADDA UARTDR
«01100111″, «11011100″, — 0022 — 67 dc BRA RESET
«00000000″, «00000000″, — 0024 — 00 00 fcb $00,$00
«00000000″, «00000000″, — 0026 - 00 00 fcb $00,$00
«00000000″, «00000000″, — 0028 — 00 00 fcb $00,$00
«00000000″, «00000000″, — 002a — 00 00 fcb $00,$00
«00000000″, «00000000″, — 002c — 00 00 fcb $00,$00
«00000000″, «00000000″, — 002e - 00 00 fcb $00,$00
«01001000″, «01100101″, «01101100″, — 0030 — 48 65 6c MSG FCC «Hel»
«01101100″, «01101111″, «00100000″, — 0033 — 6c 6f 20 FCC «lo «
«01010111″, «01101111″, «01110010″, — 0036 — 57 6f 72 FCC «Wor»
«01101100″, «01100100″, — 0039 — 6c 64 FCC «ld»
«00001010″, «00001101″, «00000000″, — 003b — 0a 0d 00 FCB LF,CR,NULL
«00000000″, «00000000″ — 003e — 00 00 fcb null,null);
begin
WB_DAT_O <= rom_data(conv_integer(WB_ADR_I));
WB_ACK_O <= WB_STB_I;
end architecture basic;
Проект Micro8 містить асинхронний приймач-передавач UART, що дозволяє в нашому випадку виводити з мікроконтролера послідовним асинхронним кодом повідомлення Hello World. Rx позначає приймач UART, на вхід якого ми в симуляції задамо рівень rxbit = ‘1’ (нема сигналу, тобто, пасивний стан входу). Послідовний код повідомлення hello World спостерігає на бітовому виході передавача Tx, який позначено через txbit. VHDL модель універсального асинхронного приймача-передавача містять файли miniUART.vhd (а це є локальний топ-файл вкладеного проекту), txunit.vhd, rxunit.vhd та utils.vhd. VHDL модель процесора містить файл cpu8bit2.vhd, а програму, що виконує процесор, містить файл bootrom.vhd. Зараз подамо копію вікна навігатора із завантаженим VHDL проектом Micro8. Цільова ПЛІС – Xilinx Virtex2 (40 тис. вентилів).
Рис. 2. Вікно навігатора з завантаженим проектом Micro8
Рис. 3. Інтерфейс мікроконтролера Micro8
В симуляціє на вхід rxbit треба подати одиницю, на вхід Reset_n (низькоактивний скид) на короткий час (декілька періодів тактових імпульсів, але не на ціле число їхнє число) треба подати нуль. На вхід SysClk треба подати тактові імпульси (в нас – частотою 10 МГц, період 100 нс). Вихідні сигнали треба спостерігати (на часових симуляційних діаграмах).
Маємо наступні вихідні сигнали:
· ram_address(16 : 0) є адресою зовнішньої щодо мікроконтролера пам’яті,
· led є вхідним сигналом зовнішнього світлодіода, що розташований на прототипній платі, засобами якою емулюють проект (в нас прототипної плати нема, сигнал можна не спостерігати),
· ram_cs є сигналом вибору кристала зовнішньої пам’яті,
· ram_wrin
· ram_wrun
· ram_data(7:0) є двохнаправленою шиною поміж ram та Micro8.
Подамо витяг із звіту про синтез проекту (мікростатистика витрат базових елементів ПЛІС). Звіт отримано по завершенню синтезу.
Рис. 4. Топологія мікроконтролера Micro8
Рис. 5. — Часова поведінка мікроконтролера Micro8 на початку виконання програми
Розглянемо VHDL модель пам’яті стартової програми, а ця модель ще містить код повідомлення Hello World, що виводиться на бітову лінію txbit передавача Tx вихідного каналу UART, що є в складі мікроконтролера.
Копію коду повідомлення Hello World подано нижче.
«01001000″, «01100101″, «01101100″, — 0030 — 48 65 6c MSG FCC «Hel«
«01101100″, «01101111″, «00100000″, — 0033 — 6c 6f 20 FCC «lo «
«01010111″, «01101111″, «01110010″, — 0036 — 57 6f 72 FCC «Wor«
«01101100″, «01100100″, — 0039 — 6c 64 FCC «ld«
«00001010″, «00001101″, «00000000″, — 003b — 0a 0d 00 FCB LF,CR,NULL
«00000000″, «00000000″ — 003e — 00 00 fcb null,null
Залишається пересвідчитися в тому, що поданий симуляційною часовою діаграмою код відповідає саме коду повідомленню Hello World.
Рис. 7. Cимуляційна часова діаграма виконання програми Hello World комп’ютера Micro8
Надамо пояснення щодо часової діаграми для перших двох символівHe повідомлення Hello World на виході txbit, яка від самого початку знаходиться в стані “1” (нема передачі в асинхронному послідовному інтерфейсі).
Рис. 8. Відповідний кодовій послідовності фрагмент симуляційної часової діаграми
Висновок: На даних лабораторних роботах я опанував техніку стаорення та використання софтконтролерів з архітектурою MIPS, Xilinx PicoBlaze та XESS Gnome. А також розглянув стандатрну шину wishbone.