Устройство преобразования цифровой информации с ее шифрованием

Аннотация

В рамках предложенной расчетно-графической работы необходимо создать аппаратный узел, выполняющий задачу преобразования цифровой информации с ее шифрованием по определенному алгоритму. Устройство необходимо спроектировать с использованием языка высокоуровневого описания аппаратуры VHDL.

Задание на разработку

В системе имеется два устройства: источник (И) и приемник (П) информации. Необходимо описать устройство являющееся посредником между устройствами И и П (рис. 1). Устройство И имеет две выходные однонаправленные шины данных: 32-х разрядную X и 4-х разрядную n, 8-и разрядную шину адреса Address, два выходных сигнала Write и Read и входной сигнал Ready. Устройство посредник вычисляет функцию

Y (0 : 31) =

F (X (0 : 32))

И по сигналу Write записывает вычисленные данные в ОЗУ по адресу, выставленному на шину адреса источника. По сигналу Read устройство посредник считывает байт по адресу, выставленному на шину адреса, и выдает его в последовательном коде приемнику предварительно пропустив через блок шифрования БШ. Выдача последовательного кода осуществляется, когда на сигнал готовности посредника к передаче Ready, приемник отвечает сигналом готовности приема Ask.

Блок шифрования

R1 = 6 r2 = 0

Функции

Bn cos x

Где

∞ 1

Bk = ∑

π2k – 1

P =1 p 2k

(2k )

Блоквычисленияфункции

Блок имеет две входные шины: 32-х разрядную X и 4-х разрядную n и выходную 32- х разрядную шину Y. Считать, что по шине X передается число с плавающей точкой в формате (рис. 3).

В блоке все операции производятся над вещественными типами данных. Для получения вещественных данных организовать функцию, осуществляющую перевод из типа STD_LOGIC_VECTOR в тип REAL, для получения двоичных данных из вещественных организовать функцию, осуществляющую обратный перевод. Аналогично организовать (или воспользоваться готовой, например, из пакета exemplar) функцию для перевода данных 4-х разрядной шины n в целый тип.

Устройство, вычисляет функцию Y = f ( X ) , посредством разложения в ряд с точностью определяемой количеством слагаемых равным значению n. При реализации описания использовать только стандартные арифметические операции “+”, “-“, “/” и собственную функцию возвращающую квадрат аргумента

Rr :=b -1;

Result:=mut(a, pwr(a, rr));

End if;

Return result; \ъ

End pwr;

Function toreal (X

:STD_LOGIC_VECTOR(31 downto 0))

Return real is

Variable result, res1,tt3,tt2,myn: real;

Variable res2,tt1: integer;

Begin

Function toreal (X

:STD_LOGIC_VECTOR(31 downto 0))

Return real is

Variable result, res1,myn: real;

Variable res2: integer;

Begin

Res1:= real(CONV_INTEGER(X(20 downto 1)));

M1: while res1 >=1.0 loop res1:= res1/10.0;

End loop M1;

If X(0)= ‘1’ then res1:=-res1;

End if;

Res2:= CONV_INTEGER(X(31 downto 22));

If X(20)= ‘1’ then res2:=-res2;

End if;

Myn := 2.0**res2;

Result:= mut(res1,myn) ;

Return result;

End toreal;

Function fakt (n :real) return real is variable rr : real;

Variable result: real;

Begin

If n =1.0 then result :=n;

Elsif n = 0.0 then result :=0.0;

Elsif n < 0.0 then

Result := 0.0;

Else

Rr :=n -1.0;

Result:=mut(n, fakt(rr));

End if;

Return result;

End fakt;

Res1:=0.0;

E1: for i in 20 downto 1 loop tt1 := i;

Tt2 := 1.0/(pwr(2.0,tt1));

Tt3 :=

Mut(real(CONV_INTEGER(X(i))),real(tt2)

);

Res1:= res1 + real(tt3);

End loop e1;

If X(0)= ‘1’ then res1:=-res1;

End if;

Res2:= CONV_INTEGER(X(31 downto

22));

Myn := pwr(2.0,res2);

If X(21)= ‘1’ then myn:=1.0/myn;

End if;

Result:= mut(res1,myn) ;

Return result;

End toreal;

Function BK (X : real ; N : integer )

Return real is

Variable result, pi: real;

Variable k1,k2,k3,k4: real;

Begin pi:= 3.14;

For i in 1 to N loop k1 := mut(2.0,x); k2:=pwr(REAL(i),INTEGER(k1));

K3:=1.0/k2; k4:=(pwr(pi, INTEGER(k1))-

1.0)/fakt(k1); result:=k4; end loop;

Return result;

End BK;

Function MYFUN (X : real ; N : integer

) return real is

Variable result, pi: real;

Variable k2, k1:integer;

Variable RR, l1,l2,l3,g1,g2,g3: real;

Begin pi:= 3.14;

Result := 0.0;

If abs(x) > (3.14/2) then return result;

End if;

For i in 1 to N loop

K1 := integer(pwr(2.0,i)); K2:= k1 – 1;

L1 := pwr(2.0,k2);

L2 := pwr(2.0,k1); L3 := pwr(x, k1);

G1 := fakt(real(k1));

G2 := mut(REAL(n),g1); Rr := mut(l1,(l2-1.0));

G3 := BK(x, i);

Rr := mut(rr, G3); Rr := mut(rr, l3); result:=rr/g2;

End loop;

Return result;

End MYFUN;

Function tostd (X1 : real ) return

STD_LOGIC_VECTOR is variable

Result:STD_LOGIC_VECTOR ( 31 downto

0)

:=”00000000000000000000000000000000″

;

Variable X, myn, a,b, c: real; variable pr, w: integer; begin

X :=X1;

Pr:=0;

M2: while abs(X) >= 1.0 loop

X := X /2.0 ;

Pr:=pr +1;

End loop M2;

Result(31 downto 22):= CONV_STD_LOGIC_VECTOR(pr,10);

Result (21) := ‘0’;

If X < 0.0 then

Result (0) := ‘1’;

End if;

X := abs(X);

A:= real(integer(X));

B:= real(X); c:=b-a; w:=1;

M3: while c/=0.0 loop

X := X *10.0 ;

A:= real(integer(X));

B:= real(X); c:=b-a; w:=w+1;

Exit M3 when w > 6;

End loop M3;

Result(20 downto 1):= CONV_STD_LOGIC_VECTOR(integer(X

),20);

Return result;

End tostd;

Begin

Process ( X, N )

Variable mynum, res : real; variable count : integer; begin

Mynum := toreal(X);

Count := CONV_INTEGER(N); res := MYFUN(mynum, count); Y<= tostd (res);

End process;

End F;

Блокшифрования

Блок шифрования организован в виде сдвигового регистра с обратными связями, в которые включены элементы суммирования по модулю два, генерирующего поток ключей Результат генерации суммируется по модуля два с последовательным кодом, полученным с выхода блока преобразования параллельного кода в последовательный и выдается приемнику. Блок шифрования однократно при начале работы устройства загружается начальным значением Key по сигналу Load.

Блок шифрования реализовать на основе 30-и битового сдвигового регистра с обратными связями.

VHDL КОД:

Library IEEE;

Use IEEE. std_logic_1164.all;

Entity BCODE is port (

CLK : in std_logic; LOAD : in std_logic; DIN : in std_logic;

DATA : in std_logic_vector(29 downto 0); SO : out std_logic

);

End entity;

Architecture BCODE of BCODE is

Signal TEMP_SO : std_logic_vector(29 downto 0);

Begin process(CLK, LOAD) begin

If LOAD = ‘1’ then

TEMP_SO <= DATA;

ELSif rising_edge(CLK) then

TEMP_SO <= ((TEMP_SO(0)XOR

TEMP_SO(18))XOR TEMP_SO(19)) &; TEMP_SO(29 downto 1);

End if;

End process;

SO <= TEMP_SO(0)XOR DIN;

End architecture;

Блок ОЗУ

ОЗУ с раздельными шинами чтения и записи данных

WeDataAddrQ
1Data<=addrData
0X<=addrDataaddr

VHDL КОД

Library IEEE;

Use IEEE. std_logic_1164.all;

Use IEEE. std_logic_unsigned. all;

Entity ram is port (

WE : in STD_LOGIC;

ADDR : in STD_LOGIC_VECTOR(7 downto 0);

DATA : in STD_LOGIC_VECTOR (31 downto 0);

Лист

Q : out STD_LOGIC_VECTOR (31 downto 0)

);

End entity;

Architecture ram_arch of ram is

БлокОЗУ

Type ram_mem_type is array (254 downto 0) of STD_LOGIC_VECTOR (31 downto 0);

Signal ram_mem : ram_mem_type;

Begin

Process (WE, ADDR, DATA)

Variable ADDR_TEMP: integer range 254 downto 0;

Begin

If (WE = ‘1’) then

ADDR_TEMP := CONV_INTEGER(ADDR);

Ram_mem(ADDR_TEMP) <= DATA;

End if;

End process;

Q <= ram_mem(CONV_INTEGER(ADDR));

End architecture;

Блок-преобразователь параллельного кода в последовательный

ClkLoadDataRegSo
00XDataData(0)
11DataDataData(0)
10X0.dataData(1)

VHDL КОД

Library IEEE;

Use IEEE. std_logic_1164.all;

Entity regpiso is port (

);

End entity;

CLK : in std_logic; LOAD : in std_logic;

DATA : in std_logic_vector(31 downto 0); SO : out std_logic

Architecture regpiso of regpiso is

Signal TEMP_SO : std_logic_vector(31 downto 0);

Begin

Process(CLK)

Begin

If rising_edge(CLK) then if LOAD = ‘1’ then

TEMP_SO <= DATA;

End if;

End process;

Else end if;

TEMP_SO <= ‘0’ &; TEMP_SO(31 downto 1);

SO <= TEMP_SO(0);

End architecture;

Блок устройства управления

Устройство управление реализовать управляющим а автоматом граф переходов, которого описать в редакторе FSM

ReadAskCNumLoadClk1Clk2StbReady
0XX000001
X0X000001
111011000
XX1100110
XX1201000
…...…..….
XX13200110
XX1001001

VHDL Код

Library IEEE;

Use IEEE. std_logic_1164.all;

Entity FUNC is port(

ASK : in STD_LOGIC; LOAD : in STD_LOGIC; READ : in STD_LOGIC; WR : in STD_LOGIC;

ADDR : in STD_LOGIC_VECTOR(7 downto 0); KEY : in STD_LOGIC_VECTOR(29 downto 0); N : in STD_LOGIC_VECTOR(3 downto 0);

X : in STD_LOGIC_VECTOR(31 downto 0); READY : out STD_LOGIC;

READYO : out STD_LOGIC; RESULT : out STD_LOGIC; STB : out STD_LOGIC

);

End FUNC;

Architecture FUNC of FUNC is

—- Component declarations —– component bcode

Port (

CLK : in STD_LOGIC;

DATA : in STD_LOGIC_VECTOR(29 downto 0); DIN : in STD_LOGIC;

LOAD : in STD_LOGIC; SO : out STD_LOGIC

);

End component; component f port (

N : in STD_LOGIC_VECTOR(3 downto 0); X : in STD_LOGIC_VECTOR(31 downto 0); Y : out STD_LOGIC_VECTOR(31 downto 0)

);

End component; component kontroler port (

ASK : in STD_LOGIC; C : in STD_LOGIC; READ : in STD_LOGIC; CLK1 : out STD_LOGIC; CLK2 : out STD_LOGIC;

LOAD : out STD_LOGIC;

READY : out STD_LOGIC; STB : out STD_LOGIC

);

End component; component oscill port (

CLOCK : out STD_LOGIC

);

End component; component ram port (

ADDR : in STD_LOGIC_VECTOR(7 downto 0); DATA : in STD_LOGIC_VECTOR(31 downto 0); WE : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR(31 downto 0)

);

End component;

Component regpiso

Port (

CLK : in STD_LOGIC;

DATA : in STD_LOGIC_VECTOR(31 downto 0); LOAD : in STD_LOGIC;

SO : out STD_LOGIC

);

End component;

—- Signal declarations used on the diagram —-

Signal CLK1 : STD_LOGIC; signal CLK2 : STD_LOGIC; signal LO1 : STD_LOGIC; signal NET578 : STD_LOGIC; signal NET908 : STD_LOGIC; signal RED : STD_LOGIC;

Signal REDY : STD_LOGIC; 11

Signal BUS127 : STD_LOGIC_VECTOR (31 downto 0);

Signal BUS534 : STD_LOGIC_VECTOR (31 downto 0);

Begin

U1 : f

Port map(

N => N, X => X,

Y => BUS127

);

U2 : ram port map(

ADDR => ADDR, DATA => BUS127,

Q => BUS534, WE => WR

);

U3 : regpiso port map(

CLK => CLK1, DATA => BUS534, LOAD => LO1,

SO => NET578

);

U4 : bcode port map(

CLK => CLK2,

DATA => KEY,

DIN => NET578,

LOAD => LOAD, SO => RESULT

);

U5 : kontroler port map(

ASK => ASK, C => NET908, CLK1 => CLK1, CLK2 => CLK2, LOAD => LO1, READ => RED, READY => REDY, STB => STB

);

U6 : oscill port map(

CLOCK => NET908

);

RED <= READ;

— Output\buffer terminals READY <= REDY; READYO <= REDY;

End FUNC;

Временная диаграмма

Диаграмма потока данных:

KEY

LOA

Лист

N(3: X(31

Func

F

Mut

Pwr

Mut

Pwr

ADR(7

WR READ READ

A

Tore l

A a*

Myn

A^

Myn

A

A* MYF

UN

N re

Re

A* a tost

D

BK MYF

RESU ST

READ

AS

X(31

X(31

PROCESS

Mynum, res : real count : integer;

Y(31:0

N(3:

UN

Fakt

Ram

Y(31

Regpiso

Y(31 Y(0)

Mu

BCODE

Result

Adr(7:

Process (WE, ADDR, DATA) ram_mem

Process(CLK) TEMP_SO

Process(CLK, LOAD) TEMP SO

CLK CLK

KONTROLER

Process (C) NUM

Заключение

Структура шифрующе-вычисляющего устройства была описана на языке VHDL и отлажена с использованием пакета Aldec Active-HDL.

Описание предложенного алгоритма на языке описания аппаратуры оказалось несложным и повторяет подходы и принципы, используемые при подобных устройств на обычных высокоуровневых языках программировании программирования.

Использованный программный пакет в свою очередь предоставляет разработчику мощный арсенал средств для отладки, моделирования и верификации описанного устройства.

Список литературы

1.Синтез логических схем с использованием языка VHDL. Бибило П. Н.

2.Проектирование цифровых систем на VHDL. Суворова E. А., Шейнин Ю. Е.

3.Fundamentals of Digital Logic with VHDL. Brown S.


Устройство преобразования цифровой информации с ее шифрованием