vhdl - 如何在 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,这些信号无法访问,因为它不能确定不会有多个驱动程序(来自不同的进程)。如果我将程序放在流程中,它确实有效。
感谢大家的帮助:)
解决方案
首先,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;
推荐阅读
- c# - setparent new cmd windows 10中的问题
- python - 纱线集群上的火花创建一个火花作业,其工人数量远小于火花上下文中指定的数量
- android - 使用 SQLite.Net-PCL [Xamarin.Android] 在 Android 9.0 中编译应用程序时出错
- php - 更新 mySQL - Wordpress HTML 表单
- sql - 将 SQL Server 的 FOR JSON 函数用于数值和 JSON 输入
- scala - 计算增量类型不匹配错误的无形示例
- f# - 什么是错误“类型实例化涉及 byref 类型。” 什么是 F# 中的解决方法
- java - 在指定页面打开 PDF 在 Java 中与平台无关
- c++ - 拖动时QGraphicsPolygonItem不更新QPolygonF坐标
- assembly - 运行代码时出现错误 MIPS “spim: (parser) syntax error”