Анотація
У рамках запропонованої розрахунково-графічної роботи необхідно створити апаратний вузол, що виконує задачу перетворення цифрової інформації з її шифруванням за певним алгоритмом. Пристрій необхідно спроектувати з використанням мови високорівневого опису апаратури 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 = Σ
π 2 k - 1
p = 1 p 2 k
(2 k)
Блок обчислення функції
Блок має дві вхідні шини: 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: = ba; w: = 1;
M3: while c / = 0.0 loop
X: = X * 10.0;
a: = real (integer (X));
b: = real (X); c: = ba; 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
aa *
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.