Visualizzazione post con etichetta FPGA. Mostra tutti i post
Visualizzazione post con etichetta FPGA. Mostra tutti i post

mercoledì 16 maggio 2012

Direct Digital Synthesizer - Crea la Tua onda...

In questo breve articolo, descriverò una tecnica semplice quanto efficace per generare una forma d'onda arbitraria e periodica. Per fare ciò dobbiamo prendere in esame i sintetizzatori digitali.
Partiamo da una considerazione: una forma d'onda è l'espressione di una funzione nel dominio del tempo. Se pensiamo ad una sinusoide, ad esempio, la funzione sarà: sin(wt); per wt (omega * T) che va da 0 a 2 PI.

(Onde sinusoidali)

(Onde triangolari)

(Onda a Dente di Sega)

Come possiamo realizzare attraverso un circuito elettronico una simile funzione?
La risposta più immediata è: creiamo una tabella ROM (Read Only Memory) al cui interno siamo presenti tutti i valori della funzione matematica desiderata e, poi, estraiamo uno per volta tali valori fino al completamento di un periodo temporale preimpostato, convertiamo i valori numerici in un segnale analogico (es. mediante un DAC - Digital to Analog Converter) e ...avremo ottenuto la nostra forma d'onda sintetica.

Nella realtà avremo bisogno di un Circuito Integrato dedicato (ASSP - Application Specific Standard Circuit) oppure potremo realizzare il sintetizzatore di forme d'onda mediante un circuito integrato programmabile (es. un FPGA - Field Programmable Gate Array).

Nelle prossime immagini vediamo lo schema di una implementazione su FPGA:

(FPGA Top - Click per ingrandire)

(Blocco DPRAM su FPGA - Click per ingrandire)

Il circuito DDS si basa sul principio dell'Accumulatore di Fase, tale accumulatore può agevolmente essere implementato in linguaggio VHDL (VLSI Hardware Description Language) ...di cui Vi riporto il codice:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity PHASE_ACC is
    Port ( clock : in  STD_LOGIC;
           reset : in  STD_LOGIC;
           load : in  STD_LOGIC;
           data : in  STD_LOGIC_VECTOR (31 downto 0);
           addr : out  STD_LOGIC_VECTOR (10 downto 0));
end PHASE_ACC;

architecture Behavioral of PHASE_ACC is
    signal phase_accum : STD_LOGIC_VECTOR (31 downto 0);
    signal phase_delta : STD_LOGIC_VECTOR (31 downto 0);
begin

    process (clock, reset)
    begin
        if reset='1' then
            addr <= (others => '0');
        elsif clock='1' and clock'event then
            addr <= phase_accum (31 downto 21);
        end if;
    end process;

    process (clock, load)
    begin
        if load = '1' then
            phase_delta <= data;
        elsif clock='0' and clock'event then
            phase_accum <= phase_accum + phase_delta;
        end if;
    end process;

end Behavioral;

Ma come è possibile generare una sinusoide?
Semplice, quardiamo questa funzione in codice ANSI C:

/* load a sine wave in FPGA wavetable*/
void load_sine(void) {

  const float pi = 3.141592f;
  float phase_vector = 0.0f;
  float phase_delta = 0.0f;
 
  unsigned int i;         //generic counter
 
  /* reset DPRAM address generator */
  WriteEXB(0x01, 0x02); //bit 0, addr 2

  phase_delta = (2.0f * pi) / 2048.0f;

  for (i=0; i<2048; i++) {
    WriteEXB((unsigned char)(round(sin(phase_vector) * 127.5f)
    + 127.0f), 0x01);
    phase_vector = phase_vector + phase_delta;
  }
   
  return;
}

Tornerò prossimamanete a parlare delle applicazioni del DDS ...adesso sono in partenza, nuove avventure mi attendono.

Qui Pianeta Terra, un mondo analogico... a presto!


venerdì 30 settembre 2011

Illimitate possibiltà!

"Endless Possibilities" questo era lo slogan con cui la Xilinx presentava le soluzioni basate sui propri System On Programmable Chip. Che cosa vuol dire?


(fare click per ingrandire)

Vuol dire che combinando il classico design HDL (Hardware Description Language) con uno o più microcontrollori programmabili in linguaggio Assembler o ANSI C, è possibile sviluppare una nuova categoria di progetti, i SoPC appunto, cioè sistemi elettronici completamente immersi in FPGA (Field Programmable Gate Array) ove hardware e firmware vengono sviluppati secondo una metodologia che, fin ora, era esclusivo appannaggio dei progetti software. In altre parole, oggi è possibile creare progetti hardware, interamente su chip, con la flessibilità tipica del software (es. upgrade, riconfigurazione, design personalizzato, open source, ecc.).
In un precedente post ho definito questa modalità "Hardware Liquido".

Vediamo come ho utilizzato questa tecnologia nelle fasi di prototipazione di un progetto di Autopilota, per emulare il comportamento di alcune superfici mobili controllate mediante motori passo-passo (per ulteriori dettagli sui motori passo-passo vedere qui).
Nella figura seguente vi riporto lo schema a blocchi del simulatore di superfici mobili:

(fare click sulla figura)

Come avrete notato tutto il progetto è integrato in un unico FPGA, (50% di utilizzo delle risorse) microprocessore compreso, e all'esterno sono necessari solo i traslatori di livello, i transistor di potenza per controllare le fasi dei motori e i display 7-Segmenti ...tutto il resto è software e potrete modificarlo secondo le vostre esigenze, ogni qual volta esse si manifestano!!! I blocchi funzionali (es. UART, GPIO, ecc.) vengono aggiunti in base alle necessità e poi non resta che scrivere il programma che li utilizzarà.
Nelle figure seguenti sono riportati alcuni screen shot ripresi durante le fasi di sviluppo in cui è possibile visualizzare il blocchi funzionali (IP) da inserire nel progetto e il codice ANSI C che verrà eseguito dal microprocessore.








Semplice ed efficace, non vi pare? Mai più tagliare piste o aggiungere fili, oggi si riprogramma il chip!

Qui Pianeta Terra, a presto.

giovedì 28 luglio 2011

Computer Linux fai-da-te! - Parte 2

Salve a Tutti,
oggi Vi propongo le specifiche preliminari del sistema che chiameremo Linux Embedded ToolBox e che è basato, almeno in linea di principio, sul dimostratore hardware/software che ho descritto e utilizzato nei precedenti post e video (vi ricordo anche il canale YouTube "liberaelettronica"), per diversi scopi dimostrativi.



Nella figura seguente vi propongo lo schema a blocchi con le caratteristiche dei singoli moduli:

(fare click per ingrandire)

Come potete vedere, si tratta di utilizzare un modulo CPU (PortuxG20) un modulo display TFT (L35) ed una scheda custom (Support & Backplane) che mi accingo a progettare e realizzare.
Il sistema prevede anche uno slot di espansione per futuri sviluppi (...sto già pensando ad un video decoder, un modem GSM/GPRS e, per gli altri Vostri suggerimenti, resto in attesa di commenti, critiche costruttive e desideri!).

Perché realizzare questo sistema, vi starete domandando?
Le risposte sono tante e proverò a fornire quelle per me  più importanti:

  • Perché è un sistema completamente open-source (sia per quanto riguarda il software e sia per le parti hardware che proverranno da questo blog ...il resto potrete vederlo come una black-box).
  • Perché più lo utilizzo e più scopro che può fare molto di più di quanto io stesso immagini.
  • Perché, utilizzando anche un FPGA (Field Programmable Gate Array), il ciclo di vita dell'hardware si allunga sensibilmente e, poi, la struttura modulare si presta bene a graduali miglioramenti, senza dover rottamare il tutto ogni volta che le esigenze cambiano (...product-lifecycle, vi dice nulla?).
  • Perché realizzare una filiera corta tra produttore e utilizzatore, ha enormi benefici tecnici e sociali.
  • Perché, così, sarete Voi lettori un elemento determinante per il successo del progetto.

Nella speranza di interpretare al meglio i Vostri desideri, auguro Buone Vacanze a Tutti!!!

Qui Pianeta Terra, a presto.

giovedì 23 giugno 2011

Laboratorio: hardware liquido!

Non è certo l'ultima novità, ma è una delle innovazioni di maggior successo nel campo dei circuiti integrati. Parliamo, oggi, dei Circuiti Logici Programmabili.


Field Programmable Gate Array (FPGA) oppure Complex Programmable Logic Device (CPLD), sono i nomi che più spesso contraddistinguono tali componenti.

Vediamo di cosa si tratta, io propongo alcune definizioni:
  • circuiti elettronici che non hanno una specifica funzione, ma che sarà l'utente a fornirgliela
  • sistemi hardware la cui metodologia di sviluppo è esattamente quella del software
  • circuiti che possono essere ripetutamente aggiornati durante il ciclo di vita del prodotto, riducendo i rischi di obsolescenza
  • circuiti che posso essere riparati (entro certi limiti) mediante una semplice riconfigurazione, utilizzando risorse "spare"
  • circuiti che possono contenere al proprio interno un intero sistema di elaborazione e che aggiorneremo, nel tempo, così come facciamo con le applicazioni per il nostro PC.

Quest'ultima definizione, nota anche come System on Programmable Chip (SoPC), significa che possiamo progettare un intero elaboratore all'interno di un FPGA, utilizzando componenti software (Core o Intellectual Property) di nostra concezione o di terze parti.

Ma allora esisterà anche l'hardware Open Source?
Certo! Esistono moltissimi progetti di sistema con schemi di licenza "open" tipo GNU e LGPL, basta guardare il sito http://opencores.org/ e scegliere il progetto che meglio si addice al nostre necessità (es. ci sono numerose CPU e non mancano UART, Timer, I2C, SPI, ecc.).

Ma come si usano questi circuiti programmabili?
Vi mostro un banale esempio ...l'importante è il concetto!

Supponiamo di voler realizzare un contatore binario e di non voler acquistare, cablare e provare un chip con questa specifica funzione. Bene, programmiamocelo dal nulla!
Così:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter is
    Port (
        clk : in std_logic;
        output : out std_logic_vector(1 downto 0)
    );
end counter;

architecture behavioral of counter is
    signal cnt : std_logic_vector(1 downto 0);
begin
    process(clk)
        begin
            if clk'event and clk='1' then
                cnt <= cnt + 1;
            end if;   
    end process;
    output <= cnt;
end behavioral;

In questo progetto (semplificato al massimo) ho utilizzato il linguaggio VHDL (VLSI Hardware Description Language) per codificare le funzionalità di un contatore binario a 2 bit.

Procediamo con la Simulazione, la Sintesi e l'Implementazione (passi simili alla compilazione, link e debug, di un normale software)...


...diamo una guardatina all'interno del chip...


...è quasi tutto vuoto, ma si possono vedere i fili, cioè le route ed i blocchi logici occupati dal nostro contatore e resta tantissimo spazio per aggiungere altre funzionalità.

Poi, versiamo il tutto all'interno del chip ....pardon, programmiamo il chip.


Ecco fatto!

Verifichiamo con l'oscilloscopio che il nostro contatore binario funzioni realmente...

(il bit 0 è la traccia in basso)
...Ok, funziona tutto!

Non mi resta che augurarvi: "buona programmazione dell'hardware".

Qui Pianeta Terra, a presto.