Устройство преобразования цифровой информации с ее шифрованием
Аннотация
В
рамках предложенной расчетно-графической работы необходимо создать аппаратный
узел, выполняющий задачу преобразования цифровой информации с ее шифрованием по
определенному алгоритму. Устройство необходимо спроектировать с использованием
языка высокоуровневого описания аппаратуры 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);
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;
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));
Блок-преобразователь
параллельного кода в последовательный
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
|
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;
-- Output\buffer terminals READY <= REDY; READYO
<= REDY;
end
FUNC;
Временная
диаграмма
Диаграмма
потока данных:
KEY
LOA
Лист
N(3: X(31
func
f
mut
pwr
mut
pwr
ADR(7
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.