我想重用一些代码块,为了使其更具可读性,我尝试将其放入块中。代码块用于将一些数据保存到一些缓冲区中。这还包括一条case语句。这个块在状态机的几个状态中使用。
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')。我将块声明放在体系结构开始之后,而不是放在进程内。
这是块的错误使用方式吗?有没有其他方法可以创建一个可以操纵架构中所有信号的“函数”?
编辑: ok解决了这个问题。我以前试过使用一个过程,我把它放在架构中,但没有放在过程中。根据vivado的说法,这些信号是不可访问的,因为它不能确定不会有多个驱动程序(来自不同的进程)。如果我把这个过程放在进程中,它就能工作。
感谢大家的帮助:)
发布于 2019-07-15 21:31:52
首先,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;
https://stackoverflow.com/questions/57039239
复制相似问题