Проектування систем тестування програмних моделей обчислювальних пристроїв на мові VHDL

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
КНІТ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2016
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Комп ютерні методи високорівневого проектування систем захисту

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА Кафедра БІТ  Звіт до лабораторної роботи № 4 з дисципліни: «Комп’ютерні методи високорівневого проектування пристроїв захисту» на тему: «Проектування систем тестування програмних моделей обчислювальних пристроїв на мові VHDL» Львів - 2016 Мета роботи – вивчення реалізації процедур і функцій на мові VHDL, набуття практичних навичок використання засобів файлового введення-виведення в програмах на мові VHDL, вивчення принципів побудови систем тестування програмних моделей комп’ютерних пристроїв та набуття практичних навичок їх створення на мові VHDL. Теоретична частина Архітектура системи тестування програмних моделей комп’ютерних пристроїв Тестування програмних моделей комп’ютерних пристроїв виконується під час їх розроблення принаймні двічі – на етапі функціональної симуляції і на етапі часової симуляції. Більшість помилок, внесених під час їх проектування, виявляється на етапі функціональної симуляції. Відтестованою вважається та програмна модель, яка успішно пройшла функціональну і часову симуляцію. Для проведення тестування використовують спеціально розроблені системи тестування програмних моделей комп’ютерних пристроїв. Структура системи тестування в цілому залежить від специфіки конкретного тестованого пристрою, оскільки вона повинна, з одного боку, якомога повніше відображати реальне середовище роботи пристрою, а з іншого – забезпечувати можливість перевірки коректності його роботи у всіх можливих режимах. Як правило, для програмних моделей спеціалізованих пристроїв, що реалізують певні стандартизовані алгоритми, використовують стандартизовані тестові набори. Тестування кожної окремої моделі потребує застосування спеціально розробленої системи тестування з використанням специфічних тестових наборів. Структуру типової системи тестування програмних моделей комп’ютерних пристроїв представлено на Рис. 1. / Рис. 1. Структура типової системи тестування програмних моделей комп’ютерних пристроїв. На вхід тестованого пристрою подають вхідні тестові набори, результати обробки яких порівнюють із відповідними їм зразковими значеннями – вихідними тестовими наборами. Вказані тестові набори записують у текстових файлах, читання і запис яких виконують з використанням вище розглянутих конструктцій. Порівняння результатів обробки вхідних тестових наборів і зразкових значень виконує пристрій порівняння. Результат його роботи визначає коректність (чи некоректність) функціонування тестованого пристрою. Функції керування тестованим пристроєм та пристроєм порівняння виконує пристрій керування системою тестування. Сигнали синхронізації та початкового скиду системи зазвичай подають ззовні. Практична частина Програма на мові С, яка реалізує заданий у варіанті алгоритм шифрування using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace lab_4 { class Program { static void Main(string[] args) { string str; int k = System.IO.File.ReadAllLines("in.txt").Length; int[] inp = new int[k]; int[] key = new int[5]; key[0] = 0; key[1] = 0; key[2] = 0; key[3] = 0; key[4] = 0; int[] oup = new int[k]; System.IO.StreamReader infile = new System.IO.StreamReader("in.txt"); System.IO.StreamWriter outfile = new System.IO.StreamWriter("out.txt"); for (int i = 0; i < k; i++) { str = infile.ReadLine(); Console.WriteLine(str); if (str == "111") inp[i] = 7; if (str == "110") inp[i] = 6; if (str == "101") inp[i] = 5; if (str == "100") inp[i] = 4; if (str == "011") inp[i] = 3; if (str == "010") inp[i] = 2; if (str == "001") inp[i] = 1; if (str == "000") inp[i] = 0; Console.WriteLine(inp[i]); if (i < 5) oup[i] = (inp[i] + key[i]) % 8; else oup[i] = (inp[i] + inp[i - 5]) % 8; if (oup[i] == 7) outfile.WriteLine("111"); if (oup[i] == 6) outfile.WriteLine("110"); if (oup[i] == 5) outfile.WriteLine("101"); if (oup[i] == 4) outfile.WriteLine("100"); if (oup[i] == 3) outfile.WriteLine("011"); if (oup[i] == 2) outfile.WriteLine("010"); if (oup[i] == 1) outfile.WriteLine("001"); if (oup[i] == 0) outfile.WriteLine("000"); } outfile.Close(); Console.ReadLine(); } } } Тестові набори, що використовувались для перевірки правильності роботи цифрового пристрою / / Код програми, що реалізує мовою VHDL систему тестування програмних моделей комп’ютерних пристроїв Пристрій тестування LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE std.textio.ALL; USE ieee.std_logic_textio.ALL; ENTITY TestBench IS GENERIC ( tclk : time := 60 ns; -- період сигналу синхронізації input_file : string := "C:\in.txt"; -- файл із вхідними тестовими наборами zrazkovuy_output_file : string := "C:\out.txt" -- файл із вихідними тестовими наборами ); END TestBench; ARCHITECTURE Test OF TestBench IS Component vigener is port( data_in : IN STD_LOGIC_Vector (2 downto 0); key : IN STD_LOGIC_Vector (2 downto 0); switch : IN STD_LOGIC; g_c : IN Std_logic; g_r : IN Std_logic; data_out : OUT STD_LOGIC_Vector (2 downto 0) ); end component; SIGNAL rst : std_logic; -- загальний скид SIGNAL clk : std_logic; -- загальний сигнал синхронізації SIGNAL in_data_valid : std_logic; -- прапорець підтвердження вхідних даних SIGNAL in_data : std_logic_vector(2 DOWNTO 0); -- вхідні дані SIGNAL in_key : std_logic_vector(2 DOWNTO 0); -- вхідний ключ SIGNAL out_data : std_logic_vector(2 DOWNTO 0); -- вихідні дані SIGNAL out_data_valid : std_logic; -- прапорець підтвердження вихідних даних SIGNAL end_sim : boolean := false; signal switch : std_logic := '1'; SIGNAL res_tmp : std_logic_vector(2 DOWNTO 0) := "000"; -- вихідні дані BEGIN TestBench : vigener PORT MAP ( data_in => in_data, key => in_key, switch => switch, g_r => rst, g_c => clk, data_out => out_data ); rst_proc: PROCESS BEGIN rst <= '1'; -- активування сигналу скиду WAIT FOR tclk/4; -- очікування виконання скиду в пристрої rst <= '0'; -- деактивування сигналу скиду WAIT; -- сон END PROCESS rst_proc; -- генерування сигналу синхронізації до кінця симуляції clk_proc: PROCESS BEGIN IF end_sim = false THEN clk <= '0'; WAIT FOR tclk/2; ELSE WAIT; END IF; IF end_sim = false THEN clk <= '1'; WAIT FOR tclk/2; ELSE WAIT; END IF; END PROCESS clk_proc; -- читання даних з файлу і пересилання до тестованого пристрою data_read_proc: PROCESS FILE in_file : text IS input_file; -- файл із вхідними тестовими наборами VARIABLE iline : line; -- стрічка файлу VARIABLE in_tmp : std_logic_vector(2 DOWNTO 0); variable full_key : std_logic_vector(15 downto 1) := "000000000000000"; variable j : integer := 0; variable line_content : string(1 to 3); variable counter : integer := 1; --variable char : character:='0'; BEGIN IF rst = '1' THEN -- початкова ініціалізація вхідних сигналів in_data <= (OTHERS => '0'); in_key <= (OTHERS => '0'); in_data_valid <= '0'; switch <= '1'; -- після скиду ELSE -- зчитування всіх даних стрічка за стрічкою і передача до процесора read_file: WHILE NOT(endfile(in_file)) LOOP WAIT UNTIL clk = '0'; -- завантаження значення ключа при clk = 0 in_data_valid <= '0'; -- це не дані readline(in_file, iline); -- це не дані READ (iline,line_content); for j in 1 to 3 loop if(line_content(j) = '0') then in_data(3-j) <= '0'; else in_data(3-j) <= '1'; end if; end loop; if counter < 6 then in_key <= full_key(counter*3 downto (1 + (counter - 1)*3)); counter := counter +1; else switch <= '0'; end if; WAIT FOR tclk/8; -- деяка затримка in_data_valid <= '1'; -- це дійсні дані END LOOP read_file; IF endfile(in_file) THEN WAIT UNTIL clk = '0'; -- закінчення завантаження останнього -- блоку даних in_data_valid <= '0'; -- більше нема даних WAIT FOR 4*tclk; -- очікуємо на завершення шифрування -- і тестування end_sim <= true; -- кінець симуляції WAIT; END IF; END IF; END PROCESS data_read_proc; - порівняння вихідних даних процесора із зразковими даними з файлу compare_proc: PROCESS (clk, out_data) FILE res_file : text IS zrazkovuy_output_file; -- файл із зразковими даними VARIABLE i_line : line; -- стрічка файлу variable res_line_content : string(1 to 3); --VARIABLE res_tmp : std_logic_vector(2 DOWNTO 0); variable res_char : character:='0'; BEGIN -- порівнюємо дані коли out_data_valid is 1 і clk=0 IF clk'EVENT AND clk = '0' THEN -- IF out_data_valid = '1' THEN IF NOT(endfile(res_file)) THEN readline(res_file, i_line); -- читаємо зразок READ (i_line,res_line_content); for j in 1 to 3 loop res_char := res_line_content(j); if(res_char = '0') then res_tmp(3-j) <= '0'; else res_tmp(3-j) <= '1'; end if; end loop; IF res_tmp /= out_data THEN -- порівняння даних з файлу і з виходу процесора ASSERT false REPORT "ERROR IN DATA COMPARING!!! #" SEVERITY warning; ELSE ASSERT false REPORT "DATA COMPARED SUCCESFULL!!! #" SEVERITY note; END IF; END IF; END IF; END PROCESS compare_proc; END Test; Пристрій шифрування LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY vigener IS PORT( data_in : IN STD_LOGIC_Vector (2 downto 0); key : IN STD_LOGIC_Vector (2 downto 0); switch : IN STD_LOGIC; g_c : IN Std_logic; g_r : IN Std_logic; data_out : OUT STD_LOGIC_Vector (2 downto 0) ); END vigener; ARCHITECTURE vigen OF vigener IS Component RIV is port( clk_riv : in STD_LOGIC; reset_riv : in STD_LOGIC; D_riv : in STD_LOGIC_VECTOR(2 downto 0); Q_riv : out STD_LOGIC_VECTOR(2 downto 0) ); end component; Component RC is port( d : in STD_LOGIC; clk : in STD_LOGIC; reset : in STD_LOGIC; q : out STD_LOGIC ); end component; Component MS is port( D0 : in STD_LOGIC_vector (2 downto 0); D1 : in STD_LOGIC_vector (2 downto 0); A : in STD_LOGIC; Q : out STD_LOGIC_vector (2 downto 0) ); end component; Component SM IS port( x : IN STD_LOGIC_Vector (2 downto 0); y : IN STD_LOGIC_Vector (2 downto 0); p_in : IN STD_LOGIC; sumVector : OUT STD_LOGIC_Vector (2 downto 0); p_out : OUT STD_LOGIC ); end component; Component RS is port( clk : in STD_LOGIC; reset : in STD_LOGIC; D : in STD_LOGIC_VECTOR(2 downto 0); Q : out STD_LOGIC_VECTOR(2 downto 0) ); end component; signal rivToMs : std_logic_vector(2 downto 0); signal rcToMs : std_logic; signal msToSm : std_logic_vector(2 downto 0); signal smToRs : std_logic_vector(2 downto 0); signal bitPer : std_logic; signal out_data: std_logic_vector (2 downto 0); BEGIN v_riv:RIV port map ( clk_riv => g_c, reset_riv => g_r, D_riv => data_in, Q_riv => rivToMs ); v_rc:RC port map ( d => switch, clk => g_c, reset => g_r, q => rcToMs ); v_ms:MS port map ( D0 => rivToMs, D1 => key, A => rcToMs, Q => msToSm ); v_sm:SM port map ( x => data_in, y => msToSm, p_in => '0', sumVector => smToRs, p_out => bitPer ); v_rs:RS port map ( clk => g_c, reset => g_r, D => smToRs, Q => out_data ); data_out <= out_data; END vigen; Часові діаграми роботи системи тестування / Рис.2. Часова діаграма роботи системи тестування Висновки Під час виконання даної лабораторної роботі я ознайомилися з принципами створення структурних описів мовою VHDL та розробила функціональну модель системи тестування програмних моделей комп’ютерних пристроїв, а саме пристрою шифрування.
Антиботан аватар за замовчуванням

17.05.2017 16:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!