VHDL-2008 to_01 转换
VHDL-2008 to_01 conversion
在 VHDL-2008 中使用 to_01
转换函数时,我遇到了一些意外行为。我的期望是,可以清楚地解释为高位或低位的向量位分别映射到“1”和“0”。剩余的矢量位应转换为“0”位。
但是,使用下面描述的代码,我将整个向量转换为全“0”。
这种行为是否正确?或者这是模拟器软件 (ALDEC Riviera-PRO) 中的错误?
是否有符合我期望的 IEEE 功能,或者我是否必须编写自己的功能来实现?
library ieee;
use ieee.std_logic_1164.all;
entity test_to_01 is
end entity test_to_01;
architecture rtl of test_to_01 is
signal s_test_in : std_logic_vector(8 downto 0) := "UX01ZWLH-";
signal s_test_out : std_logic_vector(8 downto 0);
begin
s_test_out <= to_01(s_test_in);
end architecture rtl;
我找到了解决方法:
s_test_out <= to_stdlogicvector(to_bitvector(s_test_in));
观察到的行为是正确的行为。下面是关于这方面的一些历史。
2008 年,我们将所有强度降低操作传播到所有 std_logic 系列包。无论好坏,to_01 的历史实现来自 numeric_std 并且完全按照现在的方式实现。以下是我在网上找到的旧实现:
function TO_01(S : SIGNED ; xmap : STD_LOGIC:= '0') return SIGNED is
variable RESULT: SIGNED(S'length-1 downto 0);
variable bad_element : boolean := FALSE;
alias xs : SIGNED(s'length-1 downto 0) is S;
begin
for i in RESULT'range loop
case xs(i) is
when '0' | 'L' => RESULT(i):='0';
when '1' | 'H' => RESULT(i):='1';
when others => bad_element := TRUE;
end case;
end loop;
if bad_element then
assert NO_WARNING
report "numeric_std.TO_01: Array Element not in {0,1,H,L}"
severity warning;
for i in RESULT'range loop
RESULT(i) := xmap; -- standard fixup
end loop;
end if;
return RESULT;
end TO_01;
VHDL WG 的主要指令之一是不要破坏旧代码。在这种情况下,看起来 objective 提出了一个可能不太理想的实现。
如果你想要不同的东西,你可以随时在标准的下一次修订中提出。它必须有一个不同的名字。请注意,我们目前正在关闭 VHDL-2018,因此它将是之后的修订版。
请注意,IEEE P1076 WG 是一个基于个人的工作组。这意味着有经验的用户(例如您自己)正在参与。通常,标准修订中完成的工作量是巨大的。因此,我们总是需要更多积极的参与者。特别是在包装上工作。参见 eda-twiki.org 和 http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/WebHome
在 VHDL-2008 中使用 to_01
转换函数时,我遇到了一些意外行为。我的期望是,可以清楚地解释为高位或低位的向量位分别映射到“1”和“0”。剩余的矢量位应转换为“0”位。
但是,使用下面描述的代码,我将整个向量转换为全“0”。
这种行为是否正确?或者这是模拟器软件 (ALDEC Riviera-PRO) 中的错误?
是否有符合我期望的 IEEE 功能,或者我是否必须编写自己的功能来实现?
library ieee;
use ieee.std_logic_1164.all;
entity test_to_01 is
end entity test_to_01;
architecture rtl of test_to_01 is
signal s_test_in : std_logic_vector(8 downto 0) := "UX01ZWLH-";
signal s_test_out : std_logic_vector(8 downto 0);
begin
s_test_out <= to_01(s_test_in);
end architecture rtl;
我找到了解决方法:
s_test_out <= to_stdlogicvector(to_bitvector(s_test_in));
观察到的行为是正确的行为。下面是关于这方面的一些历史。
2008 年,我们将所有强度降低操作传播到所有 std_logic 系列包。无论好坏,to_01 的历史实现来自 numeric_std 并且完全按照现在的方式实现。以下是我在网上找到的旧实现:
function TO_01(S : SIGNED ; xmap : STD_LOGIC:= '0') return SIGNED is
variable RESULT: SIGNED(S'length-1 downto 0);
variable bad_element : boolean := FALSE;
alias xs : SIGNED(s'length-1 downto 0) is S;
begin
for i in RESULT'range loop
case xs(i) is
when '0' | 'L' => RESULT(i):='0';
when '1' | 'H' => RESULT(i):='1';
when others => bad_element := TRUE;
end case;
end loop;
if bad_element then
assert NO_WARNING
report "numeric_std.TO_01: Array Element not in {0,1,H,L}"
severity warning;
for i in RESULT'range loop
RESULT(i) := xmap; -- standard fixup
end loop;
end if;
return RESULT;
end TO_01;
VHDL WG 的主要指令之一是不要破坏旧代码。在这种情况下,看起来 objective 提出了一个可能不太理想的实现。
如果你想要不同的东西,你可以随时在标准的下一次修订中提出。它必须有一个不同的名字。请注意,我们目前正在关闭 VHDL-2018,因此它将是之后的修订版。
请注意,IEEE P1076 WG 是一个基于个人的工作组。这意味着有经验的用户(例如您自己)正在参与。通常,标准修订中完成的工作量是巨大的。因此,我们总是需要更多积极的参与者。特别是在包装上工作。参见 eda-twiki.org 和 http://www.eda-twiki.org/cgi-bin/view.cgi/P1076/WebHome