Vai al contenuto
PLC Forum


Logiche programmabili - VHDL


accacca

Messaggi consigliati

Lo avevo promesso .... e ora inizio .. vediamo se dura...

Volevo iniziare spiegando come installare e usare l'ambiente XILINX su PC ma c'è un problema... quello gratuito che uso io non funziona da win8 in su.

Si può provare in emulazione ma leggevo in rete di problemi con le porte USB. Quindi inutile spiegare come si utilizza un programma intuilizzabile da chi non ha più un pc con XP...C'è però un'alternativa: il programma dovrebbe funzionare con linux Secondo me sarebbe una bella soluzione ma sinceramente non ho ancora fatto nulla....

Vi racconto del VHDL nulla di esaustivo, rigoroso o completo. Come si fa dagli alcolisti anonimi racconto la mia esperienza, probabilmente scriverò anche sonore scemenze. Segnalate e sistemo NON sono un guru del settore riesco solo a galleggiare.

Per chi non lo sa VHDL è uno dei possibili linguaggi, un alternativa che conosco di nome è Verilog. Per quello che so io VHDL ha un formalismo pesante mentre Verilog no (e mi sembra che lo usino tutti i bravi...un po come il C per i micro) Io invece ho deciso per VHDL perchè a suo tempo iniziando dal nulla i serviva un "maestro" rigoroso.

Cominciamo a scandalizzare i puristi: io vengo dalla programmazione micro e spesso farò paragoni con il mondo micro. Più volte si legge nei forum dedicati alle logiche programmabili che scrivere codice per micro non è la stessa cosa che usare un linguaggio per "descrivere l'hardware". sarà anche vero ma io ho trovato tante analogie che tirerò fuori al bisogno scusandomi con i puristi. 

Struttura del codice VHDL

Siccome lo scopo è quello di descrivere un circuito hardware si inizia con la descrizione dei suoi pin in VHDL si fa così:

entity NOME is

end NOME;

tutto quello che c'è in mezzo è l'interfaccia verso l'esterno (i pin) del vostro hardware NOME è un nome a piacere che identifica l'hardware

Esempio (ne prenederò a montagne da internet)

entity AND is
port (
  A, B, C, D: in  STD_LOGIC ;
  F         : out STD_LOGIC
);
end AND;

Definizione di AND a 4ingressi (notare la montagna di punteggiature e attenzione: l'ultima riga della dichiarazione non mettere mai il ; altrimenti vi genera un errore)

Mi sembra chiaro come si definiscono i "pin" di input e di output il termine STD_LOGIC definisce il tipo di segnale.

In realtà manca un cappello al discorso come in C esistono tipi e dati predefiniti che si includono al biosgno dichiarando l'include di alcuni file dal nome standard (stdio.h per citarne uno)

Qui è la stessa cosa la definizione di tipi e dei nomi predefiniti si include aggiungendo il nome delall ibreria standard in cima al file

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity AND is
port (
  A, B, C, D: in  STD_LOGIC ;
  F         : out STD_LOGIC
);
end AND;

includi la libreria IEEE e usa tutte (.ALL) le definizioni della STD_LOGIC_1164

Documentazione sulle librerie standard :

http://www.csee.umbc.edu/portal/./VHDL/stdpkg.html

http://www.csee.umbc.edu/portal/./VHDL/packages/

definire un segnale di tipo STD_LOGIC significa che può avere questi valori

  • 'U': uninitialized. This signal hasn't been set yet.
  • 'X': unknown. Impossible to determine this value/result.
  • '0': logic 0
  • '1': logic 1
  • 'Z': High Impedance
  • 'W': Weak signal, can't tell if it should be 0 or 1.
  • 'L': Weak signal that should probably go to 0
  • 'H': Weak signal that should probably go to 1
  • '-': Don't care.

Ricordarsi che quelle definite nell'entity NON sono variabili della ram di un micro ma fili, pin, collegamenti hardware e i valori sopra ne descrivono i possibili stati.

U è indefinito tipo un pin floating

X è sconosciuto quando ad esempio il pin è pilotato contempraneamente sia alto che basso si mette in condizione non definita

0 1 e Z sono stati "normali"

W L e H definiscono una connessione posso dire blanda.... un esempio potrebbe essere un pullup (H) o un pulldn(L) lo stato del pin normalmente è quello dove lo tiene il pullup o il pulldn. Un altro segnale però può modificare lo stato del pin senza creare conflitti. Se applico uno 0 a un pin che ha stato H non dovrebbe succedere nulla e il pin si porta a 0. Ma se definisco lo stato del pin 1 anzichè H e cerco di pilotarlo a zero lo stato finale dovrebbe essere X non 0. Uso il condizionale non ho mai cercato queste avventure farò un test poi se ne riparla.

il - si usa nei confronti per indicare che lo stato di quel segnale viene ignorato nel confronto Equivale a qualsiasi sia il suo valore.

Scrivo a "braccio" non mi preparo le lezioni e attingo pesantemente a internet quindi non accusatemi di aver copiato da tizio o da caio lo dichiaro apertamente.

 

Modificato: da accacca
Link al commento
Condividi su altri siti


Argomento molto interessante e raramente trattato :thumb_yello: 

Qual'è e dove si scarica il programmino gratuito? Il sito della XILINX è vasto.

Il problema xp è comune anche ad altri ambienti di sviluppo, che comunque funzionano regolarmente su virtual machine.

In ogni caso, per evitare sorprese, molti, me compreso, hanno mantenuto in servizio almeno un pc con xp.

 

Link al commento
Condividi su altri siti

Oggi non è giornata ho ucciso 5 switching tutti assieme solo uno si è salvato... meglio dedicarsi ad altro.

skele

premetto che non ho le idee chiare comunque ise desing suite dovrebbe essere IL programma ultima versione gratuita 14.7 e mi fa paicere sapere che funziona anche su win più recenti. Quello che uso io è planahead che, amio parere, è un vestito costruito sopra ISE design suite con grafica migliore icone puppoli ecc... Forse è questo che non funziona con windows oltre una certa versione. Purtroppo ho solo il tablet di mia moglie con win8 e non ho il premesso di caricare una versione del programma. Mentre cereco un amico con un pc disponibile concludo il discorso abbandonato a metà col primo messaggio

entity NOME is

end NOME;

in VHDL definisce l'interfaccia verso l'esterno del nostro componente

architecture ARCH_NOME of NOME is
begin
end ARCH_NOME ;

tra le parole chiave begin e end va messa la descrizione di cosa fa il componente

ARCH_NOME è un nome di fantasia mentre NOME è lo stesso identico nome usato in entity

Non so perchè si deve definire un nome anche per l'architettura io ho sempre usato una sola architecture per un entity

Il programma completo dell'and diventa (fortunatamente l'ho provato era zeppo di errori...)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity My_AND is
port (
  A, B, C, D: in  STD_LOGIC ;
  F         : out STD_LOGIC
);
end My_AND;

architecture arch_My_AND of My_AND is
begin

 F <= A and B and C and D;

end arch_My_AND ;

Perdonatemi è banale...

Faccio notare l'assegnazione tra SEGNALI che è <= Questa è diversa da dall'assegnazioen a una variabile che è :=

Non è solo questione di notazione c'è anche una sottile differeneza che quelli come me abituati ai micro all'inizio fanno fatica a capire. La variabile assume subito il valore assegnato mentre l'ssegnazione di F NON è immediata. Cioè dopo la riga F<= A and B and C se fate asubito un test di F non torvate subito il valore atteso ci vuole un tempo prima che l'uscita si aggiorni. Cosa che accade in qualsiasi integrato di logica il cambiamento all'ingresso viene visto in uscita dopo tempo.

E questa è è il risultato (é stato fatto utilizzando un FPGA quindi il tutto è statomodellato con una LUT (Look-Up Table)

CFvvxMT.jpg

 

 

 

Link al commento
Condividi su altri siti

Oggi non è giornata ho ucciso 5 switching tutti assieme solo uno si è salvato...

 

Sei proprio un assassino seriale:P

 

Complimenti, stai costruendo un bel tutorial su queste logiche. 

Link al commento
Condividi su altri siti

Questa è una vesione più folcloristica della stessa cosa

architecture arch_My_AND of My_AND is

 signal and_inputs : STD_LOGIC_VECTOR (3 downto 0) ;

begin
  and_inputs <= A & B & C & D ;
  
  with and_inputs select 
     F <= '1' when "1111",
          '0' when "0---",
          '0' when "-0--",
          '0' when "--0-",
          '0' when "---0",
          '0' when others ;

end arch_My_AND ;

c'è and_inputs che è un "vettore di segnali" la sintassi è STD_LOGIC_VECTOR (Width-1 downto 0) o anche (0 to Width-1) si può scrivere come si vuole

c'è la with che è simile all'istruzione case del C ogni riga definisce quale valroe deve avere F per una data combinazione dei segnali di ingresso. Il trattino indica "qualsiasi sia il valore" poichè nell'and basta un segnale a zero per portare l'uscita a zero. When others equivale al default del case del linguaggio C e in altre parole significa per tutti i casi non specificati prima vale questa condizione. da precisare che mentre nel case l'opzione default non è obbligatoria e il compilatore se ne fa sempre una ragione limitando la decodifica alle sole opzioni necessarie, in VHDL no, La decodifica hardware dev'essere sempre completa devonio essere risolte tutte le combinazioni dei segnali (non è una variabile che può assumere solo certi valori)

L'operatore & NON è l'and dei segnali come lo intendiamo nel C ma la concatenazione dei segnali A&B è un vettore con due segnali  mentre A and B è l'and logico dei segnali

Modificato: da accacca
Link al commento
Condividi su altri siti

Sei proprio un assassino seriale:P

In realtà un deficente presuntuoso che non legge attentamente il datasheet ....ho un nervoso adosso ....e posso solo dire colpa mia...

 

Link al commento
Condividi su altri siti

articolo molto intressante. Avevo iniziato nel 2005 con vhdl e Altera. Il kit dello Stratix II mi era costato parecchio per poi diventare intoccabile perche la licenza sulla compilazione hardware del builder era scaduta e da allora lo Stratix II non e' ancora stato messo in lista dei device compilabibli gratutitamente.Per cui Altera per me puo anche chiudere domani .Xilinx mi sembra l'alternativa ottimale. A parte ISE suite , avevo installato Vivado tempo fa per fare delle prove in bianco .... mi sembra sia la stessa cosa alla fine o no? 

Il tutorial prevede anche l'inserimento di componenti fatti ad hoc con bus, cpu ect ? Che tipo di processore pensi di implementare nel microcontrollore finale?

Link al commento
Condividi su altri siti

secondo me dovresti  inziare col postare i  link del ambiente di sviluppo, che sono diversi gigabytes non il programmino.....

Poi la scheda di sviluppo , relativi cavetti e scatolette di programmazione . A questo punto  inizi con i circuiti combinatori e poi quelli sequenziali con il clock. Puoi anche farli in liguaggio grafico con i blocchetti e poi agganciarli al vdhl che considero mlto meglio del verilog (= solita americanata inutile degli americani) . 

Lo scopo di queste tecnologie è quello di progettare e creare il proprio microcontrollore comprensivo di cpu's, bus, periferiche. Grazie a dio molte periferiche e molte cpu sono fornite come IP dal costruttore  

Io ti seguo

Modificato: da walterword
Link al commento
Condividi su altri siti

Ambiente sviluppato da xilinx continuamente aggiornato ma a pagamento "Vivadio" --> http://www.xilinx.com/products/design-tools/vivado.html

Ambiente sviluppato da xilinx gratuito ma aggiornato non di recente (ma comunque compatibile da windows xp in sù fino a windows 10) "ISE Design Suite" --> http://www.xilinx.com/products/design-tools/ise-design-suite.html

Come programmatore conosco Adept gratuito e sviluppato dalla Digilent --> http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,66,828&Prod=ADEPT2

 

Link al commento
Condividi su altri siti

per il kit cosa consigli? 

Una cosa del genere credo che abbia bisogno della ram , flash e tutto il resto 

http://www.aliexpress.com/item/XC3S500E-XILINX-Spartan-3E-FPGA-Evaluation-Development-Core-Board-XCF04S-FLASH-support-JTAG-Core3S500E/705461772.html?spm=2114.01020208.3.127.CP7pyo

oppure ha gia tutto quello che serve ? 

Per programmatore esterno quindi oltre ai driver e' sufficiente un cavetto USB?

Link al commento
Condividi su altri siti

Esistono board già "pronte" con 7 segmenti interfacce varie tra le quali anche vga e gli immancabili pin degli I/O esterni. Queste board sono programmabili attraverso un cavo USB - micro USB maschio maschio. Un produttore di queste è Digilent. Noi a scuola abbiamo le nexys 3 spartan 6 http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,897&Prod=NEXYS3&CFID=16215079&CFTOKEN=ed4bc2c156600a86-EE3AC38C-5056-0201-023C1DF1B7E621CC

Qui il manuale http://www.digilentinc.com/Data/Products/NEXYS3/Nexys3_rm_V2.pdf

Link al commento
Condividi su altri siti

Se invece vuoi partire da solamente il processore principale dato che comprendo il fatto che queste board siano si pratiche ma più dedicate all'apprendimento dovrai come hai detto tu stesso provvedere ad implementare ram ecc. tieni presente però che sul sito della digilent puoi trovare sia soluzioni dedicate all'apprendimento che non ed ha soluzioni molto interessanti e compatte. Inoltre tutte le board hanno schematici open source quindi puoi farti un'idea di cosa bisogna implementare. ESEMPIO --> http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,1227&Prod=CMOD-S6

Modificato: da skele
Link al commento
Condividi su altri siti

sarebbe interessante una board con fpga, ram e flash , cioe l'occorrente per caricare e memorizzare l'hw e il sw, dopodiche le schede led, ingressi a pusalnte e altre centinaia di schede le ho io , come lcd ect

Link al commento
Condividi su altri siti

Non conoscevo affatto Digilent grazie Skele leggerò

Io ho acquistato questa

http://www.aliexpress.com/store/product/Xilinx-USB-Platform-Cable-SPARTAN-6-XC6SLX9-FPGA-core-Board-spartan6-spartan-6-programmer-Downloader-kit/1525466_32243443501.html

il cinese che vende su aliexpress dev'essere questo

http://www.canton-electronics.com/development-kit-downloader-c-117.html

La scheda costa molto meno ma credo ci siano i costi di spedizione che aliexpress non ha

Scheda e programamtore tutto incluso con una sorta di cavetti per ogni esigenza Rispetto alle schede che avevo visto a suo tempo ha tutti gli I/O disponibili e uno fa quello che vuole Il programmatore DLC9C non è l'ultimo della xilinx ma l'ultimo modello originale xilinx da solo costa più del doppio del kit cinese.

Durante il debug io tengo il programmatore attaccato e riscrivo ogni volta solo la ram dell'FPGA ma sulla schedina c'è anche la flash seriale che puoi programmare indirettamente utilizzando ISE per memorizzare la configurazione dell'FPGA. All'avvio l'FPGA si carica da sola il programma dalla flash seriale.

l tutorial prevede anche l'inserimento di componenti fatti ad hoc con bus, cpu ect ? Che tipo di processore pensi di implementare nel microcontrollore

Walterword mi dispiace al momento non sono così bravo. Faccio quello che mi serve per lavoro e non sono a livelli così elevati

C'è questo sito

http://opencores.org/

dove si trova di tutto e di più  Quando uno è un pelo pratico con il linguggio riesce a leggere il codice VHDL fatto da altri io ho visto che sono ancora piuttosto lontano da quello che fanno gli altri Per questo mi vergogno un pelo a scrivere un tutorial...

Ho notato una cosa che un programmatore micro disegna l'onda quadra del clock in questo modo

-------       -------
|     |       |     |
      ---------

Mentre un programmatore FPGA usa questo modo

  -------        ---------
/        \       /
         ---------

Le barre diagonali e verticali dicono tutto sul diverso modo di vedere le cose nei due mondi

Per i micro c'è un prima e un dopo per le FPGA anceh un durante...

Modificato: da accacca
Link al commento
Condividi su altri siti

Visto che ci sono aggiungo che oggi  ho provato a rifare la sintesi dell''and a quattro ingressi utilizzando una cpld anzichè un'fpga

risultato

BspImhf.jpg

Nel caso dell'FPGA si utilizza la LUT a 4 ingressi e un'uscita con cui si può costruire una funzione generica che ha una risposta qualsiasi alla combinazione ingressi  e inc ui l'AND è una particolare realizzazione.

Nel caso della CPLD si sfrutta la progammazione delle interconnessione tra la logica AND e OR  (mappe di Karnaugh.. non vuole mettere il link a wikipedia) delle celle della CPLD

 

Link al commento
Condividi su altri siti

va be l'importante è mettere a fuoco per bene che cosa serve per iniziare 

Kit  + strumenti di programmazione --->  ?

Sistema operativo (WIn7 pro o successivi) --> 

Le cose basilari

 

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...