Showing posts with label Spartan 3e. Show all posts
Showing posts with label Spartan 3e. Show all posts

Monday, March 28, 2016

Generate PWM Signal From Spartan 3E

Let's get PWM Using Spartan 3E

Dans la meme s�rie de tutoriels que j'ai fait au but de la d�couverte de technologie FPGA et en particulier la carte Spartan 3E, Aujourd'hui je vais vous montrer comment on fait pour generer un signal PWM (pulse widh modulation), vous expliquer les �tapes de programmation que j'ai fait en passant par un test pratique d�monstratif.



Afficher l'image d'origine

La modulation de largeur d'impulsions (MLI ; en anglais : Pulse Width Modulation, soit PWM), est une technique couramment utilis�e pour synth�tiser des signaux continus � l'aide de circuits � fonctionnement tout ou rien, ou plus g�n�ralement � �tats discrets.
Le principe g�n�ral est qu'en appliquant une succession d'�tats discrets pendant des dur�es bien choisies, on peut obtenir en moyenne sur une certaine dur�e n'importe quelle valeur interm�diaire.

R�sultat de recherche d'images pour "pwm mli definition"






Ce ph�nom�ne est fortement recommand� pour assurer la variation de vitesse de moteur a courant continu, aujourd'hui je vais vous d�montrer comment on peut g�n�rer un signal PWM d'une carte FPGA Spartan 3E et visualiser son pr�sence sur des diodes LEDs.


R�sultat de recherche d'images pour "FPGA pwm"  

Passons maintenant au programmation; 


Voici le programme  du projet :



PWM Top Code :

----------------------------------------------------------------------------------
-- Company: There is no company
-- Engineer: Aymen Lachkhem
--
-- Create Date: 02:27:11 03/27/2016
-- Design Name:
-- Module Name: counter - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity top is
Port (
clk : in std_logic;
pwm_out : out std_logic;
rotary_a : in std_logic;
rotary_b : in std_logic
);end top;

architecture Behavioral of top is
component pwm
port(
clk: in std_logic;
pwm_var: in std_logic_vector(7 downto 0);
pwm_out: out std_logic);
end component;
component rotary
port(
pwm_var : out std_logic_vector(7 downto 0);
rotary_a : in std_logic;
rotary_b : in std_logic;
clk : in std_logic);
end component;
signal pwm_var: std_logic_vector (7 downto 0);
begin
U1 : pwm
port map(
clk => clk,
pwm_var=>pwm_var,
pwm_out=>pwm_out
);
U2 : rotary
port map(
pwm_var=>pwm_var,
rotary_a=>rotary_a,
rotary_b=>rotary_b,
clk =>clk
);
end Behavioral;



Pour les configurations physiques de mon programme avec la carte Spartan 3E j'ai choisis ces entr�es sorties: 
NET "clk" PERIOD = 20.0ns HIGH 50%;
NET "clk" LOC = "C9" | IOSTANDARD = LVTTL;
NET "rotary_a"     LOC = "K18" | IOSTANDARD = LVTTL | PULLUP;
NET "rotary_b"     LOC = "G18" | IOSTANDARD = LVTTL | PULLUP;
NET "pwm_out" LOC = "D5" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;


Le programme TOP il inclus deux component que j'ai �cris en VHDL aussi :



PWM Code :

----------------------------------------------------------------------------------
-- Company: There is no company
-- Engineer: Aymen Lachkhem
--
-- Create Date: 02:27:00 03/27/2016
-- Design Name:
-- Module Name: counter - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity pwm is
port(
clk: in std_logic;
pwm_var: in std_logic_vector(7 downto 0);
pwm_out: out std_logic

);
end pwm;
architecture Behavioral of pwm is
signal counter: std_logic_vector(7 downto 0):="00000000";
signal max_counter: std_logic_vector(7 downto 0):="11111111";
begin
process(clk)
begin
if rising_edge(clk) then
counter <= std_logic_vector( unsigned(counter) + 1 );
if counter=max_counter then
counter<="00000000";
else
if counter<pwm_var then
pwm_out<='1';
else
pwm_out<='0';
end if;
end if;
end if;
end process;
end Behavioral;





Et



ROTARY ENCODER Code :

----------------------------------------------------------------------------------
-- Company: There is no company
-- Engineer: Aymen Lachkhem
--
-- Create Date: 02:24:42 03/27/2016
-- Design Name:
-- Module Name: counter - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------

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

entity rotary is
Port ( pwm_var : out std_logic_vector(7 downto 0);
rotary_a : in std_logic;
rotary_b : in std_logic;
clk : in std_logic
);end rotary;

architecture Behavioral of rotary is
signal rotary_a_in : std_logic;
signal rotary_b_in : std_logic;
signal rotary_in : std_logic_vector(1 downto 0);
signal rotary_q1 : std_logic;
signal rotary_q2 : std_logic;
signal delay_rotary_q1 : std_logic;
signal rotary_event : std_logic;
signal rotary_left : std_logic;

signal led_pattern : std_logic_vector(7 downto 0):= "00000000";
begin

rotary_filter: process(clk)
begin
if clk'event and clk='1' then
rotary_a_in <= rotary_a;
rotary_b_in <= rotary_b;
rotary_in <= rotary_b_in & rotary_a_in;

case rotary_in is

when "00" => rotary_q1 <= '0';
rotary_q2 <= rotary_q2;

when "01" => rotary_q1 <= rotary_q1;
rotary_q2 <= '0';

when "10" => rotary_q1 <= rotary_q1;
rotary_q2 <= '1';

when "11" => rotary_q1 <= '1';
rotary_q2 <= rotary_q2;

when others => rotary_q1 <= rotary_q1;
rotary_q2 <= rotary_q2;
end case;
end if;
end process rotary_filter;
direction: process(clk)
begin
if clk'event and clk='1' then
delay_rotary_q1 <= rotary_q1;
if rotary_q1='1' and delay_rotary_q1='0' then
rotary_event <= '1';
rotary_left <= rotary_q2;
else
rotary_event <= '0';
rotary_left <= rotary_left;
end if;

end if;
end process direction;
-- PWM control.
led_display: process(clk)
begin
if clk'event and clk='1' then
if rotary_event='1' then
if rotary_left='1' then
led_pattern<=led_pattern+'1'; --INCREASE
else
led_pattern<=led_pattern-'1'; --DECREASE
end if;
end if;
pwm_var <= led_pattern;
end if;
end process led_display;
end Behavioral;






Le reste c'est d�impl�menter  le programme pour avoir ceci : 





Tuesday, March 22, 2016

Let's Discover FPGA !!

La technologie FPGA (Field-Programmable Gate Array) continue de gagner du terrain au domaine :  le march� mondial du FPGA devrait passer d'1,9 milliard de dollars en 2005 � 2,75 milliards d'ici 2010. Depuis leur invention par Xilinx en 1984, les FPGA sont partis d'un simple r�le d'� interfa�age d'appoint � pour arriver � v�ritablement remplacer les ASIC (circuits int�gr�s � application sp�cifique) et les processeurs personnalis�s dans des applications de contr�le et de traitement de signaux.


Afin d'expliquer ce succ�s, cet article propose une introduction � la technologie FPGA et met en �vidence quelques-uns des nombreux avantages que les FPGA sont aujourd'hui les seuls � offrir, introduire le lien direct entre FPGA et VHDL.


Les FPGA (Field Programmable Gate Arrays ou "r�seaux logiques programmables") sont des composants enti�rement reconfigurables ce qui permet de les reprogrammer � volont� afin d'acc�l�rer notablement certaines phases de calculs.
R�sultat de recherche d'images pour "fpga vs asic logo"
L'avantage de ce genre de circuit est sa grande souplesse qui permet de les r�utiliser � volont� dans des algorithmes diff�rents en un temps tr�s court.
Le progr�s de ces technologies permet de faire des composants toujours plus rapides et � plus haute int�gration, ce qui permet de programmer des applications importantes.
Les FPGA sont bien distincts des autres familles de circuits programmables tout en offrant le plus haut niveau d'int�gration logique.

Les circuits FPGA sont constitu�s d'une matrice de blocs logiques programmables entour�s de blocs d'entr�e sortie programmable. L'ensemble est reli� par un r�seau d'interconnexions programmable. 
Il y a 4 principales cat�gories disponible commercialement:

  • Tableau sym�trique.
  • En colonne.
  • Mers de portes.
  • Les PLD hi�rarchique.




Voici la structure interne d'un FPGA de type matrice sym�trique. Il s'agit de l'architecture que l'on retrouve dans les FPGA de la s�rie XC4000 de chez Xilinx.

On programme aussi les interconnexions entre les cellules:


Anisi que les entr�es et sorties du circuit. L'avantage des FPGA est de pouvoir �tre configur� sur place, sans envoi du circuit chez le fabricant, ce qui permet de les utiliser quelques minutes apr�s leur conceptions. Les FPGA les plus r�cents sont configurables en une centaine de millisecondes. Les FPGA sont utilis�s pour un d�veloppement rapide et bon march� des ASIC.
Les cinq principaux atouts de la technologie FPGA:

  • Performances
  • Temps de mise sur le march�
  • Co�t
  • Fiabilit�
  • Maintenance � long terme
Passons au VHDL maintenant, en faite la d�finition g�n�rale de cette derni�re va vous expliquez pourquoi on la utilise au programmation du FPGA.
VHDL est le sigle de VHSIC hardware description language ; VHSIC vient quant � lui de very-high-speed integrated circuits, une initiative de la D�fense am�ricaine dans les ann�es 1980 visant la construction de circuits int�gr�s tr�s rapides. Le VHDL est un langage de description du mat�riel utilis� en �lectronique. En tant que standard, il est ind�pendant du logiciel utilis� pour la compilation, la programmation des composants, la simulation, etc.Il autorise plusieurs m�thodologies de conception (comportemental, flot de donn�es, structurel) tout en �tant d'un tr�s haut niveau d'abstraction en �lectronique (il est ind�pendant de la technologie utilis�e : FPGA, CPLD, ASIC, etc.). Cette abstraction permet d'ailleurs de le simuler sur ordinateur avant de programmer la moindre puce.Lors de sa conception, l'objectif n'�tait pas de produire un nouveau langage ex nihilo : la D�fense avait r�cemment mis au point le langage Ada, il �tait pr�f�rable de partir sur ces bases et en exploiter autant que possible la syntaxe, en l'adaptant au contexte de l'�lectronique num�rique.  

Il n'est pas le seul sur le march� : Verilog, par exemple, est �galement un langage tr�s utilis�, poss�dant une syntaxe fort diff�rente mais des fonctionnalit�s �quivalentes, si ce n'est �gales. VHDL semble plus utilis� en Europe. Une belle proportion des outils disponibles supportent indiff�remment les deux.

Aujourd'hui je vais vous montrer comment initialer un tel projet en VHDL et le faire implanter sur une carte FPGA.
Le logiciel sur lequel on va �crire nos programme en VHDL est :

ISE WebPACK Design Software

Voici ce premier exemple du programme VHDL fait pas � pas sur ISE dans la vid�o si dessous:



Le programme que j'ai �crit si dessus est celui la :


-- Company:
-- Engineer: Aymen Lachkhem
-- Create Date: 19:06:52 03/21/2016
-- Design Name:
-- Module Name: Logic_Gate_Code - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
-- Dependencies:
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
---------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity Logic_Gate_Code is
Port ( x : in STD_LOGIC;
y : in STD_LOGIC;
s : out STD_LOGIC);
end Logic_Gate_Code;
architecture Behavioral of Logic_Gate_Code is
begin
s <= x AND y;
end Behavioral;


Ce logiciel nous offre l'utilit� d'�viter d'�crire notre programme comme si dessous en mais de faire r�aliser une programmation graphique " Schematic" , c�ci facilite la programmation il suffit de choisir les ports ou les circuits int�gr�es ou les portes logiques qu'on a besoin de le faire connecter pour avoir notre fonctionnement demand�.
Voila un exemple de ce que j'ai dis, dans la vid�o au dessous j'ai r�alis� un projet sur ISE pas � pas mais au lieu d'�crire mot a mot mon programme j'ai juste fait intervenir le Schematic.