[Numérique] [vhdl] adc
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

[vhdl] adc



  1. #1
    dr4gon993

    [vhdl] adc


    ------

    Bonjour quelqu'un pourrai m'aiguiller sur comment écrire un Bloc ADC sur un FPGA je voudrai brancher un potentiomètre pour ensuite récupérer les valeurs, pour allumer des LED dans un premier temps.
    j'ai vue que megawizard et qsys ne propose pas de fonction déjà faite.
    Je vais essayer de résoudre ce petit exercice et en même temps et si quelqu'un veux bien rebondir sur le sujet pour m'aider je prend.


    mon adc a une résolution de 12 bits, (4096 points de mesure) j'imagine qu'il faut définir dans le programme, l'entrée analogique de l'adc !
    si on a une résolution de 12 bits on a 12 lignes a surveillé sur la sortie numérique si l'on veux avoir la pleine résolution. Ma question est est-ce que c'est fait automatiquement du moment qu'on envoie une valeur sur l'entrée de l'adc ou il faut écrire un bloque ?

    Si c'est automatique Comment ce nome c'est 12 lignes de sortie pour récupérer l'info ?
    Si c'est pas automatique ... (j’espère pas pour l'instant) il faut écrire le code le plus propre et le plus générique possible pour pouvoir le re utilisé après ( pour l'instant j'ai pas envisagé ca ).


    (matos j'utilise une DE0 nano de altéra).

    CDLT Dr4gon993.

    -----

  2. #2
    dr4gon993

    Re : [vhdl] adc

    alors c'est bien automatique

    il faut donner une horloge un bit de validation et une adresse sur 3 bit qui sélectionne une des 8 voies analogique, et mettre en place un registre a décalage de 12 bit pour recevoir la data qui revient par un fil en mode série.

    si la fréquence d'entrée de la clock est de 50 mhz on a besoin de 15 coup d'horloge pour lire une entrée.

    la ou je comprend pas c'est quand je lis cette documentation du constructeur altera :


    ftp://ftp.altera.com/up/pub/Altera_M...0-Nano_ADC.pdf


    page 3 le chronogramme on fait des demi période sur l'adresse on a 2.5 coup d'horloge pour envoyer l'adresse et avant même d'avoir fini d'envoyer la réponse de la data commence à partir non plus entre front descendent et front montant mais l'inverse.


    j'ai du mal a comprendre le décalage entre la data et adresse pour moi quand on déclenche sur un front on le garde tout le long la j'ai du mal a saisir.

    bon j'avance toujours un peut

    Dernière modification par dr4gon993 ; 25/01/2016 à 16h28.

  3. #3
    jiherve

    Re : [vhdl] adc

    Bonsoir,
    ici http://www.ti.com/lit/ds/symlink/adc128s022.pdf la data sheet du CAN
    Din est échantillonné sur le front montant et Dout est fourni sur le front descendant donc le FPGA fournira les adresses sur un front descendant et échantillonnera les données sur un front montant. à noter qu'au cycle n on fournit l'adresse n et on lit les données n-1!!
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    dr4gon993

    Re : [vhdl] adc

    Re je me remet dessus aujourd'hui

    Donc je compte 16 coups d'horloge (50Mhz) pour faire une lecture d'une entrée.


    et j'utilise la commande avec clk en sensibilité dans le process

    if (Clk'event and clk='1') then
    ou
    Clk'event and clk ='0';

    pour avoir les front montant et descendant

    et je crée un compteur 5bits qui cadence les opérations a faire dans le process.

    merci JiHervé je vais mettre en pratique vite ca sera mieux que de théorisé.

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : [vhdl] adc

    Bonjour,
    on ne peut pas faire un process synchrone utilisant les deux fronts d'horloge pour les mêmes signaux car les bascules physiques du FPGA utilisent soit le montant soit le descendant et c'est exclusif.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    dr4gon993

    Re : [vhdl] adc

    Citation Envoyé par jiherve Voir le message
    Bonjour,
    on ne peut pas faire un process synchrone utilisant les deux fronts d'horloge pour les mêmes signaux car les bascules physiques du FPGA utilisent soit le montant soit le descendant et c'est exclusif.
    JR


    re voila comment j'ai essayé de faire :

    J'ai écris que le signal CS ca ma pris la tête jusqu'à que je pense que je pouvais faire 2 process synchro sur 2 front différent.

    Tu veux voir le programme ?

    Bon j'ai peut être tout faux faut que j’essaye d'utilisé model-sim pour faire un check.

    la route est longue est je suis bien content que tu sois la merci !

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_1164.STD_LOGIC_VECTOR;
    use IEEE.STD_LOGIC_UNSIGNED.ALL; 
     
    
    
    Entity ADC is 
    	port (
    			clk    	       : 	in		std_logic;
    --			SW		: 	IN		std_logic_vector (4 downto 0); 	-- switch de selection de l'entr�e analogique( 0 � 7 ) � convertir
    --			Dout		:	IN		std_logic;	                   	-- sortie numerique serie de l'ADC                                                           	
    --			CLK_out	:	OUT	        std_logic;                     	-- Horloge de base de la carte
    	                CS  		:       OUT 	        std_logic                     	-- commande �criture lecture niveau bas 
    --	                Din 		:       OUT 	        std_logic                      	-- commande � envoyer pour selection de lentr�e analogique � convertir par l'adc
    	     );
    END Entity;
    
    
    
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    
    
    Architecture Canberra of ADC is 
    
    signal cmptF		: 	std_logic_vector(4 downto 0):=(others =>'0');	
    signal cmptR		:	std_logic_vector(4 downto 0):=(others =>'0');
    signal TCs_off		: 	std_logic:='1';
    
     
    begin 
    		process (CLK)
    			begin
    		    	
    				if clk'event and clk = '0'and cmptF<= "01111" then
    					if (cmptF = "00000")then
    		    			TCs_off<='0';
    		    			cmptF <= cmptF+'1';
    		    			else
    		    			TCs_off <= '0';
    		    			cmptF<= cmptF+'1';
    		    		end if;
    		    		elsif (clk'event and clk='0') then
    		    		cmptF<="00000";
    		    	end if;
    		end process;
    		
    		
    		
    
    		process(CLK)
    			begin
    				if clk'event and clk ='1'  and cmptR <= "01111" then
    				cmptR <= cmptR + '1';
    				else
    				cmptR<="00000";
    				end if;
    		end process;
    
    Cs <= TCs_off;
    
    end architecture;
    Dernière modification par dr4gon993 ; 29/01/2016 à 15h02.

  8. #7
    dr4gon993

    Re : [vhdl] adc

    je suis plus très sur de mon code je change

  9. #8
    dr4gon993

    Re : [vhdl] adc

    ca marche pas je voulais que un processus descende cs et l’autre le remonte


    jai une erreur de constante entre Tcs_off et les compteur cmptr et f je cherche


    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_1164.STD_LOGIC_VECTOR;
    use IEEE.STD_LOGIC_UNSIGNED.ALL; 
     
    
    
    Entity ADC is 
    	port (
    			clk    	: 	in		std_logic;
    --			SW			: 	IN		std_logic_vector (4 downto 0); 	-- switch de selection de l'entr�e analogique( 0 � 7 ) � convertir
    --			Dout		:	IN		std_logic;	                   	-- sortie numerique serie de l'ADC                                                           	
    --			CLK_out	:	OUT	std_logic;                     	-- Horloge de base de la carte � envoyer (50mhz ** 3.2mhz ) � l'adc faire une conv ou utilis� une pll pour faire du 3.2 mhz
    	      CS  		:  OUT 	std_logic                     	-- commande �criture lecture niveau bas 
    --	      Din 		:  OUT 	std_logic                      	-- commande � envoyer pour selection de lentr�e analogique � convertir par l'adc
    	     );
    END Entity;
    
    
    
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	;
    
    
    Architecture Canberra of ADC is 
    
    signal cmptF		: 	std_logic_vector(4 downto 0):=(others =>'0');	-- je sais pas si ca va servir on va voir !
    signal cmptR		:	std_logic_vector(4 downto 0):=(others =>'0');
    signal TCs_off		: 	std_logic:='1';
    
     
    begin 
    		process (CLK)
    			begin
    		    	
    				if (clk'event and clk = '0'and cmptF< "01111") then
    					
    					if (cmptF = "00000")then
    					
    		    			TCs_off<='0';
    		    			cmptF <= cmptF+'1';
    						
    		    			else
    						
    		    			TCs_off <= '0';
    		    			cmptF<= cmptF+'1';
    						
    		    		end if;
    					
    		    	elsif (clk'event and clk='0'and cmptF < "10000") then
    					
    		    		cmptF<="00000";
    		    	
    			  end if;
    		end process;
    		
    		
    		
    
    		process(CLK)
    			begin
    				if (clk'event and clk ='1'  and cmptR < "01111") then
    				
    				cmptR <= cmptR + '1';
    				
    				elsif (clk'event and clk= '1' and cmptR = "01111" )then
    				
    				cmptR<="00000";
    				TCs_off<='1';
    				
    				end if;
    		
    		
    		
    		end process;
    
    Cs <= TCs_off;
    
    end architecture;

  10. #9
    dr4gon993

    Re : [vhdl] adc

    j'ai re écris le code je pense que ca pourrai marché faut que je le test


    Code:
    library IEEE;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.numeric_std.all;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    
    
    Entity adc is 
    		
    		
    		port (
    				clk	:	in std_logic;   
    				cs		: out std_logic:='1'					
    				);
    end entity;
    
    architecture crotte of adc is 
    
    
    signal 	Tcs		:	std_logic:='1';
    signal 	TCi		: 	std_logic:='1';
    signal 	CPT		:	std_logic_vector (4 downto 0):=(others => '0');
    signal 	CPT2		:	std_logic_vector (4 downto 0):=(others => '0'); 
    
    begin 
    
    		process (clk)
    				begin
    				if (clk'event and clk = '0')then		-- ICI sur front descendant
    					if (CPT = "00000") then
    						TCs<='0';
    					elsif (CPT = "00001")then
    						TCs<= '0';
    						elsif(CPT = "00010")then
    							TCs <= '0';
    							elsif (CPT = "00011")then
    								TCs <= '0';
    								elsif (CPT = "00100")then
    									TCs <='0';
    									elsif (CPT = "00101")then
    										TCs <= '0';
    										elsif (CPT = "00110")then
    											TCs <= '0';
    											elsif(CPT = "00111")then
    												TCs <= '0';
    												elsif (CPT = "01000")then
    													TCs <= '0';
    														elsif (CPT = "01001")then
    															TCs <= '0';
    															elsif (CPT = "01010")then
    																TCs <= '0';
    																elsif (CPT = "01011")then
    																	TCs <= '0';
    																	elsif (CPT = "01100")then
    																		TCs <= '0';
    																		elsif (CPT = "01101")then
    																			TCs <= '0';
    																			elsif(CPT = "01110")then
    																				TCs <= '0';
    																				elsif (CPT = "01111")then
    																					TCs<='0';
    																					CPT <= "00000";
    																					end if;
    																			end if;						
    CPT <= CPT + '1';						
    												
    																	
    				
    		end process;
    		
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--;
    --	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--	--;	
    
    		process (clk)
    				begin
    				if (clk'event and clk = '1')then   -- ICI sur front montant
    					if (CPT2 = "00000") then
    					TCi<=TCs;
    					elsif (CPT2 = "00001")then
    						TCi<=TCs;
    						elsif(CPT2 = "00010")then
    							TCi<=TCs;
    							elsif (CPT2 = "00011")then
    								TCi<=TCs;
    								elsif (CPT2 = "00100")then
    									TCi<=TCs;
    									elsif (CPT2 = "00101")then
    										TCi<=TCs;
    										elsif (CPT2 = "00110")then
    											TCi<=TCs;
    											elsif(CPT2 = "00111")then
    												TCi<=TCs;
    												elsif (CPT2 = "01000")then
    													TCi<=TCs;
    														elsif (CPT2 = "01001")then
    															TCi<=TCs;
    															elsif (CPT2 = "01010")then
    																TCi<=TCs;
    																elsif (CPT2 = "01011")then
    																	TCi<=TCs;
    																	elsif (CPT2 = "01100")then
    																		TCi<=TCs;
    																		elsif (CPT2 = "01101")then
    																			TCi<=TCs;
    																			elsif(CPT2 = "01110")then
    																				TCi<=TCs;
    																				elsif (CPT2 = "01111")then
    																					TCi<= '1'or TCs;
    																					CPT2 <= "00000";
    																					end if;
    																			end if;						
    CPT2 <= CPT2 + '1';			
    
    			end process;
    		
    
    CS<=TCi;
    	
    end architecture;

  11. #10
    jiherve

    Re : [vhdl] adc

    Bonsoir,
    Si tu veux qu'un signal fonctionne sur les deux fronts il faudra deux process synchrones , un pour chaque front qui généreront chacun un signal interne et ces deux signaux seront alors combinés dans un process asynchrone.
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    dr4gon993

    Re : [vhdl] adc

    j’ai fini par le comprendre a force de taper sur mon clavier mais il faut que je test en simu voir le résultat sur model sim

  13. #12
    indri

    Re : [vhdl] adc

    Tu connais pas la fonction "case"?
    Je pense pas que ca change grand chose une fois synthétisé, mais c'est bcp plus lisible que tous tes elsif

    Sinon c'est le protocole SPI classique, tu dois trouver des tas de code exemple sur le net
    Là où va le vent...

  14. #13
    dr4gon993

    Re : [vhdl] adc

    Citation Envoyé par indri Voir le message
    Tu connais pas la fonction "case"?
    Je pense pas que ca change grand chose une fois synthétisé, mais c'est bcp plus lisible que tous tes elsif

    Sinon c'est le protocole SPI classique, tu dois trouver des tas de code exemple sur le net

    Oui grave j'ai fait ca car comme je suis novice je douté de mon code j'ai donc simplifié a mort en utilisant une seul fonction que je maitrise bien.
    La je suis en galère depuis vendredi sur model-sim mais j’essaye de m'en sortir en regardant des tutos et des vidéos ...


    merci pour le conseil je vais mettre en pratique des que j'aurai validé les chronogrammes sur model sim.

    pour ensuite continuer la mise en place de ma fonction "ADC" de ma carte.

Discussions similaires

  1. commande d'ascenseur avec VHDL la carte vhdl
    Par invite2b1f3b55 dans le forum Électronique
    Réponses: 6
    Dernier message: 02/06/2014, 03h41
  2. vhdl
    Par invitef1b39f51 dans le forum Électronique
    Réponses: 2
    Dernier message: 27/04/2011, 20h30
  3. Vhdl when others
    Par invitef1539ac2 dans le forum Électronique
    Réponses: 1
    Dernier message: 13/05/2009, 21h46
  4. Point flottant en VHDL et vhdl-200x
    Par invite6eee6b27 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 02/09/2008, 20h47
  5. vhdl
    Par invitedcb8d9bb dans le forum Électronique
    Réponses: 5
    Dernier message: 29/03/2007, 20h52
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...