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