Mérési jegyzőkönyv az ötödik méréshez
A mérés időpontja:
2007-10-30
A mérést végezték:
Nyíri Gábor kdu012 mérőcsoport
A mérést vezető oktató neve: Szántó Péter A jegyzőkönyvet tartalmazó fájl neve: ikdu0125.doc
Felhasznált eszközök: Eszköz megnevezése
Az eszköz típusa
PC számítógép Mérőpanel
Azonosító száma GEP 12
SPARTAN3
12
1 Feladat definíció (Soros adó egység) Realizálás: FPGA mérőpanelen A soros adó egység start és stop bittel keretezett, speciális karakterpárosokat ad a panel aszinkron soros portjának TXD vonalán az RS232/V24 szabvány előírásainak
megfelelően. (A Start bit 0 értékű, a Stop bit 1 értékű, a megfelelő jelszinteket az FPGA panelbe épített szintkonverter áramkör biztosítja.). Az adást a BTN1 gomb megnyomása indítja, az adást a BTN2 gomb megnyomása leállítja. (A BTN2 megnyomásakor éppen adott karakter adását teljesen befejezi.) Az egység minden Start bitnél kiad egy 1 bit hosszóságú impulzust a soros port RTS vonalán.
Az adatátvitel paraméterei:
Az egység az SW2 kapcsoló állapotától függően 0101010(1) vagy 1010101(0) karaktert ad folyamatosan egymás után. A karakterek az SW4 kapcsoló OFF állásában 7 bitesek, ON állásában 8 bitesek. A stop bitek száma 2. A Baud-rate 4800 vagy 9600, értéke az SW8 kapcsolóval választható.
2 Funkcionális tömbvázlat RTS B IT C [3 :0 ]
S ta r t dM ode
BR
Reset
CLK
B it - C o u n t e r
S to p
bMode
CLK
Reset
B a u d -ra te g e n e ra to r
B it - m p x
BR
TXD
3 Modulok 3.1 Top modul A top modul feladata, hogy az egyes modulok közti összeköttetéseket létrehozza, illetve ez állítja elő minden start bit alatti RTS jelet is. Ennek a modulnak hat bemente van: CLK órajel, BTN1 ami indítja az adást, BTN2 ami leállítja, SW2 ami a két különböző küldendő adat bájtot választja ki, SW4 ami az adatbitek számát állítja illetve SW8 ami a baudrate-et határozza meg. A kapcsolók egyes állapotaihoz tartozó értékek a forráskód elején olvashatóak. /* BTN1
start
BTN2
stop
SW2
ON: 0101 010(1)
OFF: 1010 101(0)
SW4
ON: 8 data bits
OFF: 7 data bits
SW8
ON: 4800 baud
OFF: 9600 baud
+ 2 stop bits */ `timescale 1ns / 1ps module top(CLK, BTN1, BTN2, BTN4, SW2, SW4, SW8, TXD, RTS, bitcounter, BR); // input CLK, BTN1, BTN2, BTN4, SW2, SW4, SW8; output TXD, RTS; // for testing output [3:0] bitcounter; output BR; // ----------wire [3:0] bitcounter;
assign Reset = BTN4; assign Start = BTN1; assign Stop = BTN2; assign dMode = SW2; assign Bits = SW4; assign bMode = SW8;
// Reset
assign RTS = bitcounter == 4'd01;
// RTS-t kell kiadni a start bit alatt
baudrate Baudr_gen (CLK, Reset, bMode, BR); bcount Bit_counter (CLK, Reset, Start, Stop, Bits, BR, bitcounter); mpxb Bit_mpx (dMode, TXD, bitcounter); endmodule
3.2 Baudrate Ez a modul állítja elő a rendszer órajelből leosztott BR engedélyező jelet, melynek segítségével már biztosított a megfelelő ütemezés a soros adáshoz. A baudrate modulnak három bemenő és egy kimenő vonala van: CLK órajel, Reset, bMode ami megadja a baudrate értékét és a BR kimenő impulzus. /* Mode == 0
9600 Baud
Mode == 1
4800 Baud
*/ module baudrate(CLK, Reset, bMode, BR); input bMode; input Reset; input CLK; output BR;
reg [15:0] Q = 16'd0; reg CY = 0;
always @(posedge CLK) begin if(bMode == 0) //CY = (Q == 16'd5208); CY = (Q == 16'd1);
// 9600 Baud // for testing
if(bMode == 1) //CY = (Q == 16'd10416); // 4800 Baud CY = (Q == 16'd2);
if (Reset | BR) Q <= 16'd0;
// for testing
else Q <= Q+1; end
assign BR = CY;
endmodule
3.3 bCount A bCount modul állítja elő a bit-multiplexernek szükséges címet, mellyel kiválasztja a soron következő küldendő adatbitet. Ennek a modulnak hat bemenő és egy kimenő paramétere van: a CLK órajel, a Reset, a Start melyre elindul illetve Stop, melyre egy teljes ciklus után leáll a számlálás, a Bits, mely meghatározza, hogy kihagyja e a számlálás során ez egyik bitet vagy sem és a BR engedélyező jel, mely a soros adáshoz szükséges megfelelő ütemezést végzi. Mindezekhez egyetlen kimenet társul: a bitcounter, mely egy négybites busz, ami a bit-multiplexert címzi meg egy külső modulban. A mindenkori teljes ciklusokat – a Stop jel ellenére is – egy started regiszter és a bitcounter regiszterek együttesen biztosítják. A started regiszter a Start jel hatására minden esetben egybe, míg a Stop jel hatására nullába íródik, ezzel tiltva a számláló következő ciklusba lépését – ezzel a módszerrel nem szükséges a nyomógombok pergésével foglalkozni, mivel legfeljebb többször egybe illetve nullába írja a regisztert rövid idő alatt. A számláló akkor áll meg, ha a started jel és a bitcounter jelek együttes értéke nulla. Ezáltal minden esetben biztosítottá vált a teljes keret átküldése. module bcount(CLK, Reset, Start, Stop, Bits, BR, bitcounter); input CLK, Reset, Start, Stop, Bits, BR; output [3:0] bitcounter; reg [3:0] bitcounter; reg started = 0;
always @(posedge CLK) begin if (Start) started <= 1;
if (Stop) started <= 0;
if (Reset) begin bitcounter <= 0; end else begin if (BR && (started | bitcounter != 0)) begin if (bitcounter < 10) begin if (bitcounter == 8)
begin if (Bits) bitcounter <= bitcounter + 2; else bitcounter <= bitcounter + 1; end else begin bitcounter <= bitcounter + 1; end end else begin bitcounter <= 0; end end end end endmodule
3.4 Bit-mpx A bit-mpx modul állítja elő a kimeneti adatbiteket a bitcounter értékének megfelelően. A dMode paraméter határozza meg, hogy a specifikációban meghatározott két adatbájt közül melyiket fogja küldeni az eszköz. module mpxb(dMode, OUT, bitcounter); input [3:0] bitcounter; input dMode; output OUT; reg OUT; reg [7:0] Data;
always @(dMode) begin if (dMode) Data <= 8'b01010101; else Data <= 8'b10101010; end always @(bitcounter or Data) begin case (bitcounter) 4'd00 : OUT = 1;
// Stop
4'd01 : OUT = 0;
// Start bit
4'd02 : OUT = Data[0]; // data bit 1 4'd03 : OUT = Data[1]; // data bit 2 4'd04 : OUT = Data[2]; // data bit 3 4'd05 : OUT = Data[3]; // data bit 4 4'd06 : OUT = Data[4]; // data bit 5 4'd07 : OUT = Data[5]; // data bit 6 4'd08 : OUT = Data[6]; // data bit 7 4'd09 : OUT = Data[7]; // data bit 8 4'd10 : OUT = 1; default : OUT = 1; endcase end endmodule
// Stop bit 1
4 Tesztelés 4.1 Szimuláció Mint az a következő ábrán is látszik, a Start gomb megnyomására elindul a számlálás, ezzel együtt az adás is. A példában a Start jelet gyorsan követi egy Stop jel annak vizsgálatára, hogy a keretet ennek ellenére teljesen átküldi e. A keret végével a TXD vonal egyben mara.
A következő ábrán látszik, hogy a Start jellel elindított adás rendben ciklikusan ismétlődik, mivel jelen példában Stop jelet nem adtunk ki. Megfigyelhető továbbá az RTS jel aktivitása is minden Start bit esetén egy órajel hosszúságban.
4.2 Soros adás tesztelése A teszteléshez az FPGA lábkiosztását úgy állítottuk be, hogy a top modul tesztelésre szolgáló jelei – BR és RTS – a panelon található ledeken megjelenjenek, majd letöltöttük a programot a Spartan-3 mérőpanelba és elindítottuk a tviso.exe alkalmazást, ahol a gombok és kapcsolók segítségével paraméterezett eszköz elvárt működéséhez beállított terminál a várt karaktereket jelenítette meg – természetesen minden lehetséges beállítással teszteltünk.
A laborvezető a teszteket ellenőrizte és megfelelőnek találta.
5 Melléklet