例如,在非时钟处理中,必须在每种情况下设置所有信号以防止锁存器被实现。 但这也是时钟进程中的问题吗?我一直认为情况并非如此,但我的一位朋友告诉我,我必须在所有情况下设置所有信号,以防止合成在这里引入锁存器。
答案 0 :(得分:1)
正确实现的时钟进程将创建寄存器,其中非时钟进程将创建锁存器。
寄存器与锁存器不同,尤其是我们预测其时序的能力;并且在FPGA中得到更好的支持,所以这通常是一件好事。
“正确实施”意味着只有时钟和(可能)重置)在灵敏度列表中。
答案 1 :(得分:1)
我最近感到很惊讶,因为以下代码会产生锁存器,即使只有时钟和复位位于灵敏度列表中:
library ieee;
use ieee.std_logic_1164.all;
entity unwanted_latches is
port (
clock: in std_logic;
reset: in std_logic
);
end;
architecture rtl of unwanted_latches is
function update_vector(vector: std_logic_vector) return std_logic_vector is
variable return_value: std_logic_vector(vector'range);
begin
return_value := vector;
return_value(0) := not return_value(0);
return return_value;
end;
signal my_vector: std_logic_vector(7 downto 0) := (others => '0');
begin
update_my_vector: process (clock, reset) begin
if reset then
my_vector <= (others => '0');
elsif rising_edge(clock) then
my_vector <= update_vector( my_vector );
end if;
end process;
end;
Quartus 12.1输出的确切消息是:
警告(10631):VHDL流程声明警告 unwanted_latches.vhd(25):推断信号或变量的锁存器 “my_vector”,它在一个或多个路径中保存其先前的值 通过这个过程
所以,我对你的问题的严格回答必须是:是的,时钟进程可以引入锁存器。但我更倾向于同意@MartinThompson这是一个工具问题。
答案 2 :(得分:0)
听起来可能存在术语问题......
你不能在一个正确的时钟进程中得到一个锁存器 - 只是灵敏度列表中的时钟(如果复位是异步的,那也是如此)。任何根据该描述生成锁存器的工具都会被破坏。
(我想有可能的是,在过去,你可能会得到你不想要的触发器,如果你没有初始化那些不应该制作成触发器的信号,但是有很多古老而错误的围绕VHDL的地方“绝杀”)