以下代码-1和代码-2在Verilog中是等效的,这是真的吗?
代码1
always@(posedge Clock or B or C)
begin
if (B)
A <= 0;
else if (C)
A <= 1;
end 代码2
always@(posedge Clock or B or C)
begin
if (B)
A <= 0;
else if (C)
A <= 1;
else
A <= A;
end 同样的事情在VHDL中也是如此吗?
代码-3
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
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
always @ ( * ) begin
if ( Trigger ) begin
A = Pass ;
end
end代码-6
always @ ( * ) begin
if ( Trigger ) begin
A = Pass ;
end
else begin
A = A;
end
end我们还可以说Code-5和Code-6是相同的吗?F
发布于 2014-03-13 00:08:15
基于Gregs注释的代码1和代码2更新
always@(posedge Clock or B or C)的使用很混乱,因为它结合了边缘触发和电平触发。
你可能需要一个组合块always @*,*给你一个自动编译的敏感度列表(更少的bug,更容易的重构)。虽然有时会有这样的想法,即故意给出一个不完整的敏感度列表来获得你想要的模拟行为,但对RTL不这样做。合成后,你会得到always @*的行为。
要暗示顺序或触发器,请使用边缘触发ie
// 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个是打开的。启用时,单个锁存器是透明的。
如果锁存器在更新数据(时钟的后沿)附近打开并关闭,则定时不确定意味着您可能会锁存旧数据或新数据。
控制这一点的典型方法是在时钟的前半部分打开锁存器,在后半部分关闭它。这可确保锁存器在更新输入时保持输出值。通常使用全周期使能来操作时钟门以产生用于锁存器的使能信号。
发布于 2014-03-14 17:43:40
对于你的问题,VHDL和Verilog的基本答案都是正确的。如果你通过你的“进程”跟踪每条可能的路径(在VHDL和Verilog中,所有的东西本质上都分解成一个“进程”),而一个“信号”在一个或多个路径中没有被赋值,那么这个信号就会在这些路径中保持它的值。它必须这样做,因为你还没有给它赋值。如果您显式地添加一个赋值“将信号分配给自身”,这没有任何区别,因为这等同于根本不为信号赋值(假设您的代码对增量延迟不敏感,您没有对手动指定的延迟做任何花哨的事情,等等)。如果进程被解释为计时或组合,则没有任何区别。
其中一条评论提到了一个SO线程,其中有人建议显式赋值可以合成门控时钟的形式,而不是门控数据实现。我不相信这一点,我想看一个例子。
话虽如此,您需要坚持使用传统的合成模板,以获得您知道将按预期进行合成的东西,而不仅仅是正确地模拟。还要注意,您的代码片段#1和#2是无用的,并且不等同于#3/#4 -没有数据输入。只要你的工具流能够处理它们,那么闩锁就没有什么问题。对它们进行时序分析)。而且你不需要在VHDL语言中使用所有的括号,使用rising_edge等等。
https://stackoverflow.com/questions/22355819
复制相似问题