VHDL convert string to integer

Status
Not open for further replies.

shedo

Junior Member level 1
Joined
Jan 31, 2013
Messages
17
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Visit site
Activity points
1,391
Hi all,
I want to convert a strings into integer values.

eg: "123" => 123

Can someone recommend a "best" way of converting strings to integers in VHDL?
Thanks
 

how about this?


Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
----------------------------------------------------------------------
  --Will take a string in the given radix and conver it to an integer
  ----------------------------------------------------------------------
  function string_to_int(x_str : string; radix : positive range 2 to 36 := 10) return integer is
    constant STR_LEN          : integer := x_str'length;
    
    variable chr_val          : integer;
    variable ret_int          : integer := 0;
    variable do_mult          : boolean := true;
    variable power            : integer := 0;
  begin
    
    for i in STR_LEN downto 1 loop
      case x_str(i) is
        when '0'       =>   chr_val := 0;
        when '1'       =>   chr_val := 1;
        when '2'       =>   chr_val := 2;
        when '3'       =>   chr_val := 3;
        when '4'       =>   chr_val := 4;
        when '5'       =>   chr_val := 5;
        when '6'       =>   chr_val := 6;
        when '7'       =>   chr_val := 7;
        when '8'       =>   chr_val := 8;
        when '9'       =>   chr_val := 9;
        when 'A' | 'a' =>   chr_val := 10;
        when 'B' | 'b' =>   chr_val := 11;
        when 'C' | 'c' =>   chr_val := 12;
        when 'D' | 'd' =>   chr_val := 13;
        when 'E' | 'e' =>   chr_val := 14;
        when 'F' | 'f' =>   chr_val := 15;
        when 'G' | 'g' =>   chr_val := 16;
        when 'H' | 'h' =>   chr_val := 17;
        when 'I' | 'i' =>   chr_val := 18;
        when 'J' | 'j' =>   chr_val := 19;
        when 'K' | 'k' =>   chr_val := 20;
        when 'L' | 'l' =>   chr_val := 21;
        when 'M' | 'm' =>   chr_val := 22;
        when 'N' | 'n' =>   chr_val := 23;
        when 'O' | 'o' =>   chr_val := 24;
        when 'P' | 'p' =>   chr_val := 25;
        when 'Q' | 'q' =>   chr_val := 26;
        when 'R' | 'r' =>   chr_val := 27;
        when 'S' | 's' =>   chr_val := 28;
        when 'T' | 't' =>   chr_val := 29;
        when 'U' | 'u' =>   chr_val := 30;
        when 'V' | 'v' =>   chr_val := 31;
        when 'W' | 'w' =>   chr_val := 32;
        when 'X' | 'x' =>   chr_val := 33;
        when 'Y' | 'y' =>   chr_val := 34;
        when 'Z' | 'z' =>   chr_val := 35;                           
        when '-' =>   
          if i /= 1 then
            report "Minus sign must be at the front of the string" severity failure;
          else
            ret_int           := 0 - ret_int;
            chr_val           := 0;
            do_mult           := false;    --Minus sign - do not do any number manipulation
          end if;
                     
        when others => report "Illegal character for conversion for string to integer" severity failure;
      end case;
      
      if chr_val >= radix then report "Illagel character at this radix" severity failure; end if;
        
      if do_mult then
        ret_int               := ret_int + (chr_val * (radix**power));
      end if;
        
      power                   := power + 1;
          
    end loop;
    
    return ret_int;
    
  end function;

 
Reactions: shedo

    shedo

    Points: 2
    Helpful Answer Positive Rating
    V

    Points: 2
    Helpful Answer Positive Rating


Thanks a lot!!!!!
 

mmm, ok...
I have this problem: I receive a string from uart and I need to convert it to integer to make an operation. My problem is the conversion from string to int.
Can you help?
 

well thats different
Why is it sending a string? why cant it just send the actual integer value?

- - - Updated - - -

You dont actually have a string type coming out of the uart, what you have is a load of data.
 

I send a single character at a time and fpga receives the corrisponding ascii code. When I send a special character ('!' choose by me) the fpga compact the previous characters into a string.
 

I send a single character at a time and fpga receives the corrisponding ascii code. When I send a special character ('!' choose by me) the fpga compact the previous characters into a string.

You're thinking in SW terms. Nope the FPGA doesn't compact the characters into a string it just has a bunch of ASCII codes stored in a memory buffer of some kind (probably a FIFO).

So take a look at an ASCII table and the HEX values you see is what is sitting around in the buffer. What you do with those values is up to you.
 

I send a single character at a time and fpga receives the corrisponding ascii code. When I send a special character ('!' choose by me) the fpga compact the previous characters into a string.

Here is some sample, untested code. Assuming that I don't have a syntax error or something, it will synthesize just fine.
Code:
...
-- Assumed inputs are:
Data_Recieved_From_Uart = std_ulogic that is active on the clock cycle when there is valid input from the UART
Uart_Data = std_logic_vector(7 downto 0) which is the byte of ASCII data received from the UART
...
signal Int_Accumulate natural range 0 to 9999; -- Assumes you will only have four digits.  If not, then change the upper end of the range
signal Int_Out natural range 0 to 9999; -- Ditto
...
process(Clock)
begin
   if rising_edge(Clock) then
      Output_Valid <= '0';  -- Default unless overridden below
      if (Data_Recieved_From_Uart = '1') then
         if (Uart_Data = Start_Character) then -- You need to decide on a start character
            Int_Accumulate <= 0;
            -- You might be OK with using the ! not only as an 'end' character but to
            -- also initialize for the next go round.  If that's the case, then delete
            -- the following statement and combine this branch with the next branch.
            -- All the next statement is doing is giving you an initial value prior
            -- to the very first number that comes in.
            Int_Out <= 0;
         elsif (Uart_Data = End_Character) then -- i.e. the "!" that you mentioned
            Output_Valid <= '1';
            Int_Out <= Int_Accumulate;
            Int_Accumulate <= 0;  -- This statement would be important if "!" does double duty as both start and end character
         else
            -- The following assumes the Uart data is valid...i.e. 0-9.  If you want to
            -- add checking so that you're not adding up invalid characters like the 
            -- alphabet, then add a check here
            Int_Accumulate <= 10 * Int_Accumulate + unsigned(Uart_Data(3 downto 0);
         end if;
      end if;
   end if;
end process;

Kevin Jennings
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…