在 vhdl 中从无符号到整数的转换
conversion from unsigned to integer in vhdl
我正在尝试使用 numeric_std 将一种信号转换为另一种类型:
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;
代码综合得很好,当我用 iSim 模拟时,我得到 col_id = 00000001 和 c_temp = 0(在实例和进程选项卡中选中)。
我的问题是为什么我得到的是 0 而不是 1?
编辑:模拟时我也收到警告:NUMERIC_STD.TO_INTEGER:检测到元值,返回 0
可转换为0或1的std_logic
值为'0'
、'1'
、'L'
、'h'
,其他值为'U'
、'X'
、'Z'
、'W'
、'-'
称为元值。
如果这些元值中的任何元值位于使用 to_integer
转换的 std_logic_vector
中,则将返回 0 以及您看到的警告。
问题还在于该过程仅对 a
和 b
敏感,但应包括读取的所有信号,例如也 col_id
以便在任何中间信号更改时重新执行该过程。因此将进程中读取的所有信号添加到敏感列表中,或者对于 VHDL-2008 使用 process (all)
.
我正在尝试使用 numeric_std 将一种信号转换为另一种类型:
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;
代码综合得很好,当我用 iSim 模拟时,我得到 col_id = 00000001 和 c_temp = 0(在实例和进程选项卡中选中)。
我的问题是为什么我得到的是 0 而不是 1?
编辑:模拟时我也收到警告:NUMERIC_STD.TO_INTEGER:检测到元值,返回 0
可转换为0或1的std_logic
值为'0'
、'1'
、'L'
、'h'
,其他值为'U'
、'X'
、'Z'
、'W'
、'-'
称为元值。
如果这些元值中的任何元值位于使用 to_integer
转换的 std_logic_vector
中,则将返回 0 以及您看到的警告。
问题还在于该过程仅对 a
和 b
敏感,但应包括读取的所有信号,例如也 col_id
以便在任何中间信号更改时重新执行该过程。因此将进程中读取的所有信号添加到敏感列表中,或者对于 VHDL-2008 使用 process (all)
.