首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用记录是解决VHDL中所有锁存问题的方法吗?

问使用记录是解决VHDL中所有锁存问题的方法吗?
EN

Stack Overflow用户
提问于 2013-09-09 14:57:32
回答 3查看 367关注 0票数 0

我最近被告知,在VHDL合成过程中,所有(大多数)非预期锁存问题的解决方法是将任何有问题的信号记录在案。

这似乎有点太好了,不太真实,但我对VHDL没有那么丰富的经验,所以可能有其他的东西,我没有考虑。

我应该把我所有的信号都记录下来吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-09 16:14:02

不,你不应该把你所有的信号都记录下来。这将很快变得非常混乱,您将不会获得任何通过使用记录。

记录可以帮助您避免锁存的一种方法是,如果您在一个时钟进程中注册了整个记录,那么您实际上是在注册记录的所有组件。这需要一行代码,而不是几十行代码。如果您有许多需要相同处理的元素,那么记录可以避免“愚蠢的错误”,也可以避免创建锁存器。

正如其他人所说,记录没有任何具体的综合解释。这是一组简单的信号,你是为了编码方便而组合在一起。

票数 4
EN

Stack Overflow用户

发布于 2013-09-09 15:18:32

我不认为这会有什么帮助-一个记录(甚至只是一个记录的一部分)可以成为一个锁存,就像信号一样容易。如果一个信号通过某种组合过程保持其状态(即没有通过该过程在所有路径上分配一个值),则产生锁存器。同样的情况也适用于记录的成分。

记录可以用于分组相关的信号,以提高可读性,但是从综合角度来说,记录几乎等同于一组单独的信号。

我个人的建议,避免锁存:避免组合过程。使所有进程时钟化,并在体系结构级别执行组合逻辑。

票数 2
EN

Stack Overflow用户

发布于 2013-09-09 16:45:19

记录只是对其他类型进行分组的另一种方式,类似于使用数组将std_logic分组为std_logic_vector,因此记录没有什么神奇之处,可以使它们更好地避免设计中的锁存。

如果您在设计中得到了意外的闩锁,我猜您会认为是“锁存问题”,这是因为您的编码风格指定了锁存,您应该更改编码样式,正如@zennehoy所建议的那样。

一种方法可以是为您使用的不同构造定义一些代码模板,然后继续使用这些已知的工作模板。

具有异步重置的触发器(FF)的模板可以是:

代码语言:javascript
复制
process (clk_i, rst_i) is
begin
  -- Clock
  if rising_edge(clk_i) then
    ... Control structures with Qs assign by function for Ds
    ... Synchronous reset is just another branch
  end if;
  -- Reset (asynchronous) if required
  if rst_i = '1' then
    ... Qs assign with constant reset value for so or all Qs
  end if;
end process;

在可能的情况下使用并发信号赋值,并且可以通过使用并发函数调用来完成更复杂的表达式,其中函数在进程之外使用,如:

代码语言:javascript
复制
z_o <= fun(a_i, b_i);

如果使用一个进程来创建组合逻辑,那么VHDL中一个常见的陷阱和锁存原因就是忘记灵敏度列表中的信号。但是,VHDL-2008有一个解决方案,因为您可以使用(all)作为灵敏度列表,在此过程中使用的所有信号都隐式地包含在灵敏度列表中。因此,如果您使用VHDL-2008,那么组合过程的模板可以是:

代码语言:javascript
复制
process (all) is
begin
  z_o <= a_i and b_i;
end process;

这些模板应该是典型的可综合设计所需要的,这些模板将保持您的设计锁存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18701158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档