| Автор |
Съобщение |
|
velio
Ранг: Форумен бог
Регистриран на: Вто Юни 07, 2005 6:20 pm Мнения: 3532
|
 Малък въпрос за CPLD Xilinx
Абе тука едно CPLD ме мъчи.
Досега не съм се занимавал с програмируеми логики (има само някаква много бегла и смътна представа).
Та това CPLD е XCR3064.
Програмиран е вече. Имам някакъв .jed файл (програма или код, не знам как се нарича).
Та идеята е следната - трябва да разбера какво точно прави това нещо, за да решим дали може да караме и без него.
За целта обаче ми трябва поне развойната среда на Xilinx (предполагам). Та въпроса е - какъв софтуер ми трябва всъщност и откъде да си го дръпна...
10х
|
| Сря Авг 17, 2005 9:58 am |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Ако имаш само .jed файла няма да можеш да разбереш нищо за вътрешната структура. Или поне с това което предлага безплатната среда на WebPack такова нещо не ми е известно да е възможно. .jed файла е двоичен файл, информация за "дупчене" в матрицата.
|
| Сря Авг 17, 2005 11:57 pm |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Мдааааааа ...... Здрав е прав ...
Няма начин по които да можеш да синтезираш тоя jed. фаил в нещо което дори да ти подскаже квя точно е функцията на CPLD'то. ..... най много да извлечеш схемата на тва дето е вътре .... ама да ти кажа до сега не съм виждал няква програмка дето да прави това ... макар че е възможно (ако ти се занимава де)
Инчае софтуера необходим за синтезиране и програмиране на CPLD/FPFA e WebPack (безплатен) или ISE (ако го изкопаеш от някъде) ....
За развоини средства ..... най ефтиното нещо което може да се купи от Хилинукс е : DO-CPLD-DK $49.99
http://www.xilinx.com/xlnx/xebiz/productview.jsp?sGlobalNavPick=&sSecondaryNavPick=&category=-18907&iLanguageID=1&category=/Xilinx+Products/Hardware+and+Cables/Development+Boards/CPLD+Boards
може да го поръчаш чрез Петрекс92 (тея пичове трябва да ми плащат вече за реклама ...  )
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Чет Авг 18, 2005 12:12 am |
|
 |
|
velio
Ранг: Форумен бог
Регистриран на: Вто Юни 07, 2005 6:20 pm Мнения: 3532
|
Ааа, ние с Петрекс работим по принцип... Направихме им малко оборот (абе не беше малко ама...)
Добре, ами нещо такова ще свърши ли работа
....
module edb(
bsdcs,
read,
mcdaen,
mcdir,
brd,
bbdqm,
bdqm,
bsdwe,
bresetn,
cpld_clk,
int_boot,
ext_boot,
nor_boot,
ser_boot,
func_test,
tic_test,
para_test,
scan_test,
eeclk,
......
Това също го имам (пише че е сорс код)
Идеята ми беше за нещо безплатно, може и хакната версия на нещо на Xilinx..
Горе-долу колкото да разберем за какво иде реч (ако успеем де)
|
| Чет Авг 18, 2005 11:18 am |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Еееее .... тва второто вече може
От него може да разберете всичко ..... разбира се трябва ви човек които да го разчете де ... (вище разширението на фаила .... ако е .v - то тогава е писано на Verilog ако е .vhdl то тогава е писано на VHDL  )
Като го гледам обаче как почва маи е Verilog ....
Та ... за да разберете кво праи, съответно ще ви трябва някои кото разбира от гореспоменатите езици да го разчете. (това е най лесния начин)
Втория начин е да зяпаш симулацията на тоя код с MXE(симулатор) на WebPack ... и да се мъчиш да разбереш кво става ....
Ако искаш качи го тоз код тука ... да го поразгледам (само да не е много дълак че ме мързи много ....) и ще се опитам да ти нахвърля в основни линий кво праи ....  /ако е на Verilog де ... ама предполагам че е тва/
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Чет Авг 18, 2005 12:09 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
В такъв случай ако имаш сорс код. Може да ти се сглоби един проект в WebPack. А там може да се генерира схема от този сорс( имам в предвид по-новите версии на WebPack, 6.2 например става). И да разглеждаш нещо по разбираемо от Verilog или VHDL.
|
| Чет Авг 18, 2005 12:38 pm |
|
 |
|
velio
Ранг: Форумен бог
Регистриран на: Вто Юни 07, 2005 6:20 pm Мнения: 3532
|
Verilog е. Пише го в началото на файла (то всъщност не е отделен файл, ами част от .DOC, където е и другата документация за схемата).
Тегля сега на работа WebPack 7.1i (ако не се лъжа...) само че е малко големичко (380MB)  .
Гледам там има някакъв ъпдейт ли, servicе pack ли не помня, и той 300MB. Ще ми трябва ли?
В понеделник ще постна целия сорс (две страници е май...), макар че може и да се окаже че не е чак толкова сложно нещо...
|
| Съб Авг 20, 2005 9:04 pm |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Хехе .. абре в 2 старници може да се опише бая сложничко нещо ...
По добре си сложи вер.6.1 ... по лека е и се държи стабилно ... задължително си свали и сервиз-пакета ...
Аре .. като постнеш кода ще видим кво е тва чудо ... 
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Съб Авг 20, 2005 9:12 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
От Петрекс можеха да ти го пратят на диск. Аз лично работя с 6.2 защото чувам че хората имат проблеми с тоя 7.1 Така че както казва и BrainStorm СервисПака - задължително.
|
| Съб Авг 20, 2005 10:34 pm |
|
 |
|
velio
Ранг: Форумен бог
Регистриран на: Вто Юни 07, 2005 6:20 pm Мнения: 3532
|
Хм, не било 2 страници, малко повечко
Edb.v Verilog Source Code
module edb(
bsdcs,
read,
mcdaen,
mcdir,
brd,
bbdqm,
bdqm,
bsdwe,
bresetn,
cpld_clk,
int_boot,
ext_boot,
nor_boot,
ser_boot,
func_test,
tic_test,
para_test,
scan_test,
eeclk,
eedat,
ntest1,
ntest0,
bwr,
bras,
bcas,
waitb,
bad,
bda,
io,
ioclk
);
input [2:1] bsdcs;
input mcdir;
input bsdwe;
input brd;
input bwr;
input bras;
input bcas;
input waitb;
input mcdaen;
input [3:0] bdqm;
output [3:0] bbdqm;
output read;
input bresetn;
input cpld_clk;
input eeclk;
input eedat;
input ntest1;
input ntest0;
input [3:0] bad;
input [7:0] bda;
output int_boot;
output ext_boot;
output nor_boot;
output ser_boot;
output func_test;
output tic_test;
output para_test;
output scan_test;
output [15:0] io;
output ioclk;
//output outdummya;
reg r_ext_boot ; assign ext_boot = r_ext_boot;
reg r_int_boot ; assign int_boot = r_int_boot;
reg r_nor_boot ; assign nor_boot = r_nor_boot;
reg r_ser_boot ; assign ser_boot = r_ser_boot;
reg r_func_test; assign func_test = r_func_test;
reg r_tic_test ; assign tic_test = r_tic_test;
reg r_para_test; assign para_test = r_para_test;
reg r_scan_test; assign scan_test = r_scan_test;
reg r_first_pass_detect;
always @(posedge cpld_clk or negedge bresetn)
begin
if(!bresetn)
begin
r_ext_boot = 1'b0;
r_int_boot = 1'b0;
r_nor_boot = 1'b0;
r_ser_boot = 1'b0;
r_func_test = 1'b0;
r_tic_test = 1'b0;
r_para_test = 1'b0;
r_scan_test = 1'b0;
r_first_pass_detect = 1'b1;
end
else
begin
if(!eeclk && r_first_pass_detect)
r_ext_boot = 1'b1;
if(eeclk && r_first_pass_detect)
r_int_boot = 1'b1;
if(eedat && !ntest1 && !ntest0&& r_first_pass_detect)
r_nor_boot = 1'b1;
if(eedat && !ntest1 && ntest0&& r_first_pass_detect)
r_ser_boot = 1'b1;
if(eedat && ntest1 && !ntest0&& r_first_pass_detect)
r_func_test = 1'b1;
if(eedat && ntest1 && ntest0&& r_first_pass_detect)
r_tic_test = 1'b1;
if(!eedat && !ntest1 && !ntest0&& r_first_pass_detect)
r_para_test = 1'b1;
if(!eedat && !ntest1 && ntest0&& r_first_pass_detect)
r_scan_test = 1'b1;
r_first_pass_detect = 1'b0;
end
end
wire bufsdramsel = (!bsdcs[1] & !bsdcs[2]) ? 1'b1 : 1'b0;
//wire read;
assign read = ((!mcdir & !mcdaen) | (!brd & mcdaen) | ( bsdwe & bufsdramsel)) ? 1'b0 : 1'b1;
assign bbdqm[0] = ((!bdqm[0] & mcdaen) | (bdqm[0] & !mcdaen)) ? 1'b0 : 1'b1;
assign bbdqm[1] = ((!bdqm[1] & mcdaen) | (bdqm[1] & !mcdaen)) ? 1'b0 : 1'b1;
assign bbdqm[2] = ((!bdqm[2] & mcdaen) | (bdqm[2] & !mcdaen)) ? 1'b0 : 1'b1;
assign bbdqm[3] = ((!bdqm[3] & mcdaen) | (bdqm[3] & !mcdaen)) ? 1'b0 : 1'b1;
assign io[2:0] = bad[2:0];
assign io[3] = bwr;
assign io[4] = r_first_pass_detect;
assign io[5] = bras;
assign io[6] = bcas;
assign io[7] = waitb;
assign io[15:8] = bda[7:0];
assign ioclk = bad[3];
endmodule
Е те 'тва е.
Сори за дългия пост 
|
| Пон Авг 22, 2005 10:26 am |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Уф .... малко ме стресна в началото като ги зърнах тез 30'тина i/o'та 
Та .... значи ето кратко описание на тва кво прави това чудо:
Като гледам маи се използа само за споиваща логика ... бихте могли да го замените и с ТТЛ'ки ама ще ви трябват бая ... (около 40'тина)
Както се вижда от предварителната декларация тва чудо има 30 порта, кои е вход и кои изход мисля че се подразбира, това във
скобите [x : x] показва че съответния и/о е шина с дължина 'Н' бита
input [2:1] bsdcs; // това например е дълго 3 бита
input mcdir;
input bsdwe;
input brd;
input bwr;
input bras;
input bcas;
input waitb;
input mcdaen;
input [3:0] bdqm; // това 4бита и т.н.т
output [3:0]
bbdqm;
output read;
input bresetn;
input cpld_clk;
input eeclk;
input eedat;
input ntest1;
input ntest0;
input [3:0] bad;
input [7:0] bda;
output int_boot;
output ext_boot;
output nor_boot;
output ser_boot;
output func_test;
output tic_test;
output para_test;
output scan_test;
output [15:0] io;
output ioclk;
После следва същинската дефиниция на на функцията на CPLD'то
always @(posedge cpld_clk or negedge bresetn)
begin
if(!bresetn)
begin
r_ext_boot = 1'b0;
r_int_boot = 1'b0;
r_nor_boot = 1'b0;
r_ser_boot = 1'b0;
r_func_test = 1'b0;
r_tic_test = 1'b0;
r_para_test = 1'b0;
r_scan_test = 1'b0;
r_first_pass_detect = 1'b1;
end
else
begin
if(eeclk && r_first_pass_detect)
r_int_boot = 1'b1;
if(eedat && !ntest1 && !ntest0&& r_first_pass_detect)
r_nor_boot = 1'b1;
if(eedat && !ntest1 && ntest0&& r_first_pass_detect)
r_ser_boot = 1'b1;
if(eedat && ntest1 && !ntest0&& r_first_pass_detect)
r_func_test = 1'b1;
if(eedat && ntest1 && ntest0&& r_first_pass_detect)
r_tic_test = 1'b1;
if(!eedat && !ntest1 && !ntest0&& r_first_pass_detect)
r_para_test = 1'b1;
if(!eedat && !ntest1 && ntest0&& r_first_pass_detect)
r_scan_test = 1'b1;
r_first_pass_detect = 1'b0;
end
end
Горе написаното ще рече нещо от сорта ... При преминаване от 0->1 на сигнала cpld_clk или преминаване от 1->0 на сигнала breset се случва следното ..
Ако breset == 0 (синхронен ресет) сигналите:
r_ext_boot
r_int_boot
r_nor_boot
r_ser_boot
r_func_test
r_tic_test
r_para_test
r_scan_test
се установяват в в ниво '0' асигнала r_first_pass_detect в ниви '1'.
Ако breset == 1 то тогава се случва следното:
сигнала r_first_pass_detect се установява в ниво '0' и ...
if(!eeclk && r_first_pass_detect) // ако условието е изпълнено
r_ext_boot = 1'b1; // r_ext_boot = 1 .. в противен случеи запазва предишното си ниво
if(eedat && !ntest1 && !ntest0&& r_first_pass_detect) // ..............
r_nor_boot = 1'b1; // ..............
if(eedat && !ntest1 && ntest0&& r_first_pass_detect) // ..............
r_ser_boot = 1'b1; // ..............
if(eedat && ntest1 && !ntest0&& r_first_pass_detect) // ..............
r_func_test = 1'b1; // ..............
if(eedat && ntest1 && ntest0&& r_first_pass_detect) // ..............
r_tic_test = 1'b1; // ..............
if(!eedat && !ntest1 && !ntest0&& r_first_pass_detect) // ..............
r_para_test = 1'b1; // ..............
if(!eedat && !ntest1 && ntest0&& r_first_pass_detect) // ..............
r_scan_test = 1'b1; // ..............
Така едно допълнение ... това по горе беше синхронната част от модула .. т.е всички промени по гореспоменатите сигнали се случват синхронно при положителен фронт на сигнала cpld_clk.
В останалата по доло чат от модула нещата се случват асинхронно .... /тип wire/
wire bufsdramsel = (!bsdcs[1] & !bsdcs[2]) ? 1'b1 : 1'b0; // тук се декларира един вътрешен сигнал bufsdramsel, ако условието (!bsdcs[1] & !bsdcs[2]) е изпълнено то този сигнал придобива стоиност 1 в противен случеи е 0
//wire read;
assign read = ((!mcdir & !mcdaen) | (!brd & mcdaen) | ( bsdwe & bufsdramsel)) ? 1'b0 : 1'b1; // тук се присвоява стоиност на сигнала read ... ако условието ((!mcdir & !mcdaen) | (!brd & mcdaen) | ( bsdwe&bufsdramsel)) .... /забележи че като аргумент се ползва и стоиноста на горедекларирания сигнал/ .... е изпълнено този то тогава на read се присвоява стоиност 0 в противен случеи е равен на 1
assign bbdqm[0] = ((!bdqm[0] & mcdaen) | (bdqm[0] & !mcdaen)) ? 1'b0 : 1'b1; // на бит 0 от шината bbdqm се присвоява инвертираната стоиност на условието ((!bdqm[0] & mcdaen) | (bdqm[0] & !mcdaen))
assign bbdqm[1] = ((!bdqm[1] & mcdaen) | (bdqm[1] & !mcdaen)) ? 1'b0 : 1'b1; // на бит 1 ..............................
assign bbdqm[2] = ((!bdqm[2] & mcdaen) | (bdqm[2] & !mcdaen)) ? 1'b0 : 1'b1; // на бит 2 ..............................
assign bbdqm[3] = ((!bdqm[3] & mcdaen) | (bdqm[3] & !mcdaen)) ? 1'b0 : 1'b1; // на бит 3 ..............................
assign io[2:0] = bad[2:0]; // на битове 2 до 0 от шината io се присвоява стоиноста на битове 2 до 0 от шината bad
assign io[3] = bwr; // на бит 3 от щината i/o се присвоява стоиноста на bwr
assign io[4] = r_first_pass_detect; // на бит 4 от щината i/o се присвоява стоиноста на r_first_pass_detect
assign io[5] = bras; // на бит 5 от щината i/o се присвоява стоиноста на bras
assign io[6] = bcas; // на бит 6 от щината i/o се присвоява стоиноста на bcas
assign io[7] = waitb; // на бит 7 от щината i/o се присвоява стоиноста на waitb
assign io[15:8] = bda[7:0]; // на битове 15 до 8 от шината io се присвоява стоиноста на битове 7 до 0 от шината bda
assign ioclk = bad[3]; // на сигнала ioclk се присвоява стоиноста на бит 3 от сигнала bad
Еми това е ... 
Както казах, единствената функция на тва CPLD в случея е да бъде ползвано като 'споиваща логика' ... да ти кажа аз бих ти препоръчал да не "карате без него" .. много ще си осложните живота ако го направите тва с ТТЛ'ки ...
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Пон Авг 22, 2005 2:01 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
За какви ТТЛ-ки става въпрос
Това е CoolRunner с под 100mA консумация на 100MHz, макс. propagation delay time 10ns, за размерите да не говорим...
|
| Пон Авг 22, 2005 5:49 pm |
|
 |
|
velio
Ранг: Форумен бог
Регистриран на: Вто Юни 07, 2005 6:20 pm Мнения: 3532
|
r_ext_boot
r_int_boot
r_nor_boot
r_ser_boot
r_func_test
r_tic_test
r_para_test
r_scan_test
са изходи за индикация - има свързани светодиоди към тях.
Съвсем спокойно все едно ги няма... Опростява ли това нещата? (ще взема да навляа в тези програмируеми логики май, явно сега му дойде времето  )
Между другото дръпнах си WebPack-a, ама не мога да се оправя нещо. Има ли начин да се види това като схема от тип тригери, логики (двувходови, тривходови...) и т.н.?
Иначе под ТТЛ предполагам имаше предвид дискретни логики.
Аз си мисля че дори да не можем да минем без това CPLD, бихме могли да сложим някакво по-малко и по-евтино. 100 извода са прекалено много за това което върши май...
Как мислите?
|
| Вто Авг 23, 2005 11:19 am |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Ето това е схема на най-горното ниво генерирана със WEbPack6.2. В Project Navigator процеса който я генерира се казва "View RTL Schematic". Избрали са XCR3064 защото на XCR3032 не му достигат 2 изходни пина. Той има 28 а са необходими 30 за този проект. Вътре в матрицата ресурсите са заети по-малко от половината така че ако отпаднат някои от сигналите излизащи навън смятам, че ще се побере и в XCR3032. Но за това ... наистина май е дошъл момента да навлезеш в програмируемите логики.
Ако този вид на схемата те устройва и имаш проблеми с генерирането и обади се като се поосвободя малко довечера мога да ти изпратя и схемите на по-долните нива - блокчетата от тази схема.
|
| Вто Авг 23, 2005 12:45 pm |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Мда .. определено може да го поберете в нещо по компактно ... 48 пинов корпус ... 32 макроклетки (ХС9532 например ... цената му е около 1.3$)
Иначе относно WepPack .... създаваш нов проект ... прибавяш фаиловете .. и му даваш да ги синтезира .. така дирекно се създава и схема на проекта която можеш да си разглеждаш .....
Ето тук има едно кратко туториалче с картинки
http://www.fpga4fun.com/ISEQuickStart.html
.... стъпка по стъпка се обяснява как да създадеш и компилираш проект ... за да видиш схемата след като компилираш проекта щракаш на "View RTL Schematic" .
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Вто Авг 23, 2005 12:46 pm |
|
|