如何在VHDL块中使用“案例”

时间:2019-07-15 11:55:46

标签: vhdl

我想重用一些代码块并使它更具可读性,所以我尝试将其放在一个块中。 该代码块用于将某些数据保存到某些缓冲区。这也包括案例说明。此块在状态机的某些状态下使用。

      someBlock: block
      begin
        destinationAddr <= destinationAddr_i;
        sourceAddr <= sourceAddr_i

        case type is
          when typeA =>
            someData <= dataA;
            dataLength <= 1;
          when typeB =>
            someData <= dataB;
            dataLength <= 2;
          when typeC =>
            someData <= dataC;
            dataLength <= 3;
        end case;

    end block;

代码只是我要尝试执行的示例。我希望将此代码插入我称为someBlock的位置。 如果我对此进行阻止,则Sigasi和Vivado会投诉该案情陈述。 (输入的“ case”不匹配,期望为“ end”)。我将块声明放置在体系结构开始之后,而不是在进程内部。

这是使用块的错误方法吗?还有其他方法来制作可以操纵架构中所有信号的“功能”吗?

编辑: 好想通了。我之前尝试过使用过程,但没有将其放入体系结构中。据vivado称,这些信号无法访问,因为无法确定不会有多个驱动程序(来自不同的进程)。如果我将程序放在过程中,它将起作用。

感谢大家的帮助:)

1 个答案:

答案 0 :(得分:0)

首先,类型是保留字,不能用作对象名称。您也不能基于检查对象类型使用case语句。

这是在抱怨,因为Block语句的内部不是代码的顺序区域。案例陈述必须在顺序区域(例如流程,功能或过程)中使用。此外,块无法重复使用,它们只是在此处添加区域以用于范围划分。

要使其可重复使用,您可能想要使用一个过程。这将在声明性区域中声明-即。在“开始”之前。这是一个示例:

  procedure mux(constant s    : in  std_logic; 
                constant bits : in  std_logic_vector(1 downto 0);
                signal   o    : out std_logic
               ) is  
  begin
    case s is
      when '1'    => o <= bits(1);
      when '0'    => o <= bits(0);
      when others => o <= 'X';    -- for simulation only
    end case;
  end procedure;
begin

  -- create a synchronous mux
  process(clk)
  begin
    if rising_edge(clk) then
      mux(s0, ipA, opA);
    end if;
  end process;

  -- you can call it outside a process also - this infers an async process, sensitive to s1, ipB, opB
  mux(s1, ipB, opB);

end architecture;