Verilog, Piccolo esempio

« Older   Newer »
  Share  
Elemento 38
view post Posted on 15/5/2018, 18:35




Come promesso a robo (#entry432623046), inizio un piccolo thread per fare passo passo un design usando il linguaggio Verilog.

Inizio a scrivere qualcosa, se no va a finire che questo thread mi dimentico di cominciarlo :lol:

Per prima cosa, bisogna installare un compilatore/simulatore. Non ho mai usato niente di open source, prima volta anche per me :) Ho deciso di usare una distribuzione unix per avere meno problemi possibili.

Comandi per installare quello che (credo) sia lo stretto necessario:
QUOTE
vagrant@vagrant-ubuntu-trusty-64:~/icarus/iverilog$ history
1 sudo apt-get install git
2 mkdir icarus
3 cd icarus/
4 git clone https://github.com/steveicarus/iverilog.git

6 cd iverilog/

9 sudo apt-get install gcc
10 sudo apt-get install g++
11 sudo apt-get install bison
12 sudo apt-get install flex

14 sudo apt-get install autoconf
15 sudo apt-get install gperf
16 sh autoconf.sh
17 ./configure
18 make

20 sudo make install

22 sudo apt-get install gtkwave
 
Top
Elemento 38
view post Posted on 16/5/2018, 19:23




Iniziamo con un po' di codice, scritto male apposta per poterlo correggere.
Innanzitutto, bisogna dichiarare il modulo che costituisce il nostro circuito, con i suoi input e output:
CODE
module semaforo_bad (
                input wire  clk,
                input wire  reset,
                output reg r1,
                output reg y1,
                output reg g1,
                output reg r2,
                output reg y2,
                output reg g2);


Avremo bisogno anche di un registro che contenga lo stato Q (tabella di robo nell'altro thread). Altra cosa da fare e' cambiare lo stato. Visto che il semaforo ha un flusso costante, possiamo aggiungere sempre 1 a Q in modo tale da fargli avere tutti i possibili valori con i suoi 2 bot (4 stati).
Q avra' valore 0 durante il reset e sara' incrementato ad ogni ciclo di clock
CODE
reg          [1:0]        q;

  always @ (posedge clk or negedge reset)
    if (~reset) begin
       q <= 2'b00;
    end else begin
       q <= q + 2'b01;
    end // else: !if~reset


L'unica cosa che rimane da fare e' assegnare le uscite a seconda dello stato, possiamo usare il costrutto case, come in C
CODE
always @(q)
    case (q)
      2'b00 : begin
         r1 = 1;
         y1 = 0;
         g1 = 0;
         r2 = 0;
         y2 = 0;
         g2 = 1;
      end
      2'b01 : begin
         r1 = 1;
         y1 = 0;
         g1 = 0;
         r2 = 0;
         y2 = 1;
         g2 = 1;
      end
      2'b10 : begin
         r1 = 0;
         y1 = 0;
         g1 = 1;
         r2 = 1;
         y2 = 0;
         g2 = 0;
      end
      2'b11 : begin
         r1 = 0;
         y1 = 1;
         g1 = 1;
         r2 = 1;
     end
  endcase


Ora che abbiamo il circuito, dobbiamo simularlo con un piccolo testbench, dove semplicemente instanziamo il nostro modulo e creiamo i segnali di clock e reset. Il simulatore utilizzato ha bisogno di due comandi per salvare le waveform che poi possiamo visualizzare dopo aver simulato il circuito.
CODE
module semaforo_tb ();

  reg clk   = 1'b0;
  reg reset = 1'b0;
  wire r1;
  wire y1;
  wire g1;
  wire r2;
  wire y2;
  wire g2;

  semaforo_bad DUT(
               .clk(clk),
               .reset(reset),
               .r1(r1),
               .y1(y1),
               .g1(g1),
               .r2(r2),
               .y2(y2),
               .g2(g2)
               );

  always begin
     #5;
     clk = ~clk;
  end

  initial begin
     $dumpfile("waves.vcd");
     $dumpvars;

     #10;
     reset = 1'b1;
     #100;

     $finish;
  end

endmodule


I comandi per compilare, simulare e visualizzare le waves:
QUOTE
iverilog -o semaforo_tb.vvp semaforo_tb.v semaforo_bad.v
vvp semaforo_tb.vvp
gtkwave waves.vcd

Ed ecco il risultato :)
Screen_Shot_2018-05-16_at_7

Alla prossima per vedere come eliminare gli errori in questo esempio e come migliorarlo :)
 
Top
view post Posted on 17/5/2018, 09:44
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Vorrei ringraziare Elemento38 per il tempo che ha dedicato a questo articolo. Complimenti.
 
Web  Top
view post Posted on 17/5/2018, 09:52
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Anch'io. Veramente un bel lavoro. clapping

Appena avrò tempo farò qualche domanda a Ele, visto che di verilog so poco o nulla e vorrei capirci qualcosa.

C'è sempre da imparare....
 
Top
Elemento 38
view post Posted on 17/5/2018, 19:05




Sono contento che a qualcuno interessi, e' praticamente il mio lavoro questo :)
(a dire la verita' no, troppo semplice :lol: :lol: )

Ora, perche' ho detto che il nostro modulo del semaforo e' scritto male? Praticamente, perche' e' piu' simile ad un pezzo di software che ad una descrizione hardware. Proviamo a far sintetizzare a Yosys (https://github.com/YosysHQ/yosys) il circuito.
QUOTE
yosys

yosys> read_verilog semaforo_bad.v
yosys> hierarchy
yosys> proc; opt
yosys> show

Questa e' il modulo sintetizzato da yosys. E' abbastanza difficile da capire, ma si puo' capire che a sinistra c'e' la macchina a stati (il registro Q e la sua logica), mentre a destra c'e' la logica per le uscite.
Screen_Shot_2018-05-17_at_6

Sinceramente oggi ho usato questo software per la prima volta, probabilmente c'e' un modo di fargli fare ottimizzazioni, ma non lo conosco :unsure: A breve un nuovo messaggio con miglioramenti nel codice Verilog.
 
Top
view post Posted on 17/5/2018, 22:55
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Vediamo se c'ho capito qualcosa... :wacko:
Metterò in blu quello che ho capito io e tu, Ele, se vuoi mi correggerai (non essere troppo cattivo a sottolineare gli sbagli, però, altrimenti di deprimo :cry: )
Tieni presente che potrei scrivere un bel po' di castronerie, dato che il verilog l'ho appena accennato qualche mese fa. Sto solo cercando di capire, in base alla logica del programma, i vari comandi che hai inserito, ripromettendomi di studiarmeli. Tutto quello che scriverò di giusto sarà dato da intuizione oppure, molto più facilmente al cosiddetto "effetto fondoschiena" (detto volgarmente c..o)


reg [1:0] q; Crea un registro di 2 bit (si capisce dal fatto 1:0 che sono i 2 bit più bassi e assegna a loro il nome q

always @ (posedge clk or negedge reset) La direttiva "always" dice che quando avvengono le condizioni che ci sono subito dopo, quindi "posedge clk or negedge reset" esegue le istruzioni che seguono. "posedge clk" indica il fronte di salita del clock e negedge reset è invece l'evento relativo al fronte di discesa del reset. Mi chiedo solo perchè si parli di fronte di discesa e non di segnale attivo basso, quindi livello invece di fronte.
if (~reset) begin Se il reset è 0esegue le istruzioni che seguono. ("begin" e "end" sono equivalenti a { } del C)
q <= 2'b00; inserisce 00 nel registro q, quindi lo azzera. Mi giunge un po' strana la sintassi <= 2'b00 ; sembrerebbe che <= indichi una freccia che trasferisce quello che c'è a destra in quello che c'è a sinistra. 2'b00 immagino che sia la notazione binaria dove 2 è il numero di bit e b00 il numero binario da utilizzare
end else begin Se reset non è 0
q <= q + 2'b01; inserisce nel registro q il valore di q incrementato del valore binario 01
end // else: !if~reset

always @(q) ....... ogni volta che avviene qualcosa su q

gestisce i case nello stesso modo del C, con una sintassi leggermente diversa


module semaforo_tb ();
.....
.....
Qui non mi sbilancio a cercare di capire senza studiarmi nulla, altrimenti finirei peraggravare la mia condizione :blink: :wb:

CITAZIONE
Sono contento che a qualcuno interessi, e' praticamente il mio lavoro questo :)
(a dire la verita' no, troppo semplice :lol: :lol: )

Beato te che sai qual'è il tuo lavoro!! Il mio dovrebbe essere studiare il problema, inventare un modo per risolverlo, progettare l'hardware e scrivere il relativo firmware e l'eventuale software sul PC, ma ormai lo faccio nei ritagli di tempo (e visto che ora sono impegnato col forum non ho più neppure quelli :cry: ).

Il mio lavoro principalmente è:

1) Fare l'help desk per clienti che dopo anni che lavorano con una certa apparecchiatura non hanno ancora capito che un led verde lampeggiante serve ad indicare ch fra 15 minuti l'impianto partirà. (Non mi limito solo a questo, ma mi dedico anche ad altre attività molto simili).

2) Disegnare di pezzi meccanici e delle macchine col CAD 3D

3) Fungere da lubrificante quando qualcuno dei miei colleghi fatica ad andare avanti co un certo lavoro

4) Amministrazione (non tantissima, ma c'è anche quella) e burocrazia "italian-style" (solo chi lavoro in certi ambienti e con certe mansioni può capire cosa significhi)

5) Altre ed eventuali tranne le cose inerenti l'elettronica, perchè non sia mai detto che riesca a fare quello che mi piace di più (e che forse mi riecse meglio).

CITAZIONE
Questa e' il modulo sintetizzato da yosys. E' abbastanza difficile da capire

Fino ai 4 blocchi di comparazione $33_CMP0 & c. la cosa l'ho capita, poi mi sono perso (e considerando l'orario farò sicuramente molta fatica a ritrovarmi <_< ).

$35 è il registro q a 2 bit.
$31_CMP0 è il blocco che fornisce l'uscita quando Q è = 11
$32_CMP0 è il blocco che fornisce l'uscita quando Q è = 10
$33_CMP0 è il blocco che fornisce l'uscita quando Q è = 01
$34_CMP0 è il blocco che fornisce l'uscita quando Q è = 00 e che è diverso dagli altri in quanto è un OR (o un NOR), perchè deve controllare la condizione che Q sia 00 o diverso da 00.
Il blocco S3 è un sommatore che aggiunge al valore di Q la constante 01, incrementando di 1 il contatore. Il valore di uscita dal sommatore viene riportato sull'ingresso D del "Bi"-flip-flop Q.


Prof.Ele, che voto mi da? 2------? Beh, pensavo peggio!! :woot:
 
Top
Elemento 38
view post Posted on 17/5/2018, 23:39




Praticamente hai scritto tutto corretto! :D

La direttiva "always" definisce un "processo", che possiamo epiegare come un blocco di circuito ci viene attivato ogni volta che c'e' un cambiamento nel valore dei segnali dopo @, cioe' la "sensitivity list".E' facile capire che per un circuito combinatorio la sensitivity list sono praticamente gli input, ma per un circuito sequenziale questa
QUOTE
always @(posedge clk or negedge)

praticamente serve per definire un flip-flop con reset attivo basso e asincrono. Quello che vogliamo e' che il valore di reset sia applicato in modo asincrono ma il circuito inizi il suo comportamento in modo sincrono dopo il reset (ecco perche' si usa negedge).

'<=' e '=' sono usati per assegnare il valore di un segnale/registro. '<=' viene usato per assegnare un valore ad un registro, mentre '=' viene usato per segnali (chiamati wire/logical in Verilog)

Voto A+ :)

Proviamo a modificare il circuito e scrivere tutto in modo meno software ... :) In questo caso utilizzo una codifica one-hot per lo stato
CODE
reg                              s1;
  reg                              s2;
  reg                              s3;
  reg                              s4;

  wire                      x;

  // contatore johnson (shift register con un solo bit attivo e feedback)
  always @ (posedge clk or negedge reset)
    if (~reset) begin
       s1 <= 1'b1;
       s2 <= 1'b0;
       s3 <= 1'b0;
       s4 <= 1'b0;
    end else begin
       s2 <= s1;
       s3 <= s2;
       s4 <= s3;
       s1 <= s4;
    end // else: !if~reset

  // rosso del primo semaforo (e verde del secondo) attivo nei primi due stati
  assign x = s1 | s2;

  assign r1 = x;
  assign g2 = x;

  assign r2 = ~x;
  assign g1 = ~x;

  // giallo attivo solo in un preciso stato
  assign y1 = s4;
  assign y2 = s2;

Molto piu' semplice da capire, perche' abbiamo "forzato" il tool con una versione gia' ottimizzata del circuito!
Screen_Shot_2018-05-17_at_11

Edited by Elemento 38 - 5/18/2018, 12:55 AM
 
Top
view post Posted on 23/5/2018, 10:21
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Mamma, ancora quella roba. Ma perchè si ostinano a complicarsi la vita, per semplificarsela? Alcuni programmable controllers usano diversi sistemi grafici per scrivere la solita roba. Per fortuna uno può sciegliere come vedere, scrivere o editare le solite cose in modi diversi. Spesso con un sistema si fa prima a scrivere cose ripetitive, altre volte si fa prima a fare il debug online, se si è proprio andicappati a scrivere si usano i sistemi grafici che richiedono tempo, tanto tempo, a chi sa dattilografare ma ne richiederebbero molto di più a chi non ci riesce.
Poi, ci sono storie di coloro che non usano scrivere commenti, e quindi, dopo un giorno di lavoro vanno a dormire, gli si resettano le meningi ed il giorno dopo deve cominciare di nuovo...
Tutto da ridere... o da piangere se vogliamo.
 
Web  Top
Elemento 38
view post Posted on 23/5/2018, 20:48




Il grafo che ho postato in realta' e' solo una visualizzazione (non fatta molto bene) del rappresentazione del circuito interna al programma dopo la prima passata di sintesi.
Tools industriali creano la visualizzazione grafica del circuito, ma fortunatamente e' fatta molto meglio, ad esempio con vere porte logiche e saltando segnali di clock e reset quando possibile.

Non ho mai apprezzato molto i sistemi grafici per programmare. Li approvo quando bisogna insegnare a bambini le basi delle programmazione (vedi ad esempio il block editor del micro:bit http://microbit.org/code/ ), ma non ho ancora visto niente (in ambito professionale hardware) che usi un sistema grafico come input primario.
 
Top
view post Posted on 24/5/2018, 09:52
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Eh... Sei fortunato.
Siemens principalmente può usare tre tipi di programmazione, più o meno equivalenti ed intercambiabili. KOP, FUP e AWL. Il KOP è un disegno elettrico a contatti e bobine, il FUP è circa come quello sopra a porte logiche, e AWL che è ul lista istruzioni. Ma anche Allen Bradley (Rockwell Autoation) sui controllors nuovi lascia scegliere al programmatore come visualizzare la stessa logica, editarla e testarla. Ora, i "barbùn" europei hanno introdotto uno standard che viene più o meno riconosciuto internazionalmente, simile ai sistemi Siemens e Allen Bradley al quale si associano anche Omron, Telemeccanique ecc...
Non sono sistemi per la programmazione di CHIP, ma sistemi integratri per la programmazione di CPU dotate di FPGA o di RISC o di chissà cosa che tu non conosci, non vedi e non sai come funzionano ma per fortuna in alcuni casi fanno tutto da se. Nel senso, che tu compri il "processore" già pronto, con gli I/O già pronti e tutto il software che ti serve per programmarli e testarli.
In alcuni casi sono molto utili, anche perchè oggi alcuni di questi "cosi" costano veramente poco, mentre altri che costano tantissimo fanno anche tantissimo di più di quello che si può sviluppare disponendo di una ventina di progettisti in un paese paperologico come l'Italia.
 
Web  Top
Elemento 38
view post Posted on 24/5/2018, 21:30




Secondo me e' semplicemente perche' il campo di applicazione e' diverso. I PLC (immagino tu ti riferisca a quelli), sono usati per lo piu' in ambito industriale dove le automazioni sono/erano fatte da elettrotecnici, quindi linguaggi come Ladder sono ottimi perche' sono praticamente una trasposizione del circuito in questo linguaggio.

Forse i programmi per PLC sono piu' semplici di listati Verilog per applicazioni complesse? Sinceramente non ho mai avuto a che fare con PLC, quindi meglio che non dico niente :lol:
Pero' mi piacerebbe vedere qual'e' il limite di complessita' di sistemi con PLC!

Sto provando a scrivere un altro esempio per questo thread, probabilmente un semplice arbitro, per poi magari finire con una cache.
 
Top
view post Posted on 25/5/2018, 09:48
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


No, Elemento. Non è esattamente così. Gli "elettricisti" o elegantemente gli "elettrotecnici" non ci capiscono un ciufolo nè di automazione nè di PLC o di PAC (Programmable Automation Controller).
Oggi se vuoi fare automazione sul serio devi usare questi "cosi" già pronti.
Non vorrei disilluderti, ma progettare e costruire oggi sistemi di controllo che vanno oltre il "lo faccio per divertirmi" è impensabile.
Specialmente in questo lembo di terra dimenticato da Dio, chiamato Italia. La "megalomania schizzoide" dei suoi abitanti inizia ad entrare in funzione quando gli proponi qualcosa che non capiscono.
Sia una bicicletta che un apribottiglia. La prima domanda è "ma a me chi me lo garantisce che funziona?"
Ovvero, tu fai cosa ti pare, dal circuitino idiota per l'ascensore fino alla macchina del tempo. Costruisci pure i prototipi che ti pare, ma l'ignoranza del popolo che fece scappare Marconi, bruciò Giordano Bruno ecc,,,
non ti risparmierà. Quindi, se alla domanda non rispondi: "Lo hanno fatto i tedeschi della Siemens, in Germania"...
Al chè risponderanno:"Ahaaaaa!!!" e non si fideranno comunque di te che tu sia capace di programmare un simile "feticcio religioso".
Considera che nel 1980 si erano formati degli schieramenti tifosi di chi era per lo Z80 e chi per il 6502 senza che si capisse o si conoscesse nè l'uno nè l'altro. Come fai a proporre a questi mentecatti qualcosa di costruito da te???
Come se qualunque cosa costruita anche da una aziendina non sia uno schifo, mentre una porcheria fatta a Taiwan ma della quale non si conosce una cippa è un prodotto di mercato e quindi affidabile.
Ti invidio se ancora non hai mai avuto a che fare con questa gentaglia.
Comunque, in ogni caso, i "controllers" di commercio oggi sono molto più che computers ed in effetti, non per far propaganda gratuita, i "Controllogix Allen Bradley" hanno una potenza di calcolo da brivido molto più assai superiore a qualsiasi PC.

https://ab.rockwellautomation.com/Programm...rs/ControlLogix

Tutto questo per dire che l'automazione industriale e di qualsiasi altro tipo non è cosa per "elettricisti, elettromeccanici, luciai specializzati o meno".
Anzi, se non hai solide base di elettronica digitale, controllo di processo, e informatica industriale, sei destinato solo ad ingrossare la quantità di "casinisti specializzati" che c'è in giro.
 
Web  Top
Elemento 38
view post Posted on 25/5/2018, 21:55




QUOTE
No, Elemento. Non è esattamente così. Gli "elettricisti" o elegantemente gli "elettrotecnici" non ci capiscono un ciufolo nè di automazione nè di PLC o di PAC (Programmable Automation Controller).
[...]
Tutto questo per dire che l'automazione industriale e di qualsiasi altro tipo non è cosa per "elettricisti, elettromeccanici, luciai specializzati o meno".
Anzi, se non hai solide base di elettronica digitale, controllo di processo, e informatica industriale, sei destinato solo ad ingrossare la quantità di "casinisti specializzati" che c'è in giro.

Non era per sminuire la categoria di programmatori di PLC, e' che la scuola italiana insegna tutto a riguardo solo a chi sceglie programmi di elettrotecnica (o almeno era cosi fino a quando ho finito le superiori) :)

Mi sono guardato due video veloci su youtube e sembrano pezzi di tecnologia abbastanza interessanti, viste le caratteristiche e performance dai datasheet. Non mi e' molto chiaro come funzionino internamente, sono come processori con inputs/output mappati in memoria e il programma composto da tanti loop in modo da creare le reti logiche?

Il listato in Verilog dell'arbitro e' quasi pronto, ma qua in UK ci aspetta un weekend lungo, quindi se ne parlera' la settimana prossima per finirlo :P :B):
 
Top
view post Posted on 26/5/2018, 07:37
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


CITAZIONE
Il listato in Verilog dell'arbitro e' quasi pronto, ma qua in UK ci aspetta un weekend lungo, quindi se ne parlera' la settimana prossima per finirlo

Sono ansioso di vedere cosa tirerai fuori dal cilindro. E' proprio interessante.

Nel frattempo spero di trovare tempo per proseguire il discorso delle reti logiche.

......Aggiornamento: l'ho trovato (capitolo 3).

Edited by Robo67 - 27/5/2018, 12:44
 
Top
view post Posted on 27/5/2018, 11:08
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


C'era una volta, che i PLC erano delle vere schifezze. L'invenzione era quella di un microprocessore che interpretava delle istruzioni una dietro l'altra e riponeva il risultato logico da qualche parte in memoria. Alla fine delle elaborazioni iniziavano di nuovo dall'inizio e così via all'infinito.
Tutto questo perchè gli elettrotecnici non avevano una cultura informatica che gli consentiva di fare altrimenti, e anche perchè la logica a Relay era stata inventata così e andava avanti ormai fin dai primi del secolo.
Oggi il sistema è molto più pratico, consente di seguire meglio il flusso del programma senza occorrere in un "stack overflow" o in un "concurrent loop" o in una "ricorsività" infinita fino alla totale distruzione del programma. Tanti continuano a chiamarli PLC come "programmable logic conroller" altri li hanno rinominati in PAC "programmable automation controller" e sono veramente molto efficienti sia nella stesura nel test e nel debug di un programma che altrimenti a scriverlo in C+ qualcosa ti ci portano al manicomio, non ottieni le stesse prestazioni perchè il tuo programma è stato compilato da un compilatore inefficiente e gira sotto un sistema operativo da disperazione. Non parliamo poi, quando devi fare un debug. Un "controllogic" da solo è in grado di gestire un'intero" processo di produzione del polietilene controllando una enormità di processi in real time ed il software è stato probabilmente sviluppato in qualche mese di lavoro da una sola persona.
È ovvio, che per divertirsi un attimo in casa a fare i semafori non val la pena di spendere 10000 euro in un sistema Controllogix, ovviamente, ma non volevo dire questo.
Ahh, per le APP per smartphone comunque, è tutto un'altro discorso... :)
 
Web  Top
22 replies since 15/5/2018, 18:35   244 views
  Share