Periféria illesztési példák áramkörön belüli buszra (kiegészítés az előadás vázlathoz) Benesóczky Zoltán (2017)
Periféria illesztés mikroprocesszoros buszra (áramkörön belüli szinkron busz esetén) KÓDMEMÓIA ADD DATA pmem2cpu_data cpu2pmem_addr gen. gen. arbit. log. bus_grant ADAT MEMÓIA (0x00-0x7f) ÉS PEIFÉIA (0x0-0xff) TEÜLET IQ DOU (cpu2dmem_data) perif.tól DIN (dmem2cpu_data) ADD (cpu2dmem_addr) PC LD E counter MUX Z,C,N,V, IE,IF STACK push pop 14 I E MUX1 WdX WEX EG. TÖMB (0-15) AddrX AddrY POCESSZO ADATSTUKTÚA 0x00 () 0x01 stack (IT) ugr.cím FLAGSfromStack IE IF VEZÉLÉS dx konstans ugr.cím dy MUX2 FLAGSfromStack MUX FSM FETCH->DECODE->EXECUTE->(IT) FELTÉTEL JELEK OP1 ALU OP2 FLAG Z C N V POCESSZO VEZÉLÕ MiniISC processzor feltétel jelekhez
Áramkörön belüli busz (pl. FPGA-ban megvalósított és perifériák esetén) a busz felület óra gen. ESET gen. MiniISC busz felület bus_grant IQ DIN[7:0] ADD vezérlõ busz írás a mem/per.-ba mov addr1, 1 írás execute fázis addr1 cím busz adat busz olvasás mem/per.-ból mov 2, addr2 olv. execute fázis addr2 DOU 0x00 1 0x00 0x00 DIN 0x00 0x00 (addr2) 0x00
A perifériák tipikus programozói felülete busz illesztés periféria funkció B U S Z DIN DOUT ADD IQ ADAT EGISZTE(EK) ÁLLAPOT EGISZTE PAANCS EGISZTE(EK) ÜZEMMÓD EGISZTE(EK) konkrét periféria funkciót megvalósító egység külvilághoz csatlakozó jelek Üzemmód regiszter: A periféria működési módjának beállítására szolgál. Egy-egy periféria egy adott feladatcsoport megoldását teszi lehetővé konfigurálható üzemmódok segítségével (pl. egy timer egységgel időzítési, számlálási, impulzus generálási feladatok oldhatók meg). Parancs regiszter: A periféria valamely működését lehet vele kezdeményezni. Pl. A/D konverzió indítása. Sokszor az üzemmód és parancs reigsztert összevonják és vezérlő regiszternek nevezik. Állapot (státus) regiszter: A periféria állapotáról ad információkat. Az állapotregiszter bitjei ún. megszakítást is kérhetnek, ha az engedélyezett. Adat regiszter: Ide kell beírni itt lehet kiolvasni az adatot (nem feltétlenül ugyanazt, amit beírtunk).
Kimeneti port regiszter illesztése Mini ISC processzorhoz 1 kimeneti regiszter esetén (a periféria 1 címet foglal) MiniISC busz felület DIN[7:0] cím komparátor bus_grant IQ COMP peiféria cím (pl. 0x0A0) Írási ciklus: mov r0, #adat1 mov, r0 execute fázis = EG0_ ADD[7-0] adat1 ld D Q EG0 OUT adat1 EG0_ DOUT[7-0] adat1 OUT[7-0] adat1
Egy címmel rendelekező írható periféria illsztése cím felismerése konstans komparátorral: A7-A0 konstans komparátor AND kapuval: A7-A0 konstans komparátor jelölése: komp = =0xa0 periféria cím: 0xa0 Írási ciklus: mov 0, #adat1; 1<-adat1 mov,0; execute fázis proc címbusz: A7-A0 parameter BASE_ADD = 'HA0; assign = ADD == BASE_ADD; assign EG0_ = & ; A7-0 =0xa0 írás után EG0 = adat1 adat1 EG0_ Ld EG0 always @(posedge ) if() EG0 <= 'H00; else if(eg0_) EG0 <= DOUT; CLK EG0_ DOUT7-0 adat1 DOUT7-0 (processzor kimeneti adat busz) adat1 OUT7-0 adat1
Kimeneti port, regiszter illesztése Mini ISC processzorhoz 2 kimeneti regiszter esetén (a periféria 2 címet foglal) MiniISC busz felület DIN[7:0] cím komparátor bus_grant IQ A0 ADD[7:1] 7 COMP = 7 bázis cím[7:1] (pl. 0x0A01>>1) =0 ~A0 assign = (ADD>>1) == (BASE_ADD>>1)); assign EG0_ = &~A0 & ; assign EG1_ = & A0 & ; A0 =1 A0 EG0_ ld OUT0 D Q EG0 EG1_ ld OUT1 D Q EG0
Bemeneti port illesztése Mini ISC processzorhoz 1 adat forrás esetén (a periféria 1 címet foglal) bus_grant IQ mov r0, Olvasási ciklus: execute fázis ADD[7-0] DIN[7:0] P0_DATA MPX OU bemeneti adatbusz multiplexer (elosztva alakítjuk ki) s0 I0 s1 I1 P1_ MiniISC busz felület P1_DATA COMP = P0_ P0_DATA cím komparátor peiféria cím (pl. 0x0A0) 1 címet foglaló bemeneti periféria illesztése P0_ DIN[7-0] () sn In Px_ Px_DATA 0 P0_DATA
Bemeneti port illesztése Mini ISC processzorhoz 1 adat forrás esetén (a periféria 1 címet foglal) MiniISC busz felület bus_grant IQ DIN[7:0] COMP = 0 cím komparátor peiféria cím (pl. 0x0A0) mov r0, Olvasási ciklus: execute fázis ADD[7-0] P0_DATA adatbusz multiplexer DIN[7] DIN[6] DIN[5] DIN[4] DIN[3] P0DO[7] P0DO[6] P0DO[5] P0DO[4] P0DO[3] P0_ P0_DATA Elosztott multiplexer: Az adatbusz MPX O kapuit a processzorhoz, AND kapuit a perifériákhoz rendeljük P0_ DIN[2] P0DO[2] DIN[7-0] 0 () 0=P0_DATA DIN[1] DIN[0] P0DO[1] P0DO[0] elosztott MPX logika részlete másik perifériához tartozó bemeneti csatorna AND kapuiról (melyek kimenete most 0x00)
Bemeneti port illesztése Mini ISC processzorhoz 1 adat forrás esetén (a periféria 1 címet foglal) Egyszerűsített busz O és közös engedélyezésű busz AND jelöléssel bus_grant IQ mov r0, Olvasási ciklus: execute fázis ADD[7-0] MEM_DOU DIN[7:0] P0_DATA P1_DOU P0_DOU = P0_DATA MiniISC busz felület COMP = DATA_ cím komparátor peiféria cím (pl. 0x0A0) P0_DATA 1 címet foglaló bemeneti periféria illesztése P0_ DIN[7-0] () 0 P0_DATA
Bemeneti port illesztése Mini ISC processzorhoz 2 adat forrás esetén (a periféria 2 címet foglal) - Kódolatlan select-tekkel rendelkező multiplexert használva bus_grant IQ mov r0, Olvasási ciklus: execute fázis ADD[7:1] DIN[7:0]= P0_DATA0 MiniISC busz felület A0 P0_0 7 cím komparátor COMP = 7 bázis cím [7:1] (pl. 0x0A0 >>1) DEKÓDE ADD[7-0] P0_ 0xA1 P0_DOU P1_DOU MEM_DOU s0 P0_DATA0 I0 OU P0_1 s1 I1 P0_DATA1 MPX (dek=dolatlan s bemenetekkel) DIN[7-0] 0 () P0_DATA0 2 címet foglaló bemeneti periféria illesztése
Bemeneti port illesztése Mini ISC processzorhoz 2 adat forrás esetén (a periféria 2 címet foglal) - Kódolt select-tel rendelekező multiplexert használva bus_grant IQ mov r0, 0xA1 Olvasási ciklus: execute fázis ADD[7-0] 0xA1 P0_ DIN[7-0] (0xA1) DIN[7:0]=P0_DATA1 P1_DOU MEM_DOU P0_DOU 0xA1 MiniISC busz felület A0=1 s cím komparátor 7 COMP = 7 peiféria cím (pl. 0x0A0) OU e I0 I1 P P0_DATA0 P0_DATA1 MPX (dekódolt s bemenettel) 2 címet foglaló bemeneti periféria illesztése 0 P0_DATA1
4 címet foglaló periféria illesztése: parancs (/), státus (), adat ki (), adat be () 0xa0 0xa1 0xa2 0xa3 assign = ((ADD >>2) == (BASE_ADD>>2)); A7-A2 =BASE_ADD[7:2] parameter BASE_ADD = 'HA0; A7 A6 A5 A4 A3 A2 A1 A0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 A1A0 =0 0 1 1 0 1 1 W/ W COMAND STATUS DATA_OUT parameter DATOU_ADD = 2'b10; DATA_IN COMM_ parameter COMM_ADD = 2'b00; parameter STAT_ADD = 2'b01; parameter DATIN_ADD = 2'b11; COMM_ egyéb slave-ekhez COMMAND Ld EG assign COMM_ = & & ({A1,A0} == COMM_ADD); DATOU_ DATA_OUT Ld EG always @(posedge ) if() COMMAND <= 0x00; always @(posedge ) if() DATA_OUT <= 0x00; else else if(comm_) COMMAND <= DOUT; if(datou_) DATA_OUT <= DOUT; egyéb slave-ektől PD POCESSZO ESET CLK DOUT7-0 DIN7-0 BÁZISCÍM KOMPAÁTO =1 =2 =3 PAANCS DEKÓDE COMM_ STAT_ assign COMM_ = & & ({A1,A0} == COM M_ADD); assign STAT_ = & & ({A1,A0} == STAT_ADD); DATOU_ assign DATOU_ = & & ({A1,A0} == DATOU_ADD); DATIN_ assign DATIN_ = & & ({A1,A0} == DATIN_ADD); S0 I0 S1 MPX COMM_ COMMAND STATUS DATA_IN STAT_ DATIN_ I1 S2 always @(*) case ({COMM_,STAT_, DATIN_}) 3'b100: PD <= COMMAND; 3'b010: PD <= STATUS; default: PD <= 'h00; endcase I2 3'b001: PD <= DATA_IN;
GPIO általánios célú be/kimeneti port GPIO A felépítése x I_O parameter BASE_ADD = 'HA0; A7 A6 A5 A4 A3 A2 A1 A0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 /W /W OUT_EG IN_EG DI_EG BUFF E OUT_EGi DI_EGi IN_EGi OUT_EG parameter OUT_ADD = 2'b00; Ld OUT_EG CLK Ld parameter IN_ADD = 2'b01; parameter DI_ADD = 2'b10; OUT_ DI_ DI_EG DI_EG CLK IN_EG IN_EG always @ (posedge ) IN_EG <= I_O; DOUT7-0 A7-A2 =BASE_ADD[7:2] assign = (ADD >>2) == (BASE_ADD >> 2) ; másképp is lehet: assign = ADD[7:2] == BASE_ADD[7:2]; A1A0 =0 =1 =2 =3 OUT_ assign OUT_ = & & ({A1,A0} == OUT_ADD); OUT_ assign OUT_ = & & ({A1,A0} == OUT_ADD); IN_ assign IN_ = & & ({A1,A0} == IN_ADD); DI_ assign DI_ = & & ({A1,A0} == DI_ADD); DI_ always @ (posedge ) if() OUT_EG <= 0x00; else if(out_ OUT_EG <= DOUT; assign DI_ = & & ({A1,A0} == DI_ADD); always @ (posedge ) if() DI_EG <= 0x00; else if(di_ DI_EG <= DOUT; SI0 I0 adatok egyéb perifériáktól SI1 MPX OUT_ OUT_EG IN_EG DI_EG IN_ DI_ I1 SI2 always @ (*) case ({OUT_,IN_, DI_}) I2 3'b100: DIN <= OUT_EG; 3'b010: DIN <= IN_EG; 3'b001: DIN <= DI_EG; default: DIN <= 'h00; endcase POCESSZO DIN7-0 CLK
TIME egység blokkvázlata (cím és parancs dekódolók nélkül) DIN7-0 IQ (TIT) SI0 I0 MPX SI1 I1 TIE TOUT tm_rd TM ts_rd STÁTUSZ: TIT, TPS2-0, 0, TOUT, TEP, TEN Q S tmr_cnt_tc Q E TM lefele számláló LD LD0xff D ps_tc PS elõosztó ps_cnt_clr E ts_rd TPS2-0 tc_wr TPS2-0 TEP TIE TC LD parancs reg. DO7-0 I0 MPX T T LD kezdõérték reg. LD0xff DO7-0 I1 s DO7-0 TEN Q TEP ciklikus üzemmód tr_wr Timer engedéyezés (parancs reg) TC LD D DO0 tc_wr D7 D6 D5 D4 D3 D2 D1 D0 parancs regiszter TC: TIE TPS2 TPS1 TPS0 - TEP TEN státus regszter TS: TIT TPS2 TPS1 TPS0 0 TOUT TEP TEN TPS2-0: 000 001 010 011 100 101 110 111 előosztás: 1 16 64 256 1024 4096 1634 65536 Periódusidő (frekvencia) ha f: 16MHz 1/16 us (16MHz) 1 us (1MHz) 4 us (250kHz) 16 us (62500Hz) 64 us (15625Hz) 256 us (3906.25Hz) 1024 us (976.5625Hz) 4096 us (244.141Hz)
UST blokkvázlata (cím és parancs dekódolók nélkül) rxfull rxne FULL EMPTY rx_data FIFO clr rd_data rx_valid UST VEVÕ XCL XEN ST LD3ff SH(10bit) STP SI E DO3 ctrl_wr XD FALL éldetektáló SCLK ISE s_rise 1 LD3ff E SI SH(9bit) SH 0 SO LD TXEN TXD UST ADÓ txnf tx_empty FULL EMPTY FIFO clr tx_empty tx_ld TC cnt10 CL s_rise TXCL E LD9 ctrl_wr DO2 tx_adat wr_data D7 D6 D5 D4 D3 D2 D1 D0 parancs regiszter UC: - - - - XCL TXCL XEN TXEN státus regszter US: 0 0 0 0 XFULL XNE TXNF TXEMPTY IT engedélyezés UIE 0 0 0 0 XFULL XNE TXNF TXEMPTY
Két maste rendszer mintapélda, MiniISC processzor és DMA vezérlő (DMC) Perifériák Perifériák, adat memória IQ kiementeirõl adat kimeneteirõl vezérlõbusz CLK ST kimeneti adat busz címbusz mst2slv_data DOUT ADD in adatbusz slv2mst_data cpu2slv_addr dma2slv_addr cpu2slav_data dma2slv_data DMA_IQ IQ DIN ADD DOUT DOUT_M M_ADD _M _M DIN_M DIN DOUT cpu_bus_rq dma_bus_rq bus_rq bus_rq ABITE miniisc CPU cpu_bus_grant dma_bus_grant DMC bus_grant bus_grant ADD IQ CLK ST CLK ST