首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顺序逻辑与组合逻辑(Verilog和VHDL)

顺序逻辑与组合逻辑(Verilog和VHDL)
EN

Stack Overflow用户
提问于 2014-03-12 23:14:07
回答 2查看 2.4K关注 0票数 0

以下代码-1和代码-2在Verilog中是等效的,这是真的吗?

代码1

代码语言:javascript
复制
always@(posedge Clock or B or C) 
 begin
   if (B)
    A <= 0;
   else if (C)
    A <= 1; 
 end 

代码2

代码语言:javascript
复制
 always@(posedge Clock or B or C) 
 begin
   if (B)
    A <= 0;
   else if (C)
    A <= 1; 
   else
    A <= A;
 end 

同样的事情在VHDL中也是如此吗?

代码-3

代码语言:javascript
复制
process (clk, preset, reset) 
 begin  
  if (preset = ‘1’) then 
   ff <= ‘1’; 
  elsif (reset = ‘1’) then 
   ff <= ‘0’; 
  elsif (clk=’1’ and clk’event) then 
   ff <= ff_d; 
 endif; 
end process

代码-4

代码语言:javascript
复制
process (clk, preset, reset) 
 begin  
  if (preset = ‘1’) then 
   ff <= ‘1’; 
  elsif (reset = ‘1’) then 
   ff <= ‘0’; 
  elsif (clk=’1’ and clk’event) then 
   ff <= ff_d;
  else
   ff <= ff; 
 endif; 
end process

我们还可以说Code-3和Code-4是相同的吗?

组合逻辑也是这样吗?我们可以说以下内容是等价的(Verilog示例)吗?

代码-5

代码语言:javascript
复制
  always @ ( * ) begin
    if ( Trigger ) begin
      A = Pass ;
    end
  end

代码-6

代码语言:javascript
复制
  always @ ( * ) begin
    if ( Trigger ) begin
      A = Pass ;
    end
    else begin 
     A = A;
    end
  end

我们还可以说Code-5和Code-6是相同的吗?F

EN

回答 2

Stack Overflow用户

发布于 2014-03-13 00:08:15

  1. 代码-1和代码-2是相同的,但混乱。
  2. 布莱恩·德拉蒙德回答说,代码3和代码4是相同的。
  3. 代码5和代码6是相同的,并且都包含相同的错误。

基于Gregs注释的代码1和代码2更新

always@(posedge Clock or B or C)的使用很混乱,因为它结合了边缘触发和电平触发。

你可能需要一个组合块always @**给你一个自动编译的敏感度列表(更少的bug,更容易的重构)。虽然有时会有这样的想法,即故意给出一个不完整的敏感度列表来获得你想要的模拟行为,但对RTL不这样做。合成后,你会得到always @*的行为。

要暗示顺序或触发器,请使用边缘触发ie

代码语言:javascript
复制
// Flip-flop sync or no reset
always @(posedge clk) begin 

//Flip-flop with async active-low reset.
always @(posedge clk or negedge rst_n) begin

//Flip-flop with asyn active-low reset and async set
always @(posedge clk or negedge rst_n or posedge set) begin

正如Greg还指出的,至少从2001年开始,可以使用逗号,分隔的列表来代替or

代码-5和代码-6意味着组合块,它们保持这意味着锁存器的状态。

闩锁本身并不坏,但需要小心,因此,意外的闩锁通常会引起人们的关注和许多bug。

触发器是具有时钟反转的两个锁存器。这意味着在给定点,2个锁存器中只有1个是打开的。启用时,单个锁存器是透明的。

如果锁存器在更新数据(时钟的后沿)附近打开并关闭,则定时不确定意味着您可能会锁存旧数据或新数据。

控制这一点的典型方法是在时钟的前半部分打开锁存器,在后半部分关闭它。这可确保锁存器在更新输入时保持输出值。通常使用全周期使能来操作时钟门以产生用于锁存器的使能信号。

票数 3
EN

Stack Overflow用户

发布于 2014-03-14 17:43:40

对于你的问题,VHDL和Verilog的基本答案都是正确的。如果你通过你的“进程”跟踪每条可能的路径(在VHDL和Verilog中,所有的东西本质上都分解成一个“进程”),而一个“信号”在一个或多个路径中没有被赋值,那么这个信号就会在这些路径中保持它的值。它必须这样做,因为你还没有给它赋值。如果您显式地添加一个赋值“将信号分配给自身”,这没有任何区别,因为这等同于根本不为信号赋值(假设您的代码对增量延迟不敏感,您没有对手动指定的延迟做任何花哨的事情,等等)。如果进程被解释为计时或组合,则没有任何区别。

其中一条评论提到了一个SO线程,其中有人建议显式赋值可以合成门控时钟的形式,而不是门控数据实现。我不相信这一点,我想看一个例子。

话虽如此,您需要坚持使用传统的合成模板,以获得您知道将按预期进行合成的东西,而不仅仅是正确地模拟。还要注意,您的代码片段#1和#2是无用的,并且不等同于#3/#4 -没有数据输入。只要你的工具流能够处理它们,那么闩锁就没有什么问题。对它们进行时序分析)。而且你不需要在VHDL语言中使用所有的括号,使用rising_edge等等。

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

https://stackoverflow.com/questions/22355819

复制
相关文章

相似问题

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