2012-08-13 121 views
2

关于最佳VHDL设计实践的问题。最佳VHDL设计实践

在设计状态机时,我应该在体系结构内使用信号还是使用变量。我到目前为止使用了变量,因为它们对流程来说“有点”私有的,恕我直言,因为它们不应该在流程之外访问。但这是一个很好的设计实践吗?

type state_type is (s0,s1); 
signal state : state_type := s0; 

A : process(clk) 
begin 
    if rising_edge(clk) then 
    case state is 
..... 
    end case; 
    end if; 
end process; 

--This process uses a variable 
B : process(clk) 
    type state_type is (s0,s1); 
    variable state : state_type := s0; 
begin 
    if rising_edge(clk) then 
    case state is 
     ..... 
    end case; 
    end if; 
end process; 

回答

3

我总是使用variable s,除非我需要将某个值传递给另一个进程。因为这就是signal

另一个潜在的好处的“本地化状态变量”(或者,东西看着侵犯了您的编码标准!)就是你可以调用两个状态机的typevariablestate_typestate在同一没有他们冲突的实体...

0

如果在这种情况下,信号它并不需要为你的程序的输入或输出为更好地利用使用变量,因为当你正在构建的架构,您将需要一个信号分配到的输出该模块,如果它不会被使用,则不需要创建信号并花费更多的内存用于某些您不会用于连接到架构的另一个模块的内存。

4

我更喜欢使用信号。原因是它允许将设计分成多个进程。一个进程可能担心状态机如何从状态转移到状态,其他进程可能包含依赖于状态的逻辑。

这样做意味着您可以拥有多个简单的流程,分别执行一项任务。使用变量,一切都必须进入一个过程,这可能变得笨拙。

虽然这是一个风格的选择。

+0

我发现多个交互过程往往会混淆代码的意图 - 正如你所说,这是一种风格的东西:) – 2013-09-26 13:49:28

+0

我认为我们已经同意在此之前有所不同;-) – 2013-09-27 12:34:15

2

对于综合,我几乎只使用信号。

为什么?

  • 信号似乎更普遍地被理解。
  • 代码清晰度。信号全部更新一次,同时。混合变量和信号可能会(可能)混淆,因为您必须记住变量赋值立即生效,而后续信号赋值意味着优先级。信号的值在进程的相同执行过程中永远不会改变。
  • 深层逻辑路径的风险较低。没有经验的设计人员可能会试图使用像C程序这样的变量,这会导致不符合时间目标的逻辑。

为什么不呢?

  • 大型设计最终会产生非常长的信号列表,并且很难找到信号类型/尺寸等。通常这只发生在设计中最大块的包装和/或设计顶层。

对于测试台,我使用变量和信号,这取决于使用情况。