Розроблення VHDL-опису та синтез елементів пристроїв для зашифрування інформації
Ключі ki генеруються з початкового ключа k (64 біт = 8 байтів або 8 символів в ASCII) таким чином. Вісім бітів, що знаходять в позиціях 8, 16, 24, 32, 40, 48, 56, 64 додаються в ключ k таким чином щоб кожен байт містив непарне число одиниць. Це використовується для виявлення помилок при обміні і зберіганні ключів. Потім роблять перестановку для розширеного ключа (окрім бітів, що додаються, 8, 16… Читати ще >
Розроблення VHDL-опису та синтез елементів пристроїв для зашифрування інформації (реферат, курсова, диплом, контрольна)
Зміст
- ЗАВДАННЯ
- 1. Теоретичні відомості
- 1.1 Опис алгоритму шифрування
- 1.2 Схема шифрування алгоритм DES
- 1.3 Початкова перестановка
- 1.4 Цикли шифрування
- 1.5 Основна функція шифрування (функція Фейстеля)
- 1.6 Генерування ключів ki
- 1.7 Кінцева перестановка
- 2. Розроблення поведінкового опису пристрою
- 2.1 Розроблення структурного опису пристрою
- Висновки
- Список використаної літератури
ЗАВДАННЯ
шифрування програма алгоритм
Відповідно до НЗК (номера залікової книжки) розробити VHDL-програму опису заданого пристрою (шифратора або його частини). В програмі передбачити поведінковий та структурний опис пристрою. За розробленою програмою синтезувати заданий пристрій.
Таблиця 1. Тип шифру
НЗК | Тип шифру | |
Парний | Афінний | |
Непарний | DES | |
Таблиця 2. Варіанти афінного шифру
a mod 10 | |||||||||||
Лінійний афінний шифр і - го порядку | х | х | х | х | х | ||||||
Узагальнений афінний шифр і - го порядку | х | х | х | х | х | ||||||
Таблиця 3. Варіанти елементів шифру DES
a mod 10 | |||||||||||
Генератор підключів раундів | х | х | х | х | х | ||||||
Блок підстановки в S-блоках | х | х | х | х | х | ||||||
Примітки:
Ш, а — число, що визначається двома останніми цифрами НЗК;
Ш і - остання цифра НЗК при і>1;
Ш і = 10 — якщо остання цифра НЗК нуль;
Ш і = 11 — якщо остання цифра НЗК одиниця.
Номер залікової книжки: 809 003
a = 03;
3 mod 10 = 3
Номер залікової книжки є непарний, отже потрібно розробити програму опису шифратора, що реалізує підстановку в S — блоках шифру DES.
1. Теоретичні відомості
1.1 Опис алгоритму шифрування
DES (Data Encryption Standard) — симетричний алгоритм шифрування, розроблений фірмою IBM і затверджений урядом США в 1977 році, як офіційний стандарт (FIPS 46−3). DES має блоки по 64 біта і 16 циклову структуру Фейстеля, для шифрування використовується ключ довжиною 56 біт. Алгоритм використовує комбінацію нелінійних (S-блоки) і лінійних (перестановки E, IP, IP-1) перетворень.
1.2 Схема шифрування алгоритм DES
Процес шифрування полягає в початковій перестановці, 16 циклах шифрування і кінцевій перестановці.
1.3 Початкова перестановка
Початковий текст T (блок 64 біт) перетворюється за допомогою початкової перестановки IP яка визначається таблицею:
По таблиці перші 3 біта результуючого блоку IP (T) після початкової перестановки IP є бітами 58, 50, 42 вхідного блоку Т, а його 3 останні біта є бітами 23, 15, 7 вхідного блоку.
1.4 Цикли шифрування
Отриманий після початкової перестановки 64-бітний блок ІР (Т) використовується в 16-циклах перетворення Фейстеля.
Розбити ІР (Т) на дві частини L0, R0, де L0, R0 — відповідно 32 старших біта і 32 молодших біта блока T0 IP (T) = L0R0
Нехай Ti?1 = Li?1Ri?1 результат (i-1) ітерації, тоді результат i-ої ітерації Ti = LiRi визначається:
Li=Ri?1
Ліва половина Li рівна правій половині попереднього вектора Li?1Ri?1.
А права половина Ri — це бітове множення Li?1 і f (Ri?1,ki) по модулю 2.
В 16-циклах перетворення Фейстеля функція f відіграє роль шифрування.
1.5 Основна функція шифрування (функція Фейстеля)
Аргументами функції f є 32-бітний вектор Ri-1 і 48-бітний ключ ki, які є результатом перетворення 56-бітного початкового ключа шифру k.
Для обчислення функції f використовується функція розширення Е, перетворення S, що складається з 8 перетворень S-блоків S1, S2, S3, …, S8, і перестановка P.
Функція Е розширює 32-бітний вектор Ri-1 до 48-бітного вектора E (Ri-1), шляхом дублювання деяких бітів з Ri-1; при цьому порядок бітів вектора E (Ri-1) вказаний в таблиці(функція розширення):
Перші три біта вектора E (Ri-1) є бітами 32, 1, 2 вектора Ri-1. По таблиці видно, що біти 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29, 32 дублюються. Останні 3 біта вектора E (Ri-1) — це біти 31, 32, 1 вектора Ri-1. Отриманий після перестановки блок E (Ri-1) складається по модулю 2 з ключами ki і потім представляється у вигляді восьми послідовних блоків B1, B2, …, B8.
E (Ri-1)=B1B2…B8
Кожний Bj є 6-бітним блоком. Далі кожен з блоків Bj трансформується в 4-бітовий блок B’j за допомогою перетворень Sj. Перетворення Sj визначається наступною таблицею:
S1 | ||||||||||||||||||
S2 | ||||||||||||||||||
S3 | ||||||||||||||||||
S4 | ||||||||||||||||||
S5 | ||||||||||||||||||
S6 | ||||||||||||||||||
S7 | ||||||||||||||||||
S8 | ||||||||||||||||||
Припустимо, що B3 = 101 111, і ми хочемо знайти B'3. Перший і останній розряди B3 є двійковим записом числа а, 0<=a<=3, середні 4 розряди представляють число b, 0<=b<=15. Рядки таблиці S3 нумеруються від 0 до 3, стовпці таблиці S3 нумеруються від 0 до 15. Пара чисел (а, b) визначає число, що знаходиться в перетині рядка, а і стовпця b. Двійкове представлення цього числа дає B'3. У нашому випадку, а = 112 = 3, b = 1 112 = 7, а число, визначуване парою (3,7), рівне 7. Його двійкове представлення B'3=0111.
Значення функції f (Ri-1,ki) (32 біт) утворюється перестановкою Р, застосовуючись до 32-бітового блоку B'1B'2…B'8. Перестановка Р задана таблицею перестановки Р:
f (Ri-1,ki)=P (B'1B'2…B'8)
Згідно таблиці, перші чотири біта результуючого вектора після дії функції f це біти 16, 7, 20, 21 вектора B'1B'2…B'8.
1.6 Генерування ключів ki.
Ключі ki генеруються з початкового ключа k (64 біт = 8 байтів або 8 символів в ASCII) таким чином. Вісім бітів, що знаходять в позиціях 8, 16, 24, 32, 40, 48, 56, 64 додаються в ключ k таким чином щоб кожен байт містив непарне число одиниць. Це використовується для виявлення помилок при обміні і зберіганні ключів. Потім роблять перестановку для розширеного ключа (окрім бітів, що додаються, 8, 16, 24, 32, 40, 48, 56, 64). Така перестановка визначена як в наступній таблиці:
C0 | |||||||||||||||
D0 | |||||||||||||||
Ця перестановка визначається двома блоками C0 і D0 по 28 біт кожен. Перші 3 біта C0 є біти 57, 49, 41 розширеного ключа. А перші три біта D0 є біти 63, 55, 47 розширеного ключа. Ci, Di i=1,2,3… получаються з Ci-1, Di-1 одним або двома лівими циклічними зсувами згідно таблиці:
і | |||||||||||||||||
Число зсуву | |||||||||||||||||
Ключ ki, i=1,…16 складається з 48 біт, вибраних з бітів вектора CiDi (56 біт) згідно таблиці поданої нижче. Перший і другий біти ki є біти 14, 17 вектора CiDi
1.7 Кінцева перестановка
Кінцева перестановка IP -1 діє на T16 і використовується для відновлення позиції. Вона є зворотньою до перестановки IP. Кінцева перестановка визначається таблицею:
1.8 Схема розшифрування
При розшифруванні даних всі дії виконуються в зворотному порядку. В 16 циклах розшифрування, на відміну від шифрування за допомогою прямого перетворення Фейстеля, тут використовується зворотне перетворення Фейстеля.
Ri-1=Li
Ключ ki, i=1,…, 16, функція f, перестановка IP і IP -1 такі ж як і в процесі шифрування.
Переглянувши принцип функціонування алгоритма DES можна приступити до реалізації завдання по підстановці S — блоків.
2. Розроблення поведінкового опису пристрою
library IEEE;
use IEEE. STD_LOGIC_1164.all;
entity S_Matrix is
port (i:in STD_LOGIC_VECTOR (0 to 5); o: out STD_LOGIC_VECTOR (0 to 3));
end S_Matrix;
architecture S1 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 0″ |" 100″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 010″ |
" 11″ |" 1 001″ |" 1 101″ |" 10 001″ |" 10 101″ |" 10 111″ |" 11 001″ |" 11 111″ |
" 100 100″ |" 100 110″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 010″ |
" 100 001″ |" 100 011″ |" 100 101″ |" 101 011″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 0″ |" 10″ |" 100″ |" 1 010″ |" 10 100″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 11″ |" 101″ |" 111″ |" 1 001″ |" 1 101″ |" 10 011″ |" 10 101″ |" 11 011″ |
" 100 000″ |" 100 100″ |" 101 000″ |" 101 010″ |" 110 000″ |" 110 010″ |" 110 110″ |" 111 100″ |
" 100 001″ |" 100 011″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 111″ |" 111 101″ |" 111 111″ ,
'0' when others;
with i select
o (2) <= '1' when
" 0″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 010″ |" 10 100″ |" 11 110″ |
" 11″ |" 101″ |" 1 001″ |" 1 011″ |" 10 001″ |" 10 011″ |" 10 111″ |" 11 101″ |
" 100 100″ |" 101 010″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 000″ |" 111 010″ |
" 100 001″ |" 100 111″ |" 101 111″ |" 110 011″ |" 110 101″ |" 110 111″ |" 111 001″ |" 111 101″ ,
'0' when others;
with i select
o (3) <= '1' when
" 100″ |" 110″ |" 1 010″ |" 1 100″ |" 10 000″ |" 11 000″ |" 11 010″ |" 11 110″ |
" 11″ |" 101″ |" 1 101″ |" 1 111″ |" 10 111″ |" 11 001″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 000″ |" 111 100″ |
" 100 001″ |" 101 011″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 111″ ,
'0' when others;
end S1;
architecture S2 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 010″ |" 10 000″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 11″ |" 1 001″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 100 110″ |" 101 000″ |" 101 100″ |" 110 010″ |" 110 100″ |" 111 000″ |" 111 110″ |
" 100 001″ |" 100 011″ |" 100 101″ |" 101 011″ |" 110 001″ |" 110 111″ |" 111 101″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 11″ |" 101″ |" 111″ |" 1 001″ |" 1 111″ |" 10 001″ |" 11 001″ |" 11 111″ |
" 100 010″ |" 100 100″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 110″ |
" 100 001″ |" 101 011″ |" 101 101″ |" 110 011″ |" 110 101″ |" 110 111″ |" 111 011″ |" 111 101″ ,
'0' when others;
with i select
o (2) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 010″ |" 10 100″ |" 11 110″ |
" 1″ |" 111″ |" 1 001″ |" 1 011″ |" 1 111″ |" 10 111″ |" 11 001″ |" 11 101″ |
" 100 010″ |" 100 100″ |" 100 110″ |" 101 000″ |" 110 110″ |" 111 010″ |" 111 100″ |" 111 110″ |
" 100 101″ |" 101 001″ |" 101 011″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 101″ ,
'0' when others;
with i select
o (3) <= '1' when
" 0″ |" 10″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 010″ |" 10 110″ |" 11 100″ |
" 1″ |" 11″ |" 111″ |" 1 001″ |" 10 101″ |" 11 011″ |" 11 101″ |" 11 111″ |
" 100 100″ |" 100 110″ |" 101 100″ |" 101 110″ |" 110 000″ |" 111 000″ |" 111 010″ |" 111 110″ |
" 100 001″ |" 100 111″ |" 101 001″ |" 101 011″ |" 110 001″ |" 110 101″ |" 111 011″ |" 111 111″ ,
'0' when others;
end S2;
architecture S3 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 100″ |" 10 010″ |" 10 100″ |" 11 000″ |" 11 110″ |
" 1″ |" 111″ |" 1 111″ |" 10 011″ |" 10 111″ |" 11 001″ |" 11 011″ |" 11 101″ |
" 100 000″ |" 100 110″ |" 101 000″ |" 101 010″ |" 110 000″ |" 110 110″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 100 101″ |" 101 011″ |" 101 101″ |" 110 011″ |" 110 101″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 110″ |" 1 000″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 100″ |" 10 110″ |" 11 010″ |
" 1″ |" 11″ |" 1 011″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 001″ |" 11 101″ |
" 100 000″ |" 100 010″ |" 100 100″ |" 101 010″ |" 110 110″ |" 111 000″ |" 111 100″ |" 111 110″ |
" 100 101″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 011″ |" 111 111″ ,
'0' when others;
with i select
o (2) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 11″ |" 1 001″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 111 010″ |" 111 100″ |" 111 110″ |
" 100 011″ |" 101 001″ |" 101 111″ |" 110 011″ |" 110 101″ |" 110 111″ |" 111 001″ |" 111 101″ ,
'0' when others;
with i select
o (3) <= '1' when
" 100″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 000″ |" 10 010″ |" 10 110″ |" 11 000″ |
" 1″ |" 11″ |" 111″ |" 1 001″ |" 10 101″ |" 11 011″ |" 11 101″ |" 11 111″ |
" 100 000″ |" 100 110″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 010″ |" 111 000″ |" 111 110″ |
" 100 001″ |" 100 101″ |" 101 011″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 011″ ,
'0' when others;
end S3;
architecture S4 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 10″ |" 100″ |" 1 100″ |" 1 110″ |" 10 100″ |" 11 000″ |" 11 010″ |" 11 110″ |
" 1″ |" 11″ |" 101″ |" 1 011″ |" 10 111″ |" 11 011″ |" 11 101″ |" 11 111″ |
" 100 000″ |" 100 100″ |" 101 000″ |" 101 010″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 100″ |
" 100 011″ |" 101 001″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 0″ |" 10″ |" 100″ |" 1 010″ |" 10 110″ |" 11 010″ |" 11 100″ |" 11 110″ |
" 1″ |" 111″ |" 1 001″ |" 1 011″ |" 10 001″ |" 10 011″ |" 10 111″ |" 11 101″ |
" 100 010″ |" 101 000″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 000″ |" 111 110″ |
" 100 011″ |" 100 111″ |" 101 101″ |" 110 011″ |" 110 101″ |" 111 001″ |" 111 011″ |" 111 111″ ,
'0' when others;
with i select
o (2) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 010″ |" 1 110″ |" 10 010″ |" 11 000″ |" 11 110″ |
" 101″ |" 1 001″ |" 1 011″ |" 1 111″ |" 10 011″ |" 10 101″ |" 11 011″ |" 11 101″ |
" 100 000″ |" 100 010″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 010″ |
" 100 001″ |" 100 011″ |" 100 111″ |" 101 001″ |" 110 111″ |" 111 011″ |" 111 101″ |" 111 111″ ,
'0' when others;
with i select
o (3) <= '1' when
" 0″ |" 10″ |" 110″ |" 1 100″ |" 10 000″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 1″ |" 101″ |" 111″ |" 1 011″ |" 1 111″ |" 10 011″ |" 11 001″ |" 11 111″ |
" 100 100″ |" 101 010″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 000″ |
" 100 001″ |" 100 011″ |" 101 011″ |" 101 101″ |" 110 001″ |" 110 101″ |" 110 111″ |" 111 011″ ,
'0' when others;
end S4;
architecture S5 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 10″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 110″ |" 11 000″ |" 11 100″ |" 11 110″ |
" 1″ |" 11″ |" 111″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 110″ |" 101 000″ |" 101 010″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 110″ |
" 100 001″ |" 100 011″ |" 100 101″ |" 101 011″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 001″ ,
'0' when others;
with i select
o (1) <= '1' when
" 10″ |" 100″ |" 1 000″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 1″ |" 111″ |" 1 001″ |" 1 011″ |" 1 101″ |" 10 001″ |" 10 101″ |" 11 111″ |
" 100 000″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 000″ |" 111 110″ |
" 100 101″ |" 100 111″ |" 101 011″ |" 101 111″ |" 110 001″ |" 110 011″ |" 111 011″ |" 111 101″ ,
'0' when others;
with i select
o (2) <= '1' when
" 0″ |" 1 000″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 100″ |" 10 110″ |" 11 100″ |
" 1″ |" 11″ |" 101″ |" 1 011″ |" 10 101″ |" 10 111″ |" 11 001″ |" 11 111″ |
" 100 010″ |" 100 110″ |" 101 000″ |" 101 100″ |" 110 000″ |" 111 000″ |" 111 010″ |" 111 110″ |
" 100 001″ |" 100 111″ |" 101 011″ |" 101 101″ |" 110 001″ |" 110 011″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (3) <= '1' when
" 110″ |" 1 000″ |" 1 100″ |" 10 010″ |" 10 100″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 11″ |" 1 011″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 101″ |" 11 001″ |" 11 011″ |
" 100 100″ |" 100 110″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 010″ |" 110 110″ |" 111 010″ |
" 100 001″ |" 100 111″ |" 101 001″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 101″ |" 111 111″ ,
'0' when others;
end S5;
architecture S6 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 000″ |" 1 110″ |" 10 010″ |" 11 000″ |" 11 110″ |
" 1″ |" 11″ |" 1 011″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 111″ |
" 100 000″ |" 100 010″ |" 100 100″ |" 101 010″ |" 101 100″ |" 110 110″ |" 111 010″ |" 111 100″ |
" 100 111″ |" 101 001″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 111 101″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 0″ |" 110″ |" 1 100″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 010″ |" 11 100″ |
" 11″ |" 101″ |" 1 001″ |" 1 011″ |" 1 111″ |" 10 001″ |" 10 101″ |" 10 111″ |
" 100 010″ |" 100 100″ |" 100 110″ |" 101 100″ |" 110 000″ |" 110 100″ |" 111 010″ |" 111 110″ |
" 100 001″ |" 100 111″ |" 101 011″ |" 101 101″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (2) <= '1' when
" 100″ |" 110″ |" 1 010″ |" 1 100″ |" 10 100″ |" 11 000″ |" 11 010″ |" 11 110″ |
" 1″ |" 11″ |" 111″ |" 1 001″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 100 100″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 100″ |" 111 110″ |
" 100 011″ |" 100 101″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 111″ |" 111 001″ ,
'0' when others;
with i select
o (3) <= '1' when
" 10″ |" 110″ |" 1 000″ |" 10 010″ |" 10 100″ |" 11 010″ |" 11 100″ |" 11 110″ |
" 11″ |" 1 001″ |" 1 101″ |" 1 111″ |" 10 011″ |" 10 101″ |" 11 011″ |" 11 101″ |
" 100 000″ |" 100 100″ |" 100 110″ |" 101 110″ |" 110 000″ |" 111 000″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 101 001″ |" 101 011″ |" 101 101″ |" 110 001″ |" 110 101″ |" 110 111″ |" 111 111″ ,
'0' when others;
end S6;
architecture S7 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 10″ |" 110″ |" 1 000″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 100″ |" 11 010″ |
" 1″ |" 101″ |" 1 011″ |" 1 111″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 100″ |" 100 110″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 110″ |" 111 100″ |
" 100 011″ |" 100 101″ |" 100 111″ |" 101 101″ |" 110 001″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 1″ |" 111″ |" 1 001″ |" 10 001″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 111″ |
" 100 010″ |" 100 110″ |" 101 000″ |" 101 100″ |" 101 110″ |" 110 010″ |" 110 100″ |" 111 010″ |
" 100 001″ |" 100 101″ |" 101 011″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with i select
o (2) <= '1' when
" 10″ |" 100″ |" 110″ |" 1 000″ |" 10 000″ |" 10 110″ |" 11 010″ |" 11 100″ |
" 101″ |" 111″ |" 1 111″ |" 10 001″ |" 10 011″ |" 11 001″ |" 11 011″ |" 11 111″ |
" 100 100″ |" 101 010″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 110″ |
" 100 001″ |" 100 011″ |" 101 101″ |" 101 111″ |" 110 111″ |" 111 001″ |" 111 011″ |" 111 101″ ,
'0' when others;
with i select
o (3) <= '1' when
" 10″ |" 1 000″ |" 1 110″ |" 10 000″ |" 10 100″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 1″ |" 101″ |" 111″ |" 1 011″ |" 1 101″ |" 10 011″ |" 10 101″ |" 11 011″ |
" 100 000″ |" 100 100″ |" 100 110″ |" 101 010″ |" 101 100″ |" 110 010″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 100 101″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 111″ |" 111 101″ ,
'0' when others;
end S7;
architecture S8 of S_Matrix is
begin
with i select
o (0) <= '1' when
" 0″ |" 100″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 010″ |" 10 110″ |" 11 100″ |
" 11″ |" 101″ |" 111″ |" 1 001″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 101 000″ |" 101 010″ |" 101 100″ |" 110 100″ |" 110 110″ |" 111 000″ |" 111 110″ |
" 100 101″ |" 101 011″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 111″ ,
'0' when others;
with i select
o (1) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 010″ |" 10 110″ |" 11 000″ |" 11 100″ |" 11 110″ |
" 11″ |" 101″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 011″ |" 10 101″ |" 11 011″ |
" 100 000″ |" 100 100″ |" 101 010″ |" 101 100″ |" 110 010″ |" 110 110″ |" 111 000″ |" 111 100″ |
" 100 101″ |" 100 111″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 011″ |" 111 011″ |" 111 101″ ,
'0' when others;
with i select
o (2) <= '1' when
" 10″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 100″ |" 10 110″ |" 11 110″ |
" 11″ |" 1 001″ |" 1 011″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 111″ |
" 100 000″ |" 100 010″ |" 101 100″ |" 101 110″ |" 110 010″ |" 110 100″ |" 111 000″ |" 111 010″ |
" 100 001″ |" 100 101″ |" 100 111″ |" 101 011″ |" 110 001″ |" 111 001″ |" 111 101″ |" 111 111″ ,
'0' when others;
with i select
o (3) <= '1' when
" 0″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 100″ |" 11 000″ |" 11 110″ |
" 1″ |" 11″ |" 101″ |" 1 011″ |" 1 101″ |" 10 011″ |" 10 111″ |" 11 101″ |
" 100 000″ |" 100 010″ |" 100 110″ |" 101 000″ |" 110 110″ |" 111 000″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 100 111″ |" 101 111″ |" 110 001″ |" 110 101″ |" 111 001″ |" 111 011″ |" 111 111″ ,
'0' when others;
end S8;
Список ідентифікаторів
Назва ідентифікатора | Значення ідентифікатора | |
і | Вхідний вектор довжиною 6 біт, який використовується для підстановки в S-блоках. | |
о | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в S-блоці. | |
2.1 Розроблення структурного опису пристрою
Код бібліотеки:
library ieee;
use ieee. std_logic_1164.all;
package my_func is
component S1
port (in1: in STD_LOGIC_VECTOR (0 to 5); out1: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S2
port (in2: in STD_LOGIC_VECTOR (0 to 5); out2: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S3
port (in3: in STD_LOGIC_VECTOR (0 to 5); out3: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S4
port (in4: in STD_LOGIC_VECTOR (0 to 5); out4: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S5
port (in5: in STD_LOGIC_VECTOR (0 to 5); out5: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S6
port (in6: in STD_LOGIC_VECTOR (0 to 5); out6: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S7
port (in7: in STD_LOGIC_VECTOR (0 to 5); out7: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S8
port (in8: in STD_LOGIC_VECTOR (0 to 5); out8: out STD_LOGIC_VECTOR (0 to 3));
end component;
end package my_func;
—Тіло пакету.
package body my_func is
end package body my_func;
library ieee;
use ieee. std_logic_1164.all;
entity S1 is
port (in1: in STD_LOGIC_VECTOR (0 to 5); out1: out STD_LOGIC_VECTOR (0 to 3));
end S1;
architecture model_S1 of S1 is
begin
with in1 select
out1(0) <= '1' when
" 0″ |" 100″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 010″ |
" 11″ |" 1 001″ |" 1 101″ |" 10 001″ |" 10 101″ |" 10 111″ |" 11 001″ |" 11 111″ |
" 100 100″ |" 100 110″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 010″ |
" 100 001″ |" 100 011″ |" 100 101″ |" 101 011″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in1 select
out1(1) <= '1' when
" 0″ |" 10″ |" 100″ |" 1 010″ |" 10 100″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 11″ |" 101″ |" 111″ |" 1 001″ |" 1 101″ |" 10 011″ |" 10 101″ |" 11 011″ |
" 100 000″ |" 100 100″ |" 101 000″ |" 101 010″ |" 110 000″ |" 110 010″ |" 110 110″ |" 111 100″ |
" 100 001″ |" 100 011″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 111″ |" 111 101″ |" 111 111″ ,
'0' when others;
with in1 select
out1(2) <= '1' when
" 0″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 010″ |" 10 100″ |" 11 110″ |
" 11″ |" 101″ |" 1 001″ |" 1 011″ |" 10 001″ |" 10 011″ |" 10 111″ |" 11 101″ |
" 100 100″ |" 101 010″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 000″ |" 111 010″ |
" 100 001″ |" 100 111″ |" 101 111″ |" 110 011″ |" 110 101″ |" 110 111″ |" 111 001″ |" 111 101″ ,
'0' when others;
with in1 select
out1(3) <= '1' when
" 100″ |" 110″ |" 1 010″ |" 1 100″ |" 10 000″ |" 11 000″ |" 11 010″ |" 11 110″ |
" 11″ |" 101″ |" 1 101″ |" 1 111″ |" 10 111″ |" 11 001″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 000″ |" 111 100″ |
" 100 001″ |" 101 011″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 111″ ,
'0' when others;
end model_S1;
library ieee;
use ieee. std_logic_1164.all;
entity S2 is
port (in2: in STD_LOGIC_VECTOR (0 to 5); out2: out STD_LOGIC_VECTOR (0 to 3));
end S2;
architecture model_S2 of S2 is
begin
with in2 select
out2(0) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 010″ |" 10 000″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 11″ |" 1 001″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 100 110″ |" 101 000″ |" 101 100″ |" 110 010″ |" 110 100″ |" 111 000″ |" 111 110″ |
" 100 001″ |" 100 011″ |" 100 101″ |" 101 011″ |" 110 001″ |" 110 111″ |" 111 101″ |" 111 111″ ,
'0' when others;
with in2 select
out2(1) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 11″ |" 101″ |" 111″ |" 1 001″ |" 1 111″ |" 10 001″ |" 11 001″ |" 11 111″ |
" 100 010″ |" 100 100″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 110″ |
" 100 001″ |" 101 011″ |" 101 101″ |" 110 011″ |" 110 101″ |" 110 111″ |" 111 011″ |" 111 101″ ,
'0' when others;
with in2 select
out2(2) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 010″ |" 10 100″ |" 11 110″ |
" 1″ |" 111″ |" 1 001″ |" 1 011″ |" 1 111″ |" 10 111″ |" 11 001″ |" 11 101″ |
" 100 010″ |" 100 100″ |" 100 110″ |" 101 000″ |" 110 110″ |" 111 010″ |" 111 100″ |" 111 110″ |
" 100 101″ |" 101 001″ |" 101 011″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 101″ ,
'0' when others;
with in2 select
out2(3) <= '1' when
" 0″ |" 10″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 010″ |" 10 110″ |" 11 100″ |
" 1″ |" 11″ |" 111″ |" 1 001″ |" 10 101″ |" 11 011″ |" 11 101″ |" 11 111″ |
" 100 100″ |" 100 110″ |" 101 100″ |" 101 110″ |" 110 000″ |" 111 000″ |" 111 010″ |" 111 110″ |
" 100 001″ |" 100 111″ |" 101 001″ |" 101 011″ |" 110 001″ |" 110 101″ |" 111 011″ |" 111 111″ ,
'0' when others;
end model_S2;
library ieee;
use ieee. std_logic_1164.all;
entity S3 is
port (in3: in STD_LOGIC_VECTOR (0 to 5); out3: out STD_LOGIC_VECTOR (0 to 3));
end S3;
architecture model_S3 of S3 is
begin
with in3 select
out3(0) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 100″ |" 10 010″ |" 10 100″ |" 11 000″ |" 11 110″ |
" 1″ |" 111″ |" 1 111″ |" 10 011″ |" 10 111″ |" 11 001″ |" 11 011″ |" 11 101″ |
" 100 000″ |" 100 110″ |" 101 000″ |" 101 010″ |" 110 000″ |" 110 110″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 100 101″ |" 101 011″ |" 101 101″ |" 110 011″ |" 110 101″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in3 select
out3(1) <= '1' when
" 110″ |" 1 000″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 100″ |" 10 110″ |" 11 010″ |
" 1″ |" 11″ |" 1 011″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 001″ |" 11 101″ |
" 100 000″ |" 100 010″ |" 100 100″ |" 101 010″ |" 110 110″ |" 111 000″ |" 111 100″ |" 111 110″ |
" 100 101″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 011″ |" 111 111″ ,
'0' when others;
with in3 select
out3(2) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 11″ |" 1 001″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 111 010″ |" 111 100″ |" 111 110″ |
" 100 011″ |" 101 001″ |" 101 111″ |" 110 011″ |" 110 101″ |" 110 111″ |" 111 001″ |" 111 101″ ,
'0' when others;
with in3 select
out3(3) <= '1' when
" 100″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 000″ |" 10 010″ |" 10 110″ |" 11 000″ |
" 1″ |" 11″ |" 111″ |" 1 001″ |" 10 101″ |" 11 011″ |" 11 101″ |" 11 111″ |
" 100 000″ |" 100 110″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 010″ |" 111 000″ |" 111 110″ |
" 100 001″ |" 100 101″ |" 101 011″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 011″ ,
'0' when others;
end model_S3;
library ieee;
use ieee. std_logic_1164.all;
entity S4 is
port (in4: in STD_LOGIC_VECTOR (0 to 5); out4: out STD_LOGIC_VECTOR (0 to 3));
end S4;
architecture model_S4 of S4 is
begin
with in4 select
out4(0) <= '1' when
" 10″ |" 100″ |" 1 100″ |" 1 110″ |" 10 100″ |" 11 000″ |" 11 010″ |" 11 110″ |
" 1″ |" 11″ |" 101″ |" 1 011″ |" 10 111″ |" 11 011″ |" 11 101″ |" 11 111″ |
" 100 000″ |" 100 100″ |" 101 000″ |" 101 010″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 100″ |
" 100 011″ |" 101 001″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in4 select
out4(1) <= '1' when
" 0″ |" 10″ |" 100″ |" 1 010″ |" 10 110″ |" 11 010″ |" 11 100″ |" 11 110″ |
" 1″ |" 111″ |" 1 001″ |" 1 011″ |" 10 001″ |" 10 011″ |" 10 111″ |" 11 101″ |
" 100 010″ |" 101 000″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 000″ |" 111 110″ |
" 100 011″ |" 100 111″ |" 101 101″ |" 110 011″ |" 110 101″ |" 111 001″ |" 111 011″ |" 111 111″ ,
'0' when others;
with in4 select
out4(2) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 010″ |" 1 110″ |" 10 010″ |" 11 000″ |" 11 110″ |
" 101″ |" 1 001″ |" 1 011″ |" 1 111″ |" 10 011″ |" 10 101″ |" 11 011″ |" 11 101″ |
" 100 000″ |" 100 010″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 010″ |
" 100 001″ |" 100 011″ |" 100 111″ |" 101 001″ |" 110 111″ |" 111 011″ |" 111 101″ |" 111 111″ ,
'0' when others;
with in4 select
out4(3) <= '1' when
" 0″ |" 10″ |" 110″ |" 1 100″ |" 10 000″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 1″ |" 101″ |" 111″ |" 1 011″ |" 1 111″ |" 10 011″ |" 11 001″ |" 11 111″ |
" 100 100″ |" 101 010″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 000″ |
" 100 001″ |" 100 011″ |" 101 011″ |" 101 101″ |" 110 001″ |" 110 101″ |" 110 111″ |" 111 011″ ,
'0' when others;
end model_S4;
library ieee;
use ieee. std_logic_1164.all;
entity S5 is
port (in5: in STD_LOGIC_VECTOR (0 to 5); out5: out STD_LOGIC_VECTOR (0 to 3));
end S5;
architecture model_S5 of S5 is
begin
with in5 select
out5(0) <= '1' when
" 10″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 110″ |" 11 000″ |" 11 100″ |" 11 110″ |
" 1″ |" 11″ |" 111″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 110″ |" 101 000″ |" 101 010″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 110″ |
" 100 001″ |" 100 011″ |" 100 101″ |" 101 011″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 001″ ,
'0' when others;
with in5 select
out5(1) <= '1' when
" 10″ |" 100″ |" 1 000″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 1″ |" 111″ |" 1 001″ |" 1 011″ |" 1 101″ |" 10 001″ |" 10 101″ |" 11 111″ |
" 100 000″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 100″ |" 110 110″ |" 111 000″ |" 111 110″ |
" 100 101″ |" 100 111″ |" 101 011″ |" 101 111″ |" 110 001″ |" 110 011″ |" 111 011″ |" 111 101″ ,
'0' when others;
with in5 select
out5(2) <= '1' when
" 0″ |" 1 000″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 100″ |" 10 110″ |" 11 100″ |
" 1″ |" 11″ |" 101″ |" 1 011″ |" 10 101″ |" 10 111″ |" 11 001″ |" 11 111″ |
" 100 010″ |" 100 110″ |" 101 000″ |" 101 100″ |" 110 000″ |" 111 000″ |" 111 010″ |" 111 110″ |
" 100 001″ |" 100 111″ |" 101 011″ |" 101 101″ |" 110 001″ |" 110 011″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in5 select
out5(3) <= '1' when
" 110″ |" 1 000″ |" 1 100″ |" 10 010″ |" 10 100″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 11″ |" 1 011″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 101″ |" 11 001″ |" 11 011″ |
" 100 100″ |" 100 110″ |" 101 010″ |" 101 100″ |" 110 000″ |" 110 010″ |" 110 110″ |" 111 010″ |
" 100 001″ |" 100 111″ |" 101 001″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 101″ |" 111 111″ ,
'0' when others;
end model_S5;
library ieee;
use ieee. std_logic_1164.all;
entity S6 is
port (in6: in STD_LOGIC_VECTOR (0 to 5); out6: out STD_LOGIC_VECTOR (0 to 3));
end S6;
architecture model_S6 of S6 is
begin
with in6 select
out6(0) <= '1' when
" 0″ |" 100″ |" 110″ |" 1 000″ |" 1 110″ |" 10 010″ |" 11 000″ |" 11 110″ |
" 1″ |" 11″ |" 1 011″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 111″ |
" 100 000″ |" 100 010″ |" 100 100″ |" 101 010″ |" 101 100″ |" 110 110″ |" 111 010″ |" 111 100″ |
" 100 111″ |" 101 001″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 111 101″ |" 111 111″ ,
'0' when others;
with in6 select
out6(1) <= '1' when
" 0″ |" 110″ |" 1 100″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 010″ |" 11 100″ |
" 11″ |" 101″ |" 1 001″ |" 1 011″ |" 1 111″ |" 10 001″ |" 10 101″ |" 10 111″ |
" 100 010″ |" 100 100″ |" 100 110″ |" 101 100″ |" 110 000″ |" 110 100″ |" 111 010″ |" 111 110″ |
" 100 001″ |" 100 111″ |" 101 011″ |" 101 101″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in6 select
out6(2) <= '1' when
" 100″ |" 110″ |" 1 010″ |" 1 100″ |" 10 100″ |" 11 000″ |" 11 010″ |" 11 110″ |
" 1″ |" 11″ |" 111″ |" 1 001″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 100 100″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 110″ |" 111 100″ |" 111 110″ |
" 100 011″ |" 100 101″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 111″ |" 111 001″ ,
'0' when others;
with in6 select
out6(3) <= '1' when
" 10″ |" 110″ |" 1 000″ |" 10 010″ |" 10 100″ |" 11 010″ |" 11 100″ |" 11 110″ |
" 11″ |" 1 001″ |" 1 101″ |" 1 111″ |" 10 011″ |" 10 101″ |" 11 011″ |" 11 101″ |
" 100 000″ |" 100 100″ |" 100 110″ |" 101 110″ |" 110 000″ |" 111 000″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 101 001″ |" 101 011″ |" 101 101″ |" 110 001″ |" 110 101″ |" 110 111″ |" 111 111″ ,
'0' when others;
end model_S6;
library ieee;
use ieee. std_logic_1164.all;
entity S7 is
port (in7: in STD_LOGIC_VECTOR (0 to 5); out7: out STD_LOGIC_VECTOR (0 to 3));
end S7;
architecture model_S7 of S7 is
begin
with in7 select
out7(0) <= '1' when
" 10″ |" 110″ |" 1 000″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 100″ |" 11 010″ |
" 1″ |" 101″ |" 1 011″ |" 1 111″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 100″ |" 100 110″ |" 101 000″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 110″ |" 111 100″ |
" 100 011″ |" 100 101″ |" 100 111″ |" 101 101″ |" 110 001″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in7 select
out7(1) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 110″ |" 10 010″ |" 10 110″ |" 11 000″ |" 11 100″ |
" 1″ |" 111″ |" 1 001″ |" 10 001″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 111″ |
" 100 010″ |" 100 110″ |" 101 000″ |" 101 100″ |" 101 110″ |" 110 010″ |" 110 100″ |" 111 010″ |
" 100 001″ |" 100 101″ |" 101 011″ |" 101 111″ |" 110 011″ |" 110 111″ |" 111 001″ |" 111 111″ ,
'0' when others;
with in7 select
out7(2) <= '1' when
" 10″ |" 100″ |" 110″ |" 1 000″ |" 10 000″ |" 10 110″ |" 11 010″ |" 11 100″ |
" 101″ |" 111″ |" 1 111″ |" 10 001″ |" 10 011″ |" 11 001″ |" 11 011″ |" 11 111″ |
" 100 100″ |" 101 010″ |" 101 100″ |" 101 110″ |" 110 000″ |" 110 010″ |" 110 100″ |" 111 110″ |
" 100 001″ |" 100 011″ |" 101 101″ |" 101 111″ |" 110 111″ |" 111 001″ |" 111 011″ |" 111 101″ ,
'0' when others;
with in7 select
out7(3) <= '1' when
" 10″ |" 1 000″ |" 1 110″ |" 10 000″ |" 10 100″ |" 10 110″ |" 11 000″ |" 11 110″ |
" 1″ |" 101″ |" 111″ |" 1 011″ |" 1 101″ |" 10 011″ |" 10 101″ |" 11 011″ |
" 100 000″ |" 100 100″ |" 100 110″ |" 101 010″ |" 101 100″ |" 110 010″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 100 101″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 111″ |" 111 101″ ,
'0' when others;
end model_S7;
library ieee;
use ieee. std_logic_1164.all;
entity S8 is
port (in8: in STD_LOGIC_VECTOR (0 to 5); out8: out STD_LOGIC_VECTOR (0 to 3));
end S8;
architecture model_S8 of S8 is
begin
with in8 select
out8(0) <= '1' when
" 0″ |" 100″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 010″ |" 10 110″ |" 11 100″ |
" 11″ |" 101″ |" 111″ |" 1 001″ |" 10 001″ |" 10 111″ |" 11 011″ |" 11 101″ |
" 100 010″ |" 101 000″ |" 101 010″ |" 101 100″ |" 110 100″ |" 110 110″ |" 111 000″ |" 111 110″ |
" 100 101″ |" 101 011″ |" 101 101″ |" 101 111″ |" 110 001″ |" 110 011″ |" 110 101″ |" 111 111″ ,
'0' when others;
with in8 select
out8(1) <= '1' when
" 0″ |" 110″ |" 1 000″ |" 1 010″ |" 10 110″ |" 11 000″ |" 11 100″ |" 11 110″ |
" 11″ |" 101″ |" 1 101″ |" 1 111″ |" 10 001″ |" 10 011″ |" 10 101″ |" 11 011″ |
" 100 000″ |" 100 100″ |" 101 010″ |" 101 100″ |" 110 010″ |" 110 110″ |" 111 000″ |" 111 100″ |
" 100 101″ |" 100 111″ |" 101 001″ |" 101 111″ |" 110 001″ |" 110 011″ |" 111 011″ |" 111 101″ ,
'0' when others;
with in8 select
out8(2) <= '1' when
" 10″ |" 1 000″ |" 1 010″ |" 1 100″ |" 10 000″ |" 10 100″ |" 10 110″ |" 11 110″ |
" 11″ |" 1 001″ |" 1 011″ |" 1 101″ |" 10 101″ |" 10 111″ |" 11 011″ |" 11 111″ |
" 100 000″ |" 100 010″ |" 101 100″ |" 101 110″ |" 110 010″ |" 110 100″ |" 111 000″ |" 111 010″ |
" 100 001″ |" 100 101″ |" 100 111″ |" 101 011″ |" 110 001″ |" 111 001″ |" 111 101″ |" 111 111″ ,
'0' when others;
with in8 select
out8(3) <= '1' when
" 0″ |" 1 010″ |" 1 100″ |" 1 110″ |" 10 010″ |" 10 100″ |" 11 000″ |" 11 110″ |
" 1″ |" 11″ |" 101″ |" 1 011″ |" 1 101″ |" 10 011″ |" 10 111″ |" 11 101″ |
" 100 000″ |" 100 010″ |" 100 110″ |" 101 000″ |" 110 110″ |" 111 000″ |" 111 010″ |" 111 100″ |
" 100 011″ |" 100 111″ |" 101 111″ |" 110 001″ |" 110 101″ |" 111 001″ |" 111 011″ |" 111 111″ ,
'0' when others;
end model_S8;
Код програми:
library ieee, my_lib;
use ieee. std_logic_1164.all, my_lib.my_func.all;
entity DES is
port (my_in: in STD_LOGIC_VECTOR (0 to 5); my_out: out STD_LOGIC_VECTOR (0 to 3));
end DES;
architecture S of DES is
component S1
port (in1: in STD_LOGIC_VECTOR (0 to 5); out1: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S2
port (in2: in STD_LOGIC_VECTOR (0 to 5); out2: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S3
port (in3: in STD_LOGIC_VECTOR (0 to 5); out3: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S4
port (in4: in STD_LOGIC_VECTOR (0 to 5); out4: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S5
port (in5: in STD_LOGIC_VECTOR (0 to 5); out5: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S6
port (in6: in STD_LOGIC_VECTOR (0 to 5); out6: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S7
port (in7: in STD_LOGIC_VECTOR (0 to 5); out7: out STD_LOGIC_VECTOR (0 to 3));
end component;
component S8
port (in8: in STD_LOGIC_VECTOR (0 to 5); out8: out STD_LOGIC_VECTOR (0 to 3));
end component;
signal
x1, x2, x3, x4, x5, x6, x7, x8: STD_LOGIC_VECTOR (0 to 5);
signal
out1, out2, out3, out4, out5, out6, out7, out8: STD_LOGIC_VECTOR (0 to 3);
begin
U1: S1 port map (x1, out1);
U2: S2 port map (x2, out2);
U3: S3 port map (x3, out3);
U4: S4 port map (x4, out4);
U5: S5 port map (x5, out5);
U6: S6 port map (x6, out6);
U7: S7 port map (x7, out7);
U8: S8 port map (x8, out8);
end S;
Список ідентифікаторів
Назва ідентифікатора | Значення ідентифікатора | |
x1 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в першому S-блоці. | |
x2 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в другому S-блоці. | |
x3 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в третьому S-блоці. | |
x4 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в четвертому S-блоці. | |
x5 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в п’ятому S-блоці. | |
x6 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в шостому S-блоці. | |
x7 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в сьомому S-блоці. | |
x8 | Вхідний вектор довжиною 6 біт, який використовується для підстановки в восьмому S-блоці. | |
out1 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в першому S-блоці. | |
out2 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в другому S-блоці. | |
out3 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в третьому S-блоці. | |
out4 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в четвертому S-блоці. | |
out5 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в п’ятому S-блоці. | |
out6 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в шостому S-блоці. | |
out7 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в сьомому S-блоці. | |
out8 | Вихідний вектор довжиною 4 біта, який утворюється в результаті перетворення в восьмому S-блоці. | |
Висновки
В результаті виконання даної роботи по розробленню VHDL опису та синтезу елементів пристрою для реалізації підстановки в S-блоках алгоритму DES була написана програма.
Перший лістинг програми представляє собою поведінковий опис пристрою.
Другий лістинг являє собою структурну форму опису пристрою.
Після проведення симуляції роботи даних програм в середовищі САПР Aldec Riviera 2004, були отримані результати роботи, які були представлені у вигляді двійкових діаграм. При симуляції обох програм ми отримали одинаковий результат, що вказує направельність результату.
Список використаної літератури
1 Бибило П. Н. Синтез логических схем с использованием языка VHDL. М.: Солон-Р, 2002.
2 Дьяков И. А. Моделирование цифровых и микропроцессорных систем. Язык VHDL
3 Зотов В. Ю. Проектирование цифровых устройств на основе ПЛИС фирмы XILINX в САПР WebPACK ISE. — М.: Горячая линия-Телеком. 2003.
4 Кнышев Д. А., Кузелин М. О. ПЛИС фирмы XILINX: описание структуры основных семейств. — М.: ДОДЭКА. 2001.
5 Стешенко В. Б. ПЛИС фирмы ALTERA: проектирование устройств обработки сигналов. — М.: ДОДЭКА. 2000.
6 Суворова Е. А., Шейнин Ю. Е. Проектирование цифровых систем на VHDL. — СПб.: БХВ-Петербург. 2003.