首页 > 解决方案 > 如何在 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 抱怨案例陈述。(不匹配的输入“案例”,期待“结束”)。我在架构开始之后放置了块声明,但没有放在进程中。

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

编辑:好的,想通了。我之前尝试过使用一个过程,我把它放在架构中,但没有放在过程中。根据 vivado,这些信号无法访问,因为它不能确定不会有多个驱动程序(来自不同的进程)。如果我将程序放在流程中,它确实有效。

感谢大家的帮助:)

标签: vhdl

解决方案


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

它之所以抱怨是因为 Block 语句的内部不是代码的顺序区域。Case 语句必须在顺序区域中使用,例如进程、函数或过程。此外,块不能被重复使用,它们只是为了添加一个本地区域来确定范围。

为了使其可重用,您可能希望使用一个过程来代替。这将在声明性区域中声明 - 即。在“开始”之前。这是一个例子:

  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;



推荐阅读