ід синхронізації зовнішня: input;, synch12, synchres: output;
BUSTRI [27.0]: bidir;
Керуючі сигнали ОЗУ, OE, WE, WEres: output;
), clk16, clk32, ADread: node;- -деленіе Частоти на 2,16,32
Перший крок - реалізація дільника частоти. Коефіцієнти розподілу
визначаємо з умов завдання. Вхідну частоту clock приймаємо
рівній вихідній частоті АЦП - 40 МГц=lpm_counter (. clock=clock) with (lpm_width=2, lpm_modulus=3) (. cout); res=dff (clk2 ,! clock, vcc, vcc );=lpm_counter (. clock=clock) with (lpm_width=5, lpm_modulus=17) (. cout); res=dff (clk16 ,! clock, vcc, vcc);=lpm_counter (. clock=clock) with (lpm_width =6, lpm_modulus=33) (. cout); res=dff (clk32 ,! clock, vcc, vcc); [2.0]=(clk32res, clk16res, clk2res);=mux (. data []=ADclockMUX [],. sel []=clkchoose []) with (width=3, widths=3) (. result);
Другий крок - реалізація ОЗУ. На вході модуля ОЗУ присутсвуют 2 шини
шина адреси і шина даних. ША визначає режим роботи модуля - запис або
читання. За ШД надходять дані.
ШИНА АДРЕСИ=lpm_counter (. clock=clock) with (lpm_width=2, lpm_modulus=2) (. cout); _ addr [1.0]=(ADread, ADclock); _ address=mux (. data []=clk_addr [] ,. sel=WR) with (width=2, widths=1) (. result);
sinh внутрішня=lpm_compare (. dataa []=ram_in [] ,. datab []=compare []) (lpm_width=28) returns (. ageb);
синхронізація зовнішня + - -=tff (vcc, synchinput, vcc, vcc);=synh or synchinput1;=dff (synch12, synch12, vcc, vcc);
------------------------------=tff (vcc, WR, lcell (! (! (! counterclearinp))), vcc); _ ram []=lpm_counter (. clock=clk_address ,. cnt_en=synchres ,. aclr=counterclearinp) (lpm_width=5, lpm_modulus=17) (. q []);
Сигнал переполненія_addr=lpm_counter (. clock=clk_address ,. cnt_en=synchres) with (lpm_width=5, lpm_modulus=17) (. cout); _ full=dff (cout_addr ,! clk_address, vcc, vcc );
-------------------------=tff (vcc ,! ram_full, vcc, vcc); _ in - ОЗУ
Дані направляються з АЦП в ОЗУ, а з ОЗУ на інтерфейс при переповненні ОЗУ. За це відповідає bustri
Lmp_bustri ZZZZZ це значення які зчитуються з ОЗУ, так як програмно ми їх не задаємо,
то в симуляторі не можемо їх бачити []=lpm_bustri (. data []=ram_in [] ,. enabledt =! WR) (LPM_WIDTH=28) RETURNS (. tridata []);
Керуючі сигнали ОЗУ=b 0 raquo ;; =! tff (vcc, WR, vcc, vcc);=dff (vcc ,! clk_address, lcell (! (! (! (! (! WE and OE))))), vcc); =! WE ;;
Рис. 1 - Вибір частоти і синхронізація
Рис. 2 - Лічильник адреси та керуючі сигнали ОЗУ
Рис. 3 - Загальний вигляд
Текст файлу - конфігурації, описує роботу інтерфейсу RS485 laquo;lpm_shiftregraquo;;laquo;lpm_muxraquo;;laquo;busmuxraquo;;laquo;lpm_counterraquo;;laquo;mux. inc raquo ;; RS485
(_out [13.0], clock, sel: input; [8.0], data2 [8.0], data [17.0], clkRS485, clkread, clkRS485res, out, load1, out2, outrez, MUXout [ 1.0]: output; _out2 [13.0]: input; [8.0], data22 [8.0], data2rez [17.0]: output;
), clkposled: node;=lpm_counter (. clock=clock) with (lpm_width=8, lpm_modulus=134) (. cout); res=dff (clkRS485, clock, vcc, vcc); =lpm_counter (. clock=clkRS485res) with (lpm_width=5, lpm_modulus=19) (. cout);=(gnd, ram_out [6.0], vcc);=(gnd, ram_out [13.7], vcc); [8.0] =data1 [8.0]; [17.9]=data2 [8.0];=clkread;=(gnd, ram_out2 [6.0], vcc);=(gnd, ram_out2 [13.7], vcc); rez [8.0]=data12 [8.0 ]; rez [17.9]=data22 [8.0];=lpm_shiftreg (. data []=data [] ,. clock=clkRS485res ,. load=load1) (lpm_width=18) returns (. shiftout);=lpm_shiftreg (. data []=data2rez [] ,. clock=clkRS485res ,. load=load1) (lpm_width=18) returns (. shiftout); [1.0]=(out, out2);=mux (. data []=MUXout [],. sel []=sel) with (width=2, widths=1) (. result) ;;
Рис. 4 - Опис роботи приймача інтерфейсу RS485