Xilinx ISE Tutorial L obiettivo di questo tutorial è il mappaggio di una semplice porta logica AND su una particolare FPGA, la Xilinx Spartan 3E, integrata nella board Digilent Nexys 2 500K, che utilizzeremo come riferimento per le nostre successive esercitazioni. Per far ciò è di fondamentale importanza fissare alcune nozioni di base per l utilizzo del tool Xilinx ISE, che saranno utili per l esecuzione di progetti di maggiore complessità. Prima di tutto, eseguiamo Xilinx ISE 10.1 effettuando un doppio click sull icona posizionata sul desktop della macchina virtuale e creiamo un nuovo progetto da File -> New Project.... A questo punto è necessario specificare il nome e la directory del progetto, utilizzando il valore di default (HDL) come Top Level Source Type: 1
Lo step successivo è la definizione su ISE delle caratteristiche dell FPGA che utilizzeremo per la sintesi del sistema, che andremo a descrivere sottoforma di codice verilog. Nel nostro caso, è necessario utilizzare la seguente configurazione per la Digilent Nexys 2: Saltiamo i successivi due step, cliccando su Next, e terminiamo la creazione del progetto. Nel caso in cui si vogliano effettuare delle modifiche alle proprietà dell FPGA, lo si può fare dalla sezione Sources, che compare in alto a sinistra nella finestra di Xilinx ISE, cliccando col tasto destro del mouse su xc3s500e-4fg320 ->Properties... oppure direttamente da Source -> Properties. Per descrivere il design, aggiungiamo una serie di file Verilog al progetto da Project -> New Source... mentre se si desidera integrare alcuni file già esistenti, creati ad esempio tramite ModelSim, lo si può fare da Project -> Add Copy of Source... specificando il path di questi ultimi. Nel caso in esame, creiamo un nuovo file di tipo Verilog Module, lo nominiamo (tipicamente viene creato un file verilog per ogni modulo del progetto, utilizzando come nome l identificativo del modulo) e lo integriamo nel progetto, mantenendo il path di default: 2
Andiamo avanti nei successivi step, terminando la creazione del modulo verilog, dato che risulta consigliabile definire l interfaccia del modulo direttamente tramite codice verilog. L altra possibilità offerta da ISE è quella di specificare l interfaccia del modulo verilog tramite la seguente schermata. In questo modo il tool si occupa di generare automaticamente il relativo codice verilog, lasciando poi al progettista il compito di definire l implementazione di tipo strutturale o RTL del modulo. Nel nostro caso, ad esempio, desideriamo instanziare una semplice porta logica AND a due ingressi, a singolo bit, quindi il top module avrà la seguente interfaccia (nel caso di ingressi o uscite a bus, è necessario definire l MSB ed l LSB): A questo punto, nella sezione Sources, comparirà il file appena creato, identificato da un simbolo a piramide che indica al progettista il fatto che tale modulo coincida con il top module del sistema: Effettuando un doppio click col tasto sinistro del mouse su top_module.v viene editato il file e sarà possibile specificare direttamente l implementazione del modulo, come è stato fatto in precedenza su ModelSim. Il codice verilog risultante è mostrato nella seguente figura: 3
Per verificare la correttezza dell implementazione del modulo o, nel caso di sistemi di maggiore complessità, dell intero progetto è necessario cliccare prima sul top module del sistema nel pannello Sources e poi nella sezione Processes -> Synthesize XST -> Check Sintax. Nel caso in cui il tool non dia esito positivo, verranno indicati sulla console degli errori delle informazioni utili che motivano l errata compilazione del codice ed il progettista dovrà apportare le necessarie modifiche. È fondamentale non trascurare l importanza dei Warning che potranno eventualmente comparire nella relativa console. Questi sono presenti tipicamente nel caso in cui il progettista abbia fornito un implementazione compilabile e quindi realizzabile fisicamente ma al tempo stesso possono rappresentare degli indicatori di una non corretta progettazione del sistema, valutabile tramite un opportuno testbench. ISE permette di valutare lo schematico RTL estratto a partire dal codice verilog tramite Synthesize XST -> View RTL Schematic e quello, a più basso livello, che utilizza le celle della libreria tecnologica associata all FPGA in considerazione tramite Synthesize XST -> View Technology Schematic: RTL Schematic Technology Schematic Sarà quest ultimo schematico quello utilizzato da ISE nel momento in cui verrà configurata l FPGA, effettuando il mapping del sistema sulle celle disponibili. 4
Come per ModelSim, anche il tool ISE della Xilinx permette di associare a ciascun modulo del sistema un determinato testbench, cliccando su Project -> New Source..., inserendo un file di tipo Verilog Test Fixture ed associandolo al modulo verilog da testare: A questo punto, selezioniamo Behavioral Simulation nel menù a tendina Sources for del pannello Sources, effettuiamo un doppio click col tasto sinistro del mouse sul testbench appena creato e stabiliamo le varie combinazioni dei segnali di input del modulo da testare. Per poter valutare l andamento delle forme d onda è necessario utilizzare ModelSim. ISE permette il collegamento diretto a tale tool di simulazione, cliccando su Simulate Behavioral Model, come mostra la precedente figura. Dopo aver verificato la correttezza delle forme d onda, è ora possibile passare ai successivi step di design che hanno come obiettivo il mapping del sistema sull FPGA di 5
riferimento ovvero sulla Xilinx Spartan 3E integrata nella Digilent Nexys 2. Per far ciò bisogna assegnare ai due ingressi ed alla singola uscita del modulo da testare, tre pin della board: nel caso in esame i due ingressi sono associati a due switch della scheda (SW0 e SW1: rispettivamente pin G18 e H18) mentre l uscita coincide con il led LD0 (pin J14) che si accenderà soltanto nel caso in cui entrambi gli switch vengano posti al valore logico alto. Questo può essere fatto inserendo nel progetto un nuovo file da Project -> New Source... -> Implementation Constraints File (.ucf): Le constraints per l assegnazione dei pin possono essere definite tramite la seguente lista di direttive, inserite nel file ucf appena creato: NET "a" LOC = "G18" ; NET "b" LOC = "H18" ; NET "y" LOC = "J14" ; oppure direttamente da interfaccia grafica utilizzando Xilinx PACE, cliccando nel pannello Processes su User Constraints -> Floorplan Area / IO / Logic Post Synthesis e definendo la posizione dei segnali d IO nel seguente modo: Se si sbaglia la procedura per fissare le constraints, il componente ha buone/ottime probabilità di bruciarsi! Per questo BISOGNA verificare che gli assegnamenti siano stati rispettati, andando a leggere il Pad Report da Implement Design -> Place&Route. A questo punto il nostro obiettivo è generare un Programming File (.bit) in modo da configurare correttamente l FPGA. Per poter ottenere tale file è necessario eseguire le seguenti successive fasi, selezionabili sul pannello Processes: 6
Synthesize - XST: Completamento fase di sintesi, tramite la generazione del modello per la simulazione del sistema in post-sintesi; Implement Design: viene effettuato il mapping del sistema, descritto sottoforma di codice verilog e tradotto in netlist (insieme di porte logiche elementari) dal tool nella fase di sintesi, sull FPGA; Generate Programming File: generazione del file bitstream di configurazione della Spartan 3E. È importante definire come la fase di sintesi abbia lo scopo di tradurre l eventuale implementazione RTL del sistema in uno stile di tipo strutturale, secondo il quale si ha una serie di porte logiche e celle standard, rese disponibili dall FPGA in considerazione, connesse in modo da ottenere la funzionalità logica desiderata. Il risultato del mapping del sistema sull FPGA può essere valutato tramite Implement Design -> Place&Route -> View/Edit Routed Design (FPGA Editor). Nel caso i vari step di design non diano esito positivo, è necessario analizzare i vari report generati e valutare le cause degli Errors/Warnings che vengono mostrati man mano nella relativa console, apportando le necessarie modifiche al codice verilog del sistema ed al file ucf in modo da ottenere la corretta configurazione. La conclusione della realizzazione del progetto sta nella programmazione della board Digilent Nexys 2 utilizzando il bitstream creato da ISE. La correttezza del sistema può essere valutata variando la posizione dei due switch, SW0 e SW1, e verificando la funzione logica ottenuta, osservando per quali valori dei segnali d ingresso il led LD0 risulta acceso. 7