考虑以下示例,使用VHDL-2008支持进行编译。
library ieee;
use ieee.numeric_std.all;
...
if (to_unsigned(0, 3) <= 8) then
StatementsA
end if;
if (to_unsigned(1, 3) <= 8) then
StatementsB
end if;
根据我的经验,StatementsA
会被执行,但不会StatementsB
。
逻辑上我希望两个语句都会被执行,因为0和1都小于8.我的理论是8被解释为3位数,并且最高位正在丢失,创建值为0.
问题
答案 0 :(得分:2)
我无法确认您所看到的行为“ in your experience ”。这是我的vetsmod代码示例。
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity e is
end entity e;
architecture RTL of e is
begin
name : process is
begin
if (to_unsigned(0, 3) <= 8) then
report "StatementsA";
end if;
if (to_unsigned(1, 3) <= 8) then
report "StatementsB";
end if;
wait;
end process name;
end architecture RTL;
使用ModelSim编译并运行:
# run 5us
# ** Note: StatementsA
# Time: 0 ps Iteration: 0 Instance: /e
# ** Note: StatementsB
# Time: 0 ps Iteration: 0 Instance: /e
# exit
您可以仔细检查并更新您的问题吗?
答案 1 :(得分:0)
顺便说一句,您使用的编译器是什么?我写了一个包含上述语句的小型虚拟程序,并且statementB确实执行了!我正在使用Modelsim。
答案 2 :(得分:0)
你确定你并没有真正意味着
library ieee;
use ieee.numeric_std.all;
...
if (to_unsigned(0, 3) <= 8) then
StatementsA
elsif (to_unsigned(1, 3) <= 8) then
StatementsB
end if;
此声明会产生您建议的行为。 VHDL在技术上并不是“短路”if-elsif-else语句。它们都将同步或异步执行;但是编译器将优先构建。
我想开发人员意识到大多数程序员都会编写if-elsif-else结构,这些结构意味着语句按特定顺序执行。为了适应这种编程感知,if-elsif-else结构的每个输出都有启用锁存器。返回TRUE的第一个条件语句启用当前条件的输出。通过这种方式,开发人员保持了我们所期望的“优先级”,同时保留了硬件描述语言的真实性。看看方块图,你会看到我的意思。我相信启用通过ANDing前一个条件的NOT和当前条件。如果先前条件为真,则对该条件语句下的所有语句关闭启用。如果为false,则对于低于该条件的所有条件都可以启用。