Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“未锁定”;VHDL中的采样和锁存_Vhdl - Fatal编程技术网

&引用;“未锁定”;VHDL中的采样和锁存

&引用;“未锁定”;VHDL中的采样和锁存,vhdl,Vhdl,我几乎总是在VHDL中遇到这个问题,这可能与我的思维方式有关;所以我希望有人能指出正确的思考方法 无论如何,我开始需要一个变量(或者更确切地说,一个“寄存器”),如果启用信号是低的,它基本上会复制输入信号的值,如果启用信号是高的,则保持它的“最后”值。(既然我写了这篇文章,我发现这里的采样隐式地发生在使能信号的上升边缘(从低到高的转换);因为只要使能处于低激活状态,那么对于任何小的增量,输入的变化都会传播到寄存器,因此“覆盖”从“上一个”增量时间设置的值) 因此,我的第一次尝试通常是最简单的——

我几乎总是在VHDL中遇到这个问题,这可能与我的思维方式有关;所以我希望有人能指出正确的思考方法

无论如何,我开始需要一个变量(或者更确切地说,一个“寄存器”),如果启用信号是低的,它基本上会复制输入信号的值,如果启用信号是高的,则保持它的“最后”值。(既然我写了这篇文章,我发现这里的采样隐式地发生在使能信号的上升边缘(从低到高的转换);因为只要使能处于低激活状态,那么对于任何小的增量,输入的变化都会传播到寄存器,因此“覆盖”从“上一个”增量时间设置的值)

因此,我的第一次尝试通常是最简单的——在我的VHDL文件中放入如下内容:

wdata_reg <= wdata_in when (en_n = '0');  
。。。而且,我相信,编译器并没有对此抱怨(并且它按照预期工作)

所以,我想,我的问题可能是:每当我需要“采样”到寄存器中时,我应该总是从状态机(或时钟电路)中进行采样吗?还是有其他选择?例如,我可以尝试对“不完整的……如果语句”进行欺骗,如:

wd_read_o <= d_io when (wrd_n = '0') else wd_read_o;

wd_read_o首先,我将阅读闩锁概述:

您可以用边沿触发触发器构造所描述的电路,如下所示。当
启用
处于活动状态时,这将传递
输入
,或者当
启用
处于非活动状态时,传递
输入
的最后一个值

last_input_set <= input WHEN enable='1' ELSE
                  last_input_reg;
output <= last_input_set;

if rising_edge(clk) then
    last_input_reg <= last_input_set;
end if;
last\u input\u set
因此,我的第一次尝试通常是最简单的——在我的VHDL文件中放入如下内容:

现在无论
wibble
wobble
的状态如何,总是将
next_reg_b
分配给。没有闩锁。

您(几乎)总是想要寄存器而不是闩锁。这意味着你需要一个有条理的过程。您可以使用一个您已经拥有的状态机,或者有时在一个单独的进程中这样做更具可读性

这可能是一种传统

process(clk)
begin
  if rising_edge(clk) then
    if en = '1' then
      latched <= raw;
     end if;
  end if;
end process;
过程(clk)
开始
如果上升沿(clk),则
如果en='1',则

非常感谢,@Paul S-这正是我需要的评论:)干杯!非常感谢@Martin Thompson-很高兴有这些片段作为参考。。。干杯干杯@crewbum-非常好的链接;甚至更好的代码片段:拥有
last\u input\u reg
last\u input\u set
有助于我更好地透视事物:)非常感谢!
  wdata_reg <= wdata_in when (en_n = '0');  
wd_read_o <= d_io when (wrd_n = '0') else wd_read_o;
p_async : process (wibble, wobble)
begin
  if (wibble = '1' and wobble = '0') then
      next_reg_b <= data_in;
  end if;
end process;
p_async : process (wibble, wobble, reg_b)
begin
  next_reg_b <= reg_b;
  if (wibble = '1' and wobble = '0') then
      next_reg_b <= data_in;
  end if;
end process;
process(clk)
begin
  if rising_edge(clk) then
    if en = '1' then
      latched <= raw;
     end if;
  end if;
end process;
latched <= raw when rising_edge(clk) and en = '1';