我想重用一些代码块并使它更具可读性,所以我尝试将其放在一个块中。 该代码块用于将某些数据保存到某些缓冲区。这也包括案例说明。此块在状态机的某些状态下使用。
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称,这些信号无法访问,因为无法确定不会有多个驱动程序(来自不同的进程)。如果我将程序放在过程中,它将起作用。
感谢大家的帮助:)
答案 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;