2016-06-04 13 views
0

Ich versuche, ein Signal auf eine andere Art mit numeric_std zu konvertieren:Umwandlung von unsigned integer in vhdl

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity ftable is 
GENERIC(  c : integer := 3; 
       m : integer := 4; 
       n : integer := 8; 
       d : integer := 16; 
       stored_data : unsigned := x"000000010002010001010102");   
    Port ( 
       a : in unsigned (7 downto 0); 
       b : in unsigned (7 downto 0); 
      f_one : out unsigned (15 downto 0);     
      f_two : out unsigned (15 downto 0)); 
end ftable; 

architecture behavioral of ftable is 

    signal row_id : unsigned (7 downto 0); 
    signal col_id : unsigned (7 downto 0); 
    signal r_temp : integer; 
    signal c_temp : integer; 

begin 

    process (a, b) 
     variable addr: integer;  
    begin 

     row_id <= "00000000"; 
     col_id <= "00000000"; 
     r_temp <= 0; 
     c_temp <= 2; 

     row_id(m downto 0) <= b((n - 1) downto (n - (m + 1))); 
     col_id(m downto 0) <= a((n - 1) downto (n - (m + 1))); 

     r_temp <= to_integer(row_id); 
     c_temp <= to_integer(col_id); 

     addr := d * (c * to_integer(row_id) + to_integer(col_id)) + r_temp + c_temp; 
     f_one <= stored_data(addr to addr + d - 1); 
     f_two <= stored_data(addr + d to addr + d + d - 1); 
    end process; 

end behavioral; 

-Code synthetisiert gut und wenn ich mit iSim simulieren ich COL_ID bekommen = 00000001 und c_temp = 0 (Register "Instanzen und Prozesse" überprüft).

Meine Frage ist, warum bekomme ich 0 statt 1?

Edit: bei der Simulation ich auch Warnung: NUMERIC_STD.TO_INTEGER: metavalue erkannt, 0

+1

Sie haben row_id und col_id in Ausdrücken auf der rechten Seite von Signalzuweisungsanweisungen und diese Signale sind nicht in der Prozessempfindlichkeitsliste. Der Prozess setzt die Simulation nicht fort, nachdem row_id oder col_id aktualisiert wurden und die implizite wait-Anweisung als letzte Prozessanweisung gefunden wurde. Sie können im Allgemeinen erwarten, dass die Syntheseergebnisse korrekt funktionieren (wenn keine logischen Schleifen vorhanden sind), werden Sensitivitätslisten meist ignoriert. – user1155120

Antwort

1

Die std_logic Werte zurückgegeben werden, die auf 0 oder 1 umgewandelt werden können, sind '0', '1', 'L' und 'h' und andere Werte wie 'U', 'X', 'Z', 'W', '-' die als Metavalues ​​bezeichnet werden.

Wenn einer dieser Metavalues ​​in der std_logic_vector ist, die mit to_integer konvertiert wird, wird 0 zusammen mit der Warnung angezeigt, die Sie sehen.

Problem ist auch, dass der Prozess nur für a und b empfindlich ist, aber sollte alle Signale enthalten, die z. auch col_id, um den Prozess erneut auszuführen, wenn eines der Zwischensignale geändert wird. Fügen Sie also alle im Prozess gelesenen Signale zur Empfindlichkeitsliste hinzu oder verwenden Sie für VHDL-2008 process (all).

+0

Ich denke, dass Col_id für eine Weile nicht definiert ist, aber schließlich ist es 0x01, aber der c_temp ist immer noch 0 – azet52

+0

OK, nach der Aktualisierung mit der gesamten Entität, habe ich meine Antwort mit mehr Informationen aktualisiert. –

+0

Es war Empfindlichkeitslistenproblem. Vielen Dank! – azet52