Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Розроблення 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.

Показати весь текст
Заповнити форму поточною роботою