在vhdl case语句中,如何处理4值逻辑?

时间:2016-06-12 08:50:45

标签: vhdl simulation fpga modelsim netlist

我是vhdl的新手,我正在为一个项目工作。

但最近阻止了我的事情:

   if reset='0' then 
      prstate<="00";
      else if rising_edge(clock)  then
      case  prstate  is
          when "00"=> 
               if wd_link='1'   then
               prstate<="01";
          when "01"=> 
               (do something and) prstate<="10";
          when "10"=> 
                (do something and) prstate<="11";  
          when "11"=> 
                (do something and) prstate<="00";  
          when others=>   prstate<="00"; ----please pay attention to this line

RTL模拟:

起初,我删除了最后一行,但是modelsim告诉我81中只有4个案例陈述。我上帝,我研究了1位包含9个值。可能最后一行用于纠正错误?也许当prstate是“0x”或“xx”时,这条线将它带到00?好吧,也许。

通过synopsys DC合成后,会出现警告(关于案例):无法达到案例的默认分支。 哈!我不知道为什么,我也不在乎。

模拟后(使用相同的测试平台和网表):

在我设置并释放重置输入后,modelsim显示另一个模块给wd_link一个“x”,这会导致一个大错误=&gt; prstate&lt; =“xx”和xx,以及xx,并结束到xx ...甚至wd_link恢复到0或1。

我猜:DC不同意4值逻辑(01xz)或9值逻辑。所以最后一行被杀死了。但我该怎么办?

请帮助我,你是我的上帝。谢谢你!   真诚。

2 个答案:

答案 0 :(得分:2)

如果要始终明确定义prstate的值("00""01""10""11"),那么您可以传播任何未定义的值如果您使用以下值:

when others => prstate <= (others => "XX");

如果出现错误,模拟将在更多地方显示'X's,从而使捕捉变得更容易。

综合通常会使用'X's作为自由,使网表更小或更快,具体取决于要求。

答案 1 :(得分:1)

std_logic是一个包含9个值的多值逻辑系统。

案例陈述(IEEE Std 1076-2008 10.9案例陈述)要求将所有值表示为选择(第5段)。

除了莫滕的回答,你还可以做其他一些事情。您可以通过软件包std_logic_1164函数to_bitvector将std_logic_vector案例表达式转换为bit_vector变量(注意您尚未演示prstate的声明)。

architecture fum of others_case is
    signal wd_link:     std_logic;
    signal prstate:     std_logic_vector(1 downto 0);

   function do_something return boolean is
    begin
        return true;
    end function;
begin

    process (reset, clock)
        variable prstate_proxy: bit_vector (1 downto 0); -- locally static range
    begin
        if reset = '0' then 
            prstate <= "00";
        elsif rising_edge(clock)  then
            prstate_proxy := to_bitvector(prstate);
            case  prstate_proxy  is
                when "00" => 
                    if wd_link = '1'   then
                        prstate <= "01";
                    end if;  -- ADDED
               when "01" => 
                     if do_something then
                         prstate <= "10";
                     end if;
               when "10" => 
                   if do_something then
                       prstate <= "11";
                   end if; 
               when "11" => 
                   if do_something then
                       prstate <= "10";
                   end if; 
               -- when others =>  ----please pay attention to this line
           end case;
       end if;
    end process;
end architecture;

请注意,用作case语句表达式的单维数组的范围需要在分析时知道(本地静态)。变量声明满足了这一点。

您还可以将其他选项的“语句序列”保留为空,并显示所有二进制值选项:

library ieee;
use ieee.std_logic_1164.all;

entity others_case is
    port (
        reset:  in  std_logic;
        clock:  in  std_logic
    );
end entity;

architecture foo of others_case is
    signal wd_link:     std_logic;
    signal prstate:     std_logic_vector(1 downto 0);

   function do_something return boolean is
    begin
        return true;
    end function;
begin

    process (reset, clock)
    begin
        if reset = '0' then 
            prstate <= "00";
        elsif rising_edge(clock)  then
            case  prstate  is
                when "00" => 
                    if wd_link = '1'   then
                        prstate <= "01";
                    end if;  -- ADDED
               when "01" => 
                     if do_something then
                         prstate <= "10";
                     end if;
               when "10" => 
                   if do_something then
                       prstate <= "11";
                   end if; 
               when "11" => 
                   if do_something then
                       prstate <= "10";
                   end if; 
               when others =>  ----please pay attention to this line
           end case;
       end if;
    end process;

end architecture;

注意在end语句之前没有语句时,其他选项中缺少分号(语句分隔符)。这对Morten的答案提供了相同的效果。

这些体系结构和实体声明代表Minimal, Complete, and Verifiable example,并且在模拟时无任何有趣的内容应该对合成有效。

在重置prstate时,如果没有看到设计规范的其余部分,则不需要在case语句中处理metalogical值。对金属值的赋值不适用于综合。

其他选择代表所有可能的选择,这些选择在前面的案例陈述备选中没有具体提及,或者可能不代表任何选择。

9值std_ulogic表示被分类为三个类用于合成。映射到二进制值,金属值和高阻抗值('Z')的值。

'H'和'L'分别映射到'1'和'0'用于合成。

在合成期间,金属值('U','W','X'和' - ')不用作评估VHDL代码的输入。

'Z'表示可以被其他驱动程序覆盖的值。

不可能根据逻辑门级(RTL)原语库中的“Z”值进行分配或驱动选择。他们可以很容易地找到别人的选择,但是别无选择。

IEEE Std 1076-2008,10.9案例陈述第9段:

  

选择其他人只允许使用最后一种选择并作为唯一选择;它代表以前替代选择中没有给出的所有值(可能没有)。

16.8.2.4.10解释高阻抗值('Z')第4段:

  

每当在赋值语句中的值表达式之外的任何上下文中出现静态高阻抗值时,综合工具都应将其视为等效于静态金属值。

16.8.2.4.5作为案例陈述中的选择的元数值,第1段:

  

如果在合成工具解释的case语句中出现金属值作为选择或选择元素,则综合工具应将该选择解释为永远不会发生的选择。也就是说,生成的解释不需要包含对应于与选择相关的语句序列的存在与否的任何构造。

Synopsys警告RTL综合中不存在的问题(参见撤销的IEEE Std-1076.6-2004,5。验证方法,验证合成设计规范不依赖于输入金属值)。

相关问题