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

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

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

Аннотация
В рамках предложенной расчетно-графической работы необходимо создать аппаратный узел, выполняющий задачу преобразования цифровой информации с ее шифрованием по определенному алгоритму. Устройство необходимо спроектировать с использованием языка высокоуровневого описания аппаратуры 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;
Блок ОЗУ
ОЗУ с раздельными шинами чтения и записи данных

we
data
addr
Q

1
data
<=addr
Data

0
X
<=addr
dataaddr

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;
Блок-преобразователь параллельного кода в последовательный

clk
load
data
reg
so

0
0
X
data
data(0)

1
1
data
data
data(0)

1
0
X
0.data
data(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

read
ask
c
num
load
clk1
clk2
stb
ready

0
X
X
0
0
0
0
0
1

X
0
x
0
0
0
0
0
1

1
1
1
0
1
1
0
0
0

X
X
1
1
0
0
1
1
0

x
x
1
2
0
1
0
0
0

….

..


…..


….

x
x
1
32
0
0
1
1
0

X
X
1
0
0
1
0
0
1

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;
— Outputbuffer 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.

«