if-statement - VHDL 进程中的多个非嵌套 if 语句是一种不好的做法吗?
问题描述
我使用 VHDL 几个月,有时当我希望按顺序评估某些条件时,我会使用非嵌套if 语句构建这种过程:
process(clk)
begin
if rising_edge(clk) then
if CONDITION1 then
(some instructions)
end if;
if CONDITION2 then
(some instructions)
end if;
end if;
end process;
它似乎在模拟和合成中都运行良好,但在网上寻找示例时,我几乎从未见过这种结构。我对这些语句的顺序执行表示怀疑,但 IEEE 标准 VHDL 语言参考手册 Std 1076-2008 指出:
顺序语句用于定义执行子程序或进程的算法;它们按照它们出现的顺序执行。
该if
语句位于顺序语句列表中。
为什么我找不到更多这样的例子?这是一个不好的做法吗?
解决方案
是的,这是合法的,是的,分配是顺序的。请记住,信号分配被赋予给它们的最后一个值,因此最终if
“获胜”。所以下面的两个代码在功能上是相同的。
process(clk)
begin
if rising_edge(clk) then
if cond1 then
--do something
end if;
if cond2 then
-- do something else
end if;
end if;
end process;
-- same as this:
process(clk)
begin
if rising_edge(clk) then
if cond2 then
-- do soemthing else
elsif cond1 then
-- do something
end if;
end if;
end process;
这有一个实际用途。传统的流程模板有一个重置作为if..else
设置:
-- sync process
if srst then
a <= '0';
b <= '0';
else
--do something with a and b
end if;
这很好,但你是在强迫a
并且b
总是有一个到 srst 的链接。如果您忘记放入b
srst 分支,您将 srst 连接到 b 的使能引脚,因为您在代码中说当 srst 处于活动状态时 b 寄存器不能被锁存。这会迫使您将所有寄存器放在您可能不想要的重置分支中。因此,要在同一进程中允许复位和非复位信号而不创建启用链接,您可以使用 double if:
--sync process
--do some logic with A and B here
if srst then -- reset wins
a <= '0';
-- B has no link to reset
end if;
这不是您在互联网上常见的风格(可能是因为旧教程总是教授这种if..else
风格)。但是,使用“传统”方法在开发代码中发现 srst 和使能引脚之间的意外时序链接是很常见的。
推荐阅读
- r - R数据帧转换数据类型?
- python - 如何在 plotly.express.parallel_coordinates 中标记平行矩阵中的离散线
- hasura - 如何通过 HTTP 查询 Hasura API 以调用 SQL“WHERE LIKE”行为?
- javascript - 如何将多维数组保存到文件或mysql中
- reactjs - React Native如何创建一个删除不同元素以及自身的删除按钮
- python - 使用python将数据框列表写入Excel工作表的最快方法
- php - 在php中将变量传递给graphql
- rxjs - 如何一个接一个 RxJS 向服务器发送请求?
- netsuite - 以不同方式显示 NetSuite 非活跃客户?
- json - 错误:“json-to-properties”:$PATH 中找不到可执行文件:未知