Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Discussione sul trasmettitore UART

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto UtenteBrunoValente, Foto Utentecarloc, Foto UtenteIsidoroKZ, Foto Utenteg.schgor, Foto UtenteDirtyDeeds

2
voti

[11] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteboiler » 18 set 2018, 10:40

La risposta alla prima domanda è nascosta nelle profondità del compiler.
Se usi logica combinatoria in un processo senza metterne i segnali nella sensitivity list non avrai un update affidabile dell'uscita di tale logica. D'altra parte, se metti i segnali nella sensitivity list, l'uscita del flip-flop cambierà al cambiamento del segnale logico, non solo del clock. Questo porta il sintetizzatore ad istanziare un latch invece di un flip-flop e di usare il clock per controllarne la trasparenza così come lo stato della linea dati. Così facendo avresti un design asincrono.
Questo è il motivo per cui ho scritto fino alla nausea di mettere solo Clock e Reset nella sensitivity list del processo sequenziale.

Il processo combinatorio invece non ha memoria e quindi non c'è problema.

Il tutto rientra nell'astrazione del concetto alla base di un'archittetura sincrona: nuvole di logica combinatoria che lavorano senza clock e che generano un output che deve essere stabile al (fianco attivo del clock - setup time). Queste nuvole sono intervallate da registri che campionano l'ingresso al fianco attivo del clock e mantengono l'output stabile a partire da (fianco attivo del clock + contamination delay).

KISS: keep it strictly synchronous (queste parole devono echeggiare nei tuoi sogni e incubi notturni e pomeridiani) :mrgreen:

prima dici di usare le primitive della FPGA, poi di non usare assolutamente della logica per modificare il clock, e poi alla fine che si può usare un coutner. Io ho sempre usato counter per la divisione del clock ed è quello che ho fatto anche nell'articolo: è una procedura sbagliata?


Un metodo allettante e semplice per fare del clock gating è questo:


È quanto di peggio si possa fare.
Per il tipo di architettura descritta sopra, la logica combinatoria ha (e non è un problema) glitches a non finire. L'importante è che questi si esauriscano e il segnale diventi stabile al momento in cui il flip-flop lo campiona.
Se invece mescoli dati e clock, porti tutti questi glitches sul segnale di clock, che cessa di essere tale. Questi glitch propagati al prossimo flip-flop lo faranno campionare in momenti inopportuni, quando il propagation delay della logica a monte non è ancora esaurito.

Prendiamo per esempio una Virtex-6 (ma queste primitive ci sono per tutte le FPGA, si chiamano semplicemente con un nome diverso):
https://www.xilinx.com/support/document ... /ug362.pdf
A pagina 18 è descritto il BUFGCE: è un buffer fatto apposta per controllare linee di clock. Se si rispettano le condizioni d'uso, l'uscita resta glitch-free (ci sono anche altre considerazioni da fare: solitamente questi buffer sono costruiti diversamente da normali buffer per linee dati per assicurare tempi di salita decenti anche su grossi clock-trees).

Come scrivi, si può usare anche un counter per dividere il clock. Ci sono due metodi.

Quello sbagliato:


E quello giusto:


Saluti Boiler
Ultima modifica di Foto Utenteboiler il 18 set 2018, 12:05, modificato 1 volta in totale.
Motivazione: corretto schema per evitare ambiguità
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2458
Iscritto il: 9 nov 2011, 12:27

1
voti

[12] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteboiler » 18 set 2018, 10:45

dadduni ha scritto:Gentilmente ti chiederei conferma di quanto ho detto per conferma di aver capito quello che intendevi


Anche impegnandomi non trovo nulla da criticare :mrgreen:

Bravo! :ok:
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2458
Iscritto il: 9 nov 2011, 12:27

0
voti

[13] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteboiler » 18 set 2018, 11:06

luxinterior ha scritto:Io non faccio cose a frequenze spaziali e utilzzo un segnale clk_enab centrato sul fronte del clock che mi serve.


Non so come tu ottenga questa centratura, ma di solito non è necessaria.
L'ambiente di sviluppo conosce le caratteristiche della FPGA, conosce i timing constraints che tu gli dai e verifica che non ci siano hold o setup violations.

Boiler
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2458
Iscritto il: 9 nov 2011, 12:27

0
voti

[14] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteluxinterior » 18 set 2018, 11:26

Scusa boiler non ho capito come fuziona la tua ultima immagine sulla divisione del clock o forse non interpreto correttamente le cose. L'uscita N del counter è alta per N cicli del clock principale
per me quel modo tu hai l'enable per N clock attivo e per N clock bloccato non hai un solo clock ogni N
dove sbaglio ?
Avatar utente
Foto Utenteluxinterior
2.269 2 4 8
Expert EY
Expert EY
 
Messaggi: 1280
Iscritto il: 6 gen 2016, 17:48

1
voti

[15] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteboiler » 18 set 2018, 12:06

Scusa, hai ragione, messa così il significato è ambiguo.
È un contatore decadico, ogni uscita è alta solo per un ciclo di clock.
Ho corretto il disegno in modo che sia chiaro.

Boiler
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2458
Iscritto il: 9 nov 2011, 12:27

0
voti

[16] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utentedadduni » 18 set 2018, 12:11

molto bene, allora ho avuto sempre un modo di dividere il clock decisamente sbagliato #-o
Ti ringrazio molto per le spiegazioni sei genitilissimo e ho imparato di più in questa discussione che nel corso di "lavoratorio di elettronica digitale" in cui tutte queste magagne ce le hanno fatte passare per buone.
Come pensi sia conveniente procedere? Lavoro al ricevitore e poi ne discutiamo o pensi sia meglio fare degli step intermedi (secondo la tua disponibilità) ? Io nel frattempo rivaluto un po' quello che ho scritto fin ora nella nuova ottica! Penso di rifare anche il ricevitore
Davide
Avatar utente
Foto Utentedadduni
1.602 1 6 12
Expert EY
Expert EY
 
Messaggi: 976
Iscritto il: 23 mag 2014, 16:26

0
voti

[17] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utentedadduni » 18 set 2018, 15:37

Aggiungo un primo esperimento sul classico contatore, prima ho condiviso la versione rigorosa con un processo per il flip flop e un altro processo per il combinatorio, facendo tutto in un processo solo il risultato grafico è esattamente lo stesso: questa è una pratica sconsigliata o sbagliata?

Codice: Seleziona tutto
    process (CLK, RST) begin
        if(RST = '1') then
            PresentState<= (others => '0');
        elsif rising_edge(CLK) then
            if PresentState = "11001100" then
                PresentState <= (others => '0');
            else
                PresentState <= std_logic_vector(unsigned(PresentState) +1);
            end if;
        end if;   
    end process;
Avatar utente
Foto Utentedadduni
1.602 1 6 12
Expert EY
Expert EY
 
Messaggi: 976
Iscritto il: 23 mag 2014, 16:26

1
voti

[18] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteboiler » 18 set 2018, 17:06

Quello è un codice che a dipendenza di compiler, sintetizzatore e target può dare risultati diversi.
Nel tuo caso è molto semplice verificare che il risultato è quello che vuoi ottenere, ma quando hai migliaia di registri diventa impossibile.

È l'equivalente in VHDL di questo codice in C:
Codice: Seleziona tutto
uint16_t a[8] = {2,2,2,2,2,2,2,2};
uint16_t i = 2;

a[i] = i++ * i++;


Boiler
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2458
Iscritto il: 9 nov 2011, 12:27

0
voti

[19] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utenteluxinterior » 19 set 2018, 2:39

Scusa, hai ragione, messa così il significato è ambiguo.

Lascia perdere le scuse. Ci stai regalando un sacco di informazioni molto molto utili.

Io su VHDL sono totalmente autodidatta quello che ho imparato l'ho imparato spulciando la rete e leggendo gli infiniti documenti di xilinx. L'occasione di poterne parlare con qualcuno per me è veramente una ghiotta occasione. (Ho frequentato il forum xilinx per un periodo ma sono a livelli troppo alti per me, poi io lavoro ogni tanto su FPGA mi basta riusciera a "galleggiare" i miei problemi non sono complessi)

Torniamo all'argomento clock perché mi sono spaccato la testa a suo tempo per trovare una soluzione. Ovunque leggevo dei clock enable, del counter ecc... Io alla fine l'ho risolto con il codice che allego (sarà da rivedere alla luce di quanto scritto sopra) Giusta o sbagliata per ora nei miei progettini sembra funzionare...
Il mio problema era ed è questo: utilizzando semplicemente un counter gli impulsi di enable sono comunque "sincroni" con i fronti del clock. L'impulso di enable sarà sempre stabile dopo il fornte del clock. All'epoca il mio dubbio era: come faccio ad avere l'enable centrato sul fronte del clock che mi interessa ?

Oggi tu hai mi hai chiesto:
Non so come tu ottenga questa centratura, ma di solito non è necessaria.

e tutti i miei dubbi sono riemersi...

Tra parentesi mi farebbe piacere che tu dedicassi due parole sui timing constraints (...se ne hai voglia)
Allegati
clkdivide.zip
(637 Byte) Scaricato 17 volte
Avatar utente
Foto Utenteluxinterior
2.269 2 4 8
Expert EY
Expert EY
 
Messaggi: 1280
Iscritto il: 6 gen 2016, 17:48

0
voti

[20] Re: Discussione sul trasmettitore UART

Messaggioda Foto Utentedadduni » 19 set 2018, 11:43

Foto Utenteluxinterior come ben sai parlo da ignorante e aspettiamo che boiler dia una risposta definitiva. Nella tua funzione io tirerei fuori dal processo sequenziale ciò che è combinatorio. Quindi (se ho capito bene) nel processo sensibile al fronte di clock ci tieni solamente count0 <= count1 e come viene calcolato count1 e come viene calcolato il clk lo tiri fuori dal processo così che vengano eseguiti in maniera combinatoria (sempre) e non solo sul fronte di clock.
Inoltre credo che la tua soluzione rispecchi il problema che diceva boiler. Il tuo CLK_OUT è frutto di una roba combinatoria (xor e or), invece lui consiglia di mettere tutto il combinatorio prima e finire con un FF.
Sia ben chiaro, le mie non sono assolutamente critiche ma solo ipotesi per stuzzicare le discussione e lo scambio di idee, non sono assolutamente qualificato e preparato per dare consigli a nessuno anzi, sto qui proprio per riceverne!
Davide
Avatar utente
Foto Utentedadduni
1.602 1 6 12
Expert EY
Expert EY
 
Messaggi: 976
Iscritto il: 23 mag 2014, 16:26

PrecedenteProssimo

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Google Adsense [Bot] e 22 ospiti