Міністерство освіти і науки України
НУ „Львівська політехніка”
ІКТА
Кафедра ЕОМ
Лабораторна робота №2
з курсу „Проектуванння периферійних комп’ютерних мікросистем”
на тему:
„Розробка на структурному рівні”
Мета роботи: Створення і перевірка структурних VHDL-описів кристалу та зовнішніх корпусних контактних майданчиків.
На цьому етапі переходять від функціонального опису кристалу до структурного . Тут кристал розбивається на два конструктиви:
1). Безпосередньо схема кристалу (core).
2). Зовнішні корпусні контактні майданчики (pads).
Структурний рівень передбачає опис цих двох конструктивів мовою структурного опису VHDL.
Відмінність структурного опису VHDL від функціонального полягає в тому, що в структурному описі оперують реальними бібліотечними елементами кристалу.
Створити структурний опис, який за обсягом на кілька порядків більший за функціональний, важко. Тому пакет Alliance передбачає два незалежних способи автоматизоавного отримання структурного опису для core та pads:
За допомогою текстового редактора створюється файл мовою С. Цей файл є проміжним форматом для створення структурного опису. У ньому за допомогою викликів спеціальних функцій формується виборка необхідних елементів з бібліотеки кристалу. Далі програмою-компілятором GENLIB проміжний С-файл переводять у необхідний структурний опис. У системі Alliance цей спосіб є рекомендованим.
Другий спосіб не вимагає додаткового набору інформації. Достатньо скористатись програмою-генератором LOGIC, на вхід якої задають функціональний VHDL-опис, а на виході отримують структурний VHDL-опис. Виборка бібліотечних елементів кристалу відбувається автоматично.
Після отримання структурних описів для core та pads, виконується симуляція на структурному рівні. Користуючись симулятором ASIMUT, перевіряють роботу тестових наборів на структурній VHDL-моделі безпосередньо схеми кристалу core. При виникненні помилки слід повернутись на попередні рівні. Симуляція для структурного опису зовнішніх корпусних контактних майданчиків pads не потрібна, оскільки цей опис не містить логічних перетворень сигналів.
Виконання роботи.
Розробку структурного опису проводжу в три кроки:
Описую на проміжній структурній мові власне схему кристалу core.c.
Описую на проміжній структурній мові зовнішні корпусні контактні майданчики addaccu.c.
Отримую результуючий структурний VHDL-опис за допомогою компілятора GENLIB.
Опис на проміжній структурній мові включає підключення стандартних бібліотечних елементів, логічні функції яких є необхідні для реалізації схеми. Проміжна мова - це мова С з викликами спеціальних функцій, головні з яких DEF_LOFIG, LOCON та LOINS. Для їх використання необхідно підключити хедер-файл genlib.h:
#include <genlib.h>
DEF_LOFIG - визначає ім’я результуючого структурного VHDL-опису;
LOCON - включає новий елемент;
LOINS - включає наперед визначений блок.
С-файли компілюються утилітою GENLIB. Змінні оточення MBK_IN_LO та MBK_OUT_LO повинні вказувати на тип формату структурного VHDL-опису. Рекомендованим є формат vst на відміну від al (al-формат може включати такі елементи, як конденсатори, які неможливо описати мовою VHDL.)
Отже, створюю за допомогою текстового редактора наступний проміжний структурний опис для core.c:
#include <genlib.h>
main()
{
int i;
DEF_LOFIG("core");
LOCON("X[0:7]",IN,"X[0:7");
LOCON("Y",IN,"Y");
LOCON("Cl",IN,"Cl");
LOCON("Ck",IN,"Ck");
LOCON("M",IN,"M");
LOCON("K",IN,"K");
LOCON("S",OUT,"S");
LOCON("vdd",IN,"vdd");
LOCON("vss",IN,"vss");
/*bit0*/
LOINS("xr2_y","xr0","sum[0]","X[0]","add[0]","vdd","vss",0);
LOINS("a2_y","an0","sum[0]","X[0]","carry_a[0]","vdd","vss",0);
LOINS("xr2_y","xr1","sum[0]","X[0]","red[0]","vdd","vss",0);
LOINS("o3_y","an1","sum[0]","X[0]","carry_d[0]","vdd","vss",0);
/*bit1*/
LOINS("xr2_y","xr2","sum[1]","X[1]","int[1]","vdd","vss",0);
LOINS("xr2_y","xr3","int[1]","carry_a[0]","add[1]","vdd","vss",0);
LOINS("a2_y","an2","sum[1]","X[1]","int[2]","vdd","vss",0);
LOINS("a2_y","an3","sum[1]","carry_a[0]","int[3]","vdd","vss",0);
LOINS("a2_y","an4","X[1]","carry_a[0]","int[4]","vdd","vss",0);
LOINS("03_y","an5","int[2]","int[3]","int[4]","carry_a[1]","vdd","vss",0);
LOINS("xr2_y","xr4","sum[1]","X[1]","int[5]","vdd","vss",0);
LOINS("xr2_y","xr5","int[5]","carry_d[0]","red[1]","vdd","vss",0);
LOINS("o3_y","an6","sum[1]","X[1]","int[6]","vdd","vss",0);
LOINS("o3_y","an7","sum[1]","carry_d[0]","int[7]","vdd","vss",0);
LOINS("o3_y","an8","X[1]","carry_d[0]","int[8]","vdd","vss",0);
LOINS("o3_y","an9","int[6]","int[7]","int[8]","carry_d[1]","vdd","vss",0);
/*bit2*/
LOINS("xr2_y","xr6","sum[2]","X[2]","int[9]","vdd","vss",0);
LOINS("xr2_y","xr7","int[9]","carry_a[1]","add[2]","vdd","vss",0);
LOINS("a2_y","an10","sum[2]","X[2]","int[10]","vdd","vss",0);
LOINS("a2_y","an11","sum[2]","carry_a[1]","int[11]","vdd","vss",0);
LOINS("a2_y","an12","X[2]","carry_a[1]","int[12]","vdd","vss",0);
LOINS("03_y","an13","int[10]","int[11]","int[12]","carry_a[2]","vdd","vss",0);
LOINS("xr2_y","xr8","sum[2]","X[2]","int[13]","vdd","vss",0);
LOINS("xr2_y","xr9","int[13]","carry_d[1]","red[2]","vdd","vss",0);
LOINS("o3_y","an14","sum[2]","X[2]","int[14]","vdd","vss",0);
LOINS("o3_y","an15","sum[2]","carry_d[1]","int[15]","vdd","vss",0);
LOINS("o3_y","an16","X[2]","carry_d[1]","int[16]","vdd","vss",0);
LOINS("o3_y","an17","int[14]","int[15]","int[16]","carry_d[2]","vdd","vss",0);
/*bit3*/
LOINS("xr2_y","xr10","sum[3]","X[3]","int[17]","vdd","vss",0);
LOINS("xr2_y","xr11","int[17]","carry_a[2]","add[3]","vdd","vss",0);
LOINS("a2_y","an18","sum[3]","X[3]","int[18]","vdd","vss",0);
LOINS("a2_y","an19","sum[3]","carry_a[2]","int[19]","vdd","vss",0);
LOINS("a2_y","an20","X[3]","carry_a[2]","int[20]","vdd","vss",0);
LOINS("03_y","an21","int[18]","int[19]","int[20]","carry_a[3]","vdd","vss",0);
LOINS("xr2_y","xr12","sum[3]","X[3]","int[21]","vdd","vss",0);
LOINS("xr2_y","xr13","int[21]","carry_d[2]","red[3]","vdd","vss",0);
LOINS("o3_y","an22","sum[3]","X[3]","int[22]","vdd","vss",0);
LOINS("o3_y","an23","sum[3]","carry_d[2]","int[23]","vdd","vss",0);
LOINS("o3_y","an24","X[3]","carry_d[2]","int[24]","vdd","vss",0);
LOINS("o3_y","an25","int[22]","int[23]","int[24]","carry_d[3]","vdd","vss",0);
/*bit4*/
LOINS("xr2_y","xr14","sum[4]","X[4]","int[25]","vdd","vss",0);
LOINS("xr2_y","xr15","int[25]","carry_a[3]","add[4]","vdd","vss",0);
LOINS("a2_y","an26","sum[4]","X[4]","int[26]","vdd","vss",0);
LOINS("a2_y","an27","sum[4]","carry_a[3]","int[27]","vdd","vss",0);
LOINS("a2_y","an28","X[4]","carry_a[3]","int[28]","vdd","vss",0);
LOINS("03_y","an29","int[26]","int[27]","int[28]","carry_a[4]","vdd","vss",0);
LOINS("xr2_y","xr16","sum[4]","X[4]","int[29]","vdd","vss",0);
LOINS("xr2_y","xr17","int[29]","carry_d[3]","red[4]","vdd","vss",0);
LOINS("o3_y","an30","sum[4]","X[4]","int[30]","vdd","vss",0);
LOINS("o3_y","an31","sum[4]","carry_d[3]","int[31]","vdd","vss",0);
LOINS("o3_y","an32","X[4]","carry_d[3]","int[32]","vdd","vss",0);
LOINS("o3_y","an33","int[30]","int[31]","int[32]","carry_d[4]","vdd","vss",0);
/*bit5*/
LOINS("xr2_y","xr18","sum[5]","X[5]","int[33]","vdd","vss",0);
LOINS("xr2_y","xr19","int[33]","carry_a[4]","add[5]","vdd","vss",0);
LOINS("a2_y","an34","sum[5]","X[5]","int[34]","vdd","vss",0);
LOINS("a2_y","an35","sum[5]","carry_a[4]","int[35]","vdd","vss",0);
LOINS("a2_y","an36","X[5]","carry_a[4]","int[36]","vdd","vss",0);
LOINS("03_y","an37","int[34]","int[35]","int[36]","carry_a[5]","vdd","vss",0);
LOINS("xr2_y","xr20","sum[5]","X[5]","int[37]","vdd","vss",0);
LOINS("xr2_y","xr21","int[37]","carry_d[4]","red[5]","vdd","vss",0);
LOINS("o3_y","an38","sum[5]","X[5]","int[38]","vdd","vss",0);
LOINS("o3_y","an39","sum[5]","carry_d[4]","int[39]","vdd","vss",0);
LOINS("o3_y","an40","X[5]","carry_d[4]","int[40]","vdd","vss",0);
LOINS("o3_y","an41","int[38]","int[39]","int[40]","carry_d[5]","vdd","vss",0);
/*bit6*/
LOINS("xr2_y","xr22","sum[6]","X[6]","int[41]","vdd","vss",0);
LOINS("xr2_y","xr23","int[41]","carry_a[5]","add[6]","vdd","vss",0);
LOINS("a2_y","an42","sum[6]","X[6]","int[42]","vdd","vss",0);
LOINS("a2_y","an43","sum[6]","carry_a[5]","int[43]","vdd","vss",0);
LOINS("a2_y","an44","X[6]","carry_a[5]","int[44]","vdd","vss",0);
LOINS("03_y","an45","int[42]","int[43]","int[44]","carry_a[6]","vdd","vss",0);
LOINS("xr2_y","xr24","sum[6]","X[6]","int[45]","vdd","vss",0);
LOINS("xr2_y","xr25","int[45]","carry_d[5]","red[6]","vdd","vss",0);
LOINS("o3_y","an46","sum[6]","X[6]","int[46]","vdd","vss",0);
LOINS("o3_y","an47","sum[6]","carry_d[5]","int[47]","vdd","vss",0);
LOINS("o3_y","an48","X[6]","carry_d[5]","int[48]","vdd","vss",0);
LOINS("o3_y","an49","int[46]","int[47]","int[48]","carry_d[6]","vdd","vss",0);
/*bit7*/
LOINS("xr2_y","xr26","sum[7]","X[7]","int[49]","vdd","vss",0);
LOINS("xr2_y","xr27","int[49]","carry_a[6]","add[7]","vdd","vss",0);
LOINS("xr2_y","xr28","sum[7]","X[7]","int[53]","vdd","vss",0);
LOINS("xr2_y","xr29","int[53]","carry_d[6]","red[7]","vdd","vss",0);
/*mux1*/
LOINS("xr2_y","xr30","Y","prev_Y","ch","vdd","vss",0);
LOINS("n1_y","n10","ch","nch","vdd","vss",0);
for(i=0;i<4;i++)
{
LOINS("mx2_y",NAME("res%d",i),
NAME("sum[%d]",i),"nch",
NAME("op_res[%d]",i),"ch",
NAME("res[%d]",i),"vdd","vss",0);
}
/*mux2*/
LOINS("n1_y","n11","Y","nY","vdd","vss",0);
for(i=0;i<4;i++)
{
LOINS("mx2_y",NAME("op_res%d",i),
NAME("add[%d]",i),"nY",
NAME("red[%d]",i),"Y",
NAME("op_res[%d]",i),"vdd","vss",0);
}
/*shifter*/
LOINS("ms_y",NAME("res[%d]",i), "Cl","Ck", NAME("sh_res[%d]",i),"vdd","vss",0);
/*registr*/
LOINS("ms_y",NAME("sh_res[%d]",i),"Ck", NAME("sum[%d]",i),"vdd","vss",0);
SAVE_LOFIG();
exit(0);
}
Перетворюю проміжний структурний опис core.c в структурний VHDL-опис core.vst за допомогою компілятора GENLIB:
# ###--------------------------------------------------------------------------###
# generate structural description of the circuit's core #
# core.c is the schematic capture of the core, using #
# the genlib language #
# the environment variable specify the structural VHDL format #
# ###--------------------------------------------------------------------------###
MBK_IN_LO=vst ;\
MBK_OUT_LO=vst ;\
MBK_CATA_LIB=$TOP/cells/scr ;\
export MBK_IN_LO MBK_OUT_LO MBK_CATA_LIB ;\
genlib core [2]
core.c --> core.vst
Отримала структурний VHDL-опис core.vst, що поданий в електронному варіанті.
Далі за допомогою текстового редактора створюю наступний проміжний структурний опис для multiplier.c:
#include <genlib.h>
main()
{
int i;
DEF_LOFIG("multiplier");
LOCON("X[0:7]", IN, "X[0:7]");
LOCON("Y", IN, "Y");
LOCON("Cl", IN, "Cl" );
LOCON("Ck", IN, "Ck" );
LOCON("M", IN, "M" );
LOCON("K", IN, "K" );
LOCON("vdd", IN, "vdd" );
LOCON("vss", IN, "vss" );
LOCON("S", OUT, "S");
LOINS ("pvsse_sp", "p15", "cki", "vdd", "vss", 0);
LOINS ("pvsse_sp", "p16", "cki", "vdd", "vss", 0);
LOINS ("pvdde_sp", "p17", "cki", "vdd", "vss", 0);
LOINS ("pvssi_sp", "p18", "cki", "vdd", "vss", 0);
LOINS ("pvddi_sp", "p19", "cki", "vdd", "vss", 0);
for (i = 0; i < 7; i++)
LOINS("pi_sp", NAME("p%d", i),
NAME("X[%d]", i), NAME("XX[%d]", i),
"cki", "vdd", "vss", 0);
LOINS("pi_sp", "p12",
"Cl", "ClCl",
"cki", "vdd", "vss", 0);
LOINS("pi_sp", "p13",
"Ck", "CkCk",
"cki", "vdd", "vss", 0);
LOINS("pi_sp", "p14",
"M", "MM",
"cki", "vdd", "vss", 0);
LOINS("pi_sp", "p15",
"K", "KK",
"cki", "vdd", "vss", 0);
LOINS("pi_sp", "p16",
"Y", "YY",
"cki", "vdd", "vss", 0);
LOINS("po_sp",
"S", "SS",
"cki", "vdd", "vss", 0);
LOINS("core", "core",
"XX[0:7]", "ClCl", "CkCk","MM","KK", "YY", "SS",
"vdd", "vss", 0);
SAVE_LOFIG();
exit(0); /* necessary for the proper run of the Makefile */
}
Перетворюю проміжні структурні описи addaccu.c та core.c, які включаються в multiplier.c, в результуючий структурний VHDL-опис multiplier.vst за допомогою компілятора GENLIB:
# ###--------------------------------------------------------------------------###
# generate structural description of the complete circuit #
# addaccu.c is the schematic capture of the circuit, using #
# the genlib language #
# the circuit can be generated only if the core is generated #
# the environment variable specify the structural VHDL format #
# ###--------------------------------------------------------------------------###
MBK_IN_LO=vst ;\
MBK_OUT_LO=vst ;\
MBK_CATA_LIB=$TOP/cells/scr:$TOP/cells/ring ;\
export MBK_IN_LO MBK_OUT_LO MBK_CATA_LIB ;\
genlib multiplier [3]
multiplier.c --> multiplier.vst
Останньою дією, що проводиться на етапі розробки на структурному рівні, є симуляція на структурному рівні з використанням тестових наборів:
# ###---------------------------------------------------------###
# check the correctness of the generated structural #
# description running the logic simulation #
# ###---------------------------------------------------------###
MBK_IN_LO=vst ;\
MBK_CATA_LIB=$TOP/cells/scr:$TOP/cells/ring ;\
export MBK_IN_LO MBK_CATA_LIB ;\
asimut multiplier multiplier schema [4]
вихідний файл з результатами тестування
multiplier.pat
multiplier.vst
Отримали таку функціональну схему:
Вихідний файл з результатами тестування поданий в електроному вигляді.
Висновок.
На лабораторній роботі створила структурні VHDL-описи кристалу та зовнішніх корпусних контактних майданчиків схеми паралельно-послідовного перемножувача та здійснила перевірку цих описів.