hexadécimal en binaire VHDL
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

hexadécimal en binaire VHDL



  1. #1
    KPinto

    hexadécimal en binaire VHDL


    ------

    Bien le bonjour !

    Je code actuellement en VHDL avec la version étudiante de ModelSim 10.4a et
    je dois lire dans un fichier contenant plusieurs plusieurs ligne du type :

    :0600000002008D02004029
    :030023000200597F
    :10004000C0E0C2A8C29075A002C2B 700AB80D2B710
    :10005000D290D0E0C289D2A832C2B 5209928C0E09F
    :10006000E599C298B40205782B020 079B600030224
    :100070000079B85D0302007908F6B 40304D2007871

    c'est de l'hexadécimal.
    j'aimerais convertir ces lignes en bit par exemple '0' => '0000', '1' => '0001' etc...
    Mais je n'arrive pas à récupérer chaque caractère séparément.

    Mon code pour récupérer la ligne:

    Code:
    architecture sim of mc87c51_rom is
    
       type   rom_type is array (65535 downto 0) of bit_vector(3 downto 0); 
       signal s_init : boolean := false;
    
    begin
    
    p_read : process (clk, reset, rom_adr_i)
          variable i : integer;    
          variable v_line : line;
          variable res: rom_type;
          file f_initfile : text is in c_init_file;
      begin
    
         if (not s_init) then
            i := 0;
            while ((not endfile(f_initfile))) loop
              readline(f_initfile,v_line);
              read(v_line,res(i));    
            end loop;
            s_init <= true;  
        end if;
      end process p_read; 
    end sim;
    Je pense que la fonction read ne récupère que la ligne. Je ne sais pas si il existe une fonction
    qui permet de récupérer seulement un caractère. Merci.

    KP.

    -----

  2. #2
    KPinto

    Re : hexadécimal en binaire VHDL

    Bon j'ai tenté un truc mais lorsque je simule je n'obtiens
    pas la valeur voulu j'obtiens toujours 00000000...
    j'ai récupéré chaque caractère puis j'ai fais la conversion
    (je ne vois pas comment raccourcir le code)

    Voici mon code
    Code:
     if (not s_init) then
          i := 0;
          J := 1;
          k := 0;
          while ((not endfile(f_initfile))) loop
            readline(f_initfile,v_line);
            read(v_line,v_rom_data(i));     
    
    	case v_rom_data(i) is
    	    when '0' => --test(i) <= "0000";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "00000000";
    	    		when '1' => res(k) <= "00000001";
    	    		when '2' => res(k) <= "00000010";
    	    		when '3' => res(k) <= "00000011";
    	    		when '4' => res(k) <= "00000100";
    	    		when '5' => res(k) <= "00000101";
    	    		when '6' => res(k) <= "00000110";
    	    		when '7' => res(k) <= "00000111";
    	    		when '8' => res(k) <= "00001000";
    	    		when '9' => res(k) <= "00001001";
    	    		when 'A' => res(k) <= "00001010";
    	    		when 'B' => res(k) <= "00001011";
    	    		when 'C' => res(k) <= "00001100";
    	    		when 'D' => res(k) <= "00001101";
    	    		when 'E' => res(k) <= "00001110";
    	    		when 'F' => res(k) <= "00001111";
    	    		when others => NULL;
            	end case;
    	    when '1' => --test(i) <= "0001";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "00010000";
    	    		when '1' => res(k) <= "00010001";
    	    		when '2' => res(k) <= "00010010";
    	    		when '3' => res(k) <= "00010011";
    	    		when '4' => res(k) <= "00010100";
    	    		when '5' => res(k) <= "00010101";
    	    		when '6' => res(k) <= "00010110";
    	    		when '7' => res(k) <= "00010111";
    	    		when '8' => res(k) <= "00011000";
    	    		when '9' => res(k) <= "00011001";
    	    		when 'A' => res(k) <= "00011010";
    	    		when 'B' => res(k) <= "00011011";
    	    		when 'C' => res(k) <= "00011100";
    	    		when 'D' => res(k) <= "00011101";
    	    		when 'E' => res(k) <= "00011110";
    	    		when 'F' => res(k) <= "00011111";
    	    		when others => NULL;
            	end case;
    	    when '2' => --test(i) <= "0010";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "00100000";
    	    		when '1' => res(k) <= "00100001";
    	    		when '2' => res(k) <= "00100010";
    	    		when '3' => res(k) <= "00100011";
    	    		when '4' => res(k) <= "00100100";
    	    		when '5' => res(k) <= "00100101";
    	    		when '6' => res(k) <= "00100110";
    	    		when '7' => res(k) <= "00100111";
    	    		when '8' => res(k) <= "00101000";
    	    		when '9' => res(k) <= "00101001";
    	    		when 'A' => res(k) <= "00101010";
    	    		when 'B' => res(k) <= "00101011";
    	    		when 'C' => res(k) <= "00101100";
    	    		when 'D' => res(k) <= "00101101";
    	    		when 'E' => res(k) <= "00101110";
    	    		when 'F' => res(k) <= "00101111";
    	    		when others => NULL;
            	end case;
    	    when '3' => --test(i) <= "0011";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "00110000";
    	    		when '1' => res(k) <= "00110001";
    	    		when '2' => res(k) <= "00110010";
    	    		when '3' => res(k) <= "00110011";
    	    		when '4' => res(k) <= "00110100";
    	    		when '5' => res(k) <= "00110101";
    	    		when '6' => res(k) <= "00110110";
    	    		when '7' => res(k) <= "00110111";
    	    		when '8' => res(k) <= "00111000";
    	    		when '9' => res(k) <= "00111001";
    	    		when 'A' => res(k) <= "00111010";
    	    		when 'B' => res(k) <= "00111011";
    	    		when 'C' => res(k) <= "00111100";
    	    		when 'D' => res(k) <= "00111101";
    	    		when 'E' => res(k) <= "00111110";
    	    		when 'F' => res(k) <= "00111111";
    	    		when others => NULL;
            	end case;
    	    when '4' => --test(i) <= "0100";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "01000000";
    	    		when '1' => res(k) <= "01000001";
    	    		when '2' => res(k) <= "01000010";
    	    		when '3' => res(k) <= "01000011";
    	    		when '4' => res(k) <= "01000100";
    	    		when '5' => res(k) <= "01000101";
    	    		when '6' => res(k) <= "01000110";
    	    		when '7' => res(k) <= "01000111";
    	    		when '8' => res(k) <= "01001000";
    	    		when '9' => res(k) <= "01001001";
    	    		when 'A' => res(k) <= "01001010";
    	    		when 'B' => res(k) <= "01001011";
    	    		when 'C' => res(k) <= "01001100";
    	    		when 'D' => res(k) <= "01001101";
    	    		when 'E' => res(k) <= "01001110";
    	    		when 'F' => res(k) <= "01001111";
    	    		when others => NULL;
            	end case;
    	    when '5' => --test(i) <= "0101";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "01010000";
    	    		when '1' => res(k) <= "01010001";
    	    		when '2' => res(k) <= "01010010";
    	    		when '3' => res(k) <= "01010011";
    	    		when '4' => res(k) <= "01010100";
    	    		when '5' => res(k) <= "01010101";
    	    		when '6' => res(k) <= "01010110";
    	    		when '7' => res(k) <= "01010111";
    	    		when '8' => res(k) <= "01011000";
    	    		when '9' => res(k) <= "01011001";
    	    		when 'A' => res(k) <= "01011010";
    	    		when 'B' => res(k) <= "01011011";
    	    		when 'C' => res(k) <= "01011100";
    	    		when 'D' => res(k) <= "01011101";
    	    		when 'E' => res(k) <= "01011110";
    	    		when 'F' => res(k) <= "01011111";
    	    		when others => NULL;
            	end case;
    	    when '6' => --test(i) <= "0110";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "01100000";
    	    		when '1' => res(k) <= "01100001";
    	    		when '2' => res(k) <= "01100010";
    	    		when '3' => res(k) <= "01100011";
    	    		when '4' => res(k) <= "01100100";
    	    		when '5' => res(k) <= "01100101";
    	    		when '6' => res(k) <= "01100110";
    	    		when '7' => res(k) <= "01100111";
    	    		when '8' => res(k) <= "01101000";
    	    		when '9' => res(k) <= "01101001";
    	    		when 'A' => res(k) <= "01101010";
    	    		when 'B' => res(k) <= "01101011";
    	    		when 'C' => res(k) <= "01101100";
    	    		when 'D' => res(k) <= "01101101";
    	    		when 'E' => res(k) <= "01101110";
    	    		when 'F' => res(k) <= "01101111";
    	    		when others => NULL;
            	end case;
    	    when '7' => --test(i) <= "0111";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "01110000";
    	    		when '1' => res(k) <= "01110001";
    	    		when '2' => res(k) <= "01110010";
    	    		when '3' => res(k) <= "01110011";
    	    		when '4' => res(k) <= "01110100";
    	    		when '5' => res(k) <= "01110101";
    	    		when '6' => res(k) <= "01110110";
    	    		when '7' => res(k) <= "01110111";
    	    		when '8' => res(k) <= "01111000";
    	    		when '9' => res(k) <= "01111001";
    	    		when 'A' => res(k) <= "01111010";
    	    		when 'B' => res(k) <= "01111011";
    	    		when 'C' => res(k) <= "01111100";
    	    		when 'D' => res(k) <= "01111101";
    	    		when 'E' => res(k) <= "01111110";
    	    		when 'F' => res(k) <= "01111111";
    	    		when others => NULL;
            	end case;
    	    when '8' => --test(i) <= "1000";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "10000000";
    	    		when '1' => res(k) <= "10000001";
    	    		when '2' => res(k) <= "10000010";
    	    		when '3' => res(k) <= "10000011";
    	    		when '4' => res(k) <= "10000100";
    	    		when '5' => res(k) <= "10000101";
    	    		when '6' => res(k) <= "10000110";
    	    		when '7' => res(k) <= "10000111";
    	    		when '8' => res(k) <= "10001000";
    	    		when '9' => res(k) <= "10001001";
    	    		when 'A' => res(k) <= "10001010";
    	    		when 'B' => res(k) <= "10001011";
    	    		when 'C' => res(k) <= "10001100";
    	    		when 'D' => res(k) <= "10001101";
    	    		when 'E' => res(k) <= "10001110";
    	    		when 'F' => res(k) <= "10001111";
    	    		when others => NULL;
            	end case;
    	    when '9' => --test(i) <= "1001";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "10010000";
    	    		when '1' => res(k) <= "10010001";
    	    		when '2' => res(k) <= "10010010";
    	    		when '3' => res(k) <= "10010011";
    	    		when '4' => res(k) <= "10010100";
    	    		when '5' => res(k) <= "10010101";
    	    		when '6' => res(k) <= "10010110";
    	    		when '7' => res(k) <= "10010111";
    	    		when '8' => res(k) <= "10011000";
    	    		when '9' => res(k) <= "10011001";
    	    		when 'A' => res(k) <= "10011010";
    	    		when 'B' => res(k) <= "10011011";
    	    		when 'C' => res(k) <= "10011100";
    	    		when 'D' => res(k) <= "10011101";
    	    		when 'E' => res(k) <= "10011110";
    	    		when 'F' => res(k) <= "10011111";
    	    		when others => NULL;
            	end case;
    	    when 'A' => --test(i) <= "1010";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "10100000";
    	    		when '1' => res(k) <= "10100001";
    	    		when '2' => res(k) <= "10100010";
    	    		when '3' => res(k) <= "10100011";
    	    		when '4' => res(k) <= "10100100";
    	    		when '5' => res(k) <= "10100101";
    	    		when '6' => res(k) <= "10100110";
    	    		when '7' => res(k) <= "10100111";
    	    		when '8' => res(k) <= "10101000";
    	    		when '9' => res(k) <= "10101001";
    	    		when 'A' => res(k) <= "10101010";
    	    		when 'B' => res(k) <= "10101011";
    	    		when 'C' => res(k) <= "10101100";
    	    		when 'D' => res(k) <= "10101101";
    	    		when 'E' => res(k) <= "10101110";
    	    		when 'F' => res(k) <= "10101111";
    	    		when others => NULL;
            	end case;
    	    when 'B' => --test(i) <= "1011";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "10110000";
    	    		when '1' => res(k) <= "10110001";
    	    		when '2' => res(k) <= "10110010";
    	    		when '3' => res(k) <= "10110011";
    	    		when '4' => res(k) <= "10110100";
    	    		when '5' => res(k) <= "10110101";
    	    		when '6' => res(k) <= "10110110";
    	    		when '7' => res(k) <= "10110111";
    	    		when '8' => res(k) <= "10111000";
    	    		when '9' => res(k) <= "10111001";
    	    		when 'A' => res(k) <= "10111010";
    	    		when 'B' => res(k) <= "10111011";
    	    		when 'C' => res(k) <= "10111100";
    	    		when 'D' => res(k) <= "10111101";
    	    		when 'E' => res(k) <= "10111110";
    	    		when 'F' => res(k) <= "10111111";
    	    		when others => NULL;
            	end case;
    	    when 'C' => --test(i) <= "1100";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "11000000";
    	    		when '1' => res(k) <= "11000001";
    	    		when '2' => res(k) <= "11000010";
    	    		when '3' => res(k) <= "11000011";
    	    		when '4' => res(k) <= "11000100";
    	    		when '5' => res(k) <= "11000101";
    	    		when '6' => res(k) <= "11000110";
    	    		when '7' => res(k) <= "11000111";
    	    		when '8' => res(k) <= "11001000";
    	    		when '9' => res(k) <= "11001001";
    	    		when 'A' => res(k) <= "11001010";
    	    		when 'B' => res(k) <= "11001011";
    	    		when 'C' => res(k) <= "11001100";
    	    		when 'D' => res(k) <= "11001101";
    	    		when 'E' => res(k) <= "11001110";
    	    		when 'F' => res(k) <= "11001111";
    	    		when others => NULL;
            	end case;
    	    when 'D' => --test(i) <= "1101";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "11010000";
    	    		when '1' => res(k) <= "11010001";
    	    		when '2' => res(k) <= "11010010";
    	    		when '3' => res(k) <= "11010011";
    	    		when '4' => res(k) <= "11010100";
    	    		when '5' => res(k) <= "11010101";
    	    		when '6' => res(k) <= "11010110";
    	    		when '7' => res(k) <= "11010111";
    	    		when '8' => res(k) <= "11011000";
    	    		when '9' => res(k) <= "11011001";
    	    		when 'A' => res(k) <= "11011010";
    	    		when 'B' => res(k) <= "11011011";
    	    		when 'C' => res(k) <= "11011100";
    	    		when 'D' => res(k) <= "11011101";
    	    		when 'E' => res(k) <= "11011110";
    	    		when 'F' => res(k) <= "11011111";
    	    		when others => NULL;
            	end case;
    	    when 'E' => --test(i) <= "1110";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "11100000";
    	    		when '1' => res(k) <= "11100001";
    	    		when '2' => res(k) <= "11100010";
    	    		when '3' => res(k) <= "11100011";
    	    		when '4' => res(k) <= "11100100";
    	    		when '5' => res(k) <= "11100101";
    	    		when '6' => res(k) <= "11100110";
    	    		when '7' => res(k) <= "11100111";
    	    		when '8' => res(k) <= "11101000";
    	    		when '9' => res(k) <= "11101001";
    	    		when 'A' => res(k) <= "11101010";
    	    		when 'B' => res(k) <= "11101011";
    	    		when 'C' => res(k) <= "11101100";
    	    		when 'D' => res(k) <= "11101101";
    	    		when 'E' => res(k) <= "11101110";
    	    		when 'F' => res(k) <= "11101111";
    	    		when others => NULL;
            	end case;
    	    when 'F' => --test(i) <= "1111";
    		case v_rom_data(j) is
    	    		when '0' => res(k) <= "11110000";
    	    		when '1' => res(k) <= "11110001";
    	    		when '2' => res(k) <= "11110010";
    	    		when '3' => res(k) <= "11110011";
    	    		when '4' => res(k) <= "11110100";
    	    		when '5' => res(k) <= "11110101";
    	    		when '6' => res(k) <= "11110110";
    	    		when '7' => res(k) <= "11110111";
    	    		when '8' => res(k) <= "11111000";
    	    		when '9' => res(k) <= "11111001";
    	    		when 'A' => res(k) <= "11111010";
    	    		when 'B' => res(k) <= "11111011";
    	    		when 'C' => res(k) <= "11111100";
    	    		when 'D' => res(k) <= "11111101";
    	    		when 'E' => res(k) <= "11111110";
    	    		when 'F' => res(k) <= "11111111";
    	    		when others => NULL;
            	end case;
    	    when others => NULL;
            end case;
            i := i + 2;
    	j := j + 2;
    	k := k + 1;
          end loop;
          s_init <= true;
        end if;
        if (clk'event and (clk = '1')) then  -- rising clock edge
          rom_data_o <= to_stdlogicvector(res(conv_integer(unsigned(ctr))));
        end if;
    Merci.

    KP

  3. #3
    KPinto

    Re : hexadécimal en binaire VHDL

    Personne pour m'aider svp :x ?

  4. #4
    jiherve

    Re : hexadécimal en binaire VHDL

    Bonjour,
    Ton fichier est un fichier de caractères donc il faut lire une ligne et ensuite vider le buffer ligne en lisant les caractères un par un,puis convertir chaque caractère en sont équivalent hexa(4 bits).
    Comme c'est un fichier destiné à programmer un PROM(S3,S4,HEX,JED) il possede une structure qu'il faudra respecter pour arriver à en extraire les vraies données. En général chaque ligne commence par un adresse suivie par un certains nombre d'octets de données et la ligne se termine par une checksum (un octet).
    voila un exemple :http://www.ee.sunysb.edu/~jochoa/vhd...e_tutorial.htm
    JR
    l'électronique c'est pas du vaudou!

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

    Re : hexadécimal en binaire VHDL

    Merci de ta réponse je vais essayé de suite !

  7. #6
    KPinto

    Re : hexadécimal en binaire VHDL

    Merci Jiherve, grâce à toi j'ai réussi à enlever tout un tas de ligne de code inutile et j'ai réussi à convertir en hexadécimal.
    Ce que je voudrais faire maintenant c'est concaténer deux résultats qui se succèdent pour faire un vecteur de 8 bit.

    Code:
    case v_rom_data is
    	    		when '0' => res(k) <= "0000";
    	    		when '1' => res(k) <= "0001";
    	    		when '2' => res(k) <= "0010";
    	    		when '3' => res(k) <= "0011";
    	    		when '4' => res(k) <= "0100";
    	    		when '5' => res(k) <= "0101";
    	    		when '6' => res(k) <= "0110";
    	    		when '7' => res(k) <= "0111";
    	    		when '8' => res(k) <= "1000";
    	    		when '9' => res(k) <= "1001";
    	    		when 'A' => res(k) <= "1010";
    	    		when 'B' => res(k) <= "1011";
    	    		when 'C' => res(k) <= "1100";
    	    		when 'D' => res(k) <= "1101";
    	    		when 'E' => res(k) <= "1110";
    	    		when 'F' => res(k) <= "1111";
    	    		when others => NULL;
            	end case;
    		test(j) <= res(k)&res(k+1);
    j'ai essayé ça mais arrivé a la fin du fichier le res(k+1) sera NULL (ou en tout cas pas une valeur traitable dans le cas de mon problème).
    Comment puis-je faire pour concaténer les 2 premiers caractère convertis puis les 2 suivants etc... ?

  8. #7
    KPinto

    Re : hexadécimal en binaire VHDL

    Tout fonctionne Merci !

Discussions similaires

  1. Maple: Convertir nombre à virgule (binaire, octal, ou hexadécimal) en hexadécimal
    Par invitee054a959 dans le forum Mathématiques du collège et du lycée
    Réponses: 5
    Dernier message: 21/04/2017, 09h40
  2. Projet en Vhdl: Addition de vecteur en binaire
    Par invitefd5dc67f dans le forum Électronique
    Réponses: 14
    Dernier message: 02/11/2012, 18h51
  3. Conversion réel en binaire en vhdl !!
    Par invite169e9a75 dans le forum Électronique
    Réponses: 0
    Dernier message: 05/05/2010, 14h03
  4. conversion du binaire à l'hexadécimal
    Par invitecc2b8a85 dans le forum Électronique
    Réponses: 4
    Dernier message: 05/04/2008, 07h14
  5. conversion binaire,octal,hexadécimal
    Par invite5e51f717 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 21/03/2006, 08h00
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...