假设我有一个信号,我可以指定初始值为零或者我可以在RESET时将其设置为零。我看到我的同事可以互换使用这两种方法。我只想看到别人对此的看法。
示例(使用初始值):
architecture arch of xxx is
signal flag : STD_LOGIC := 0;
begin
process (clk) begin
if rising_edge(clk) then
-- do something
end if;
end process;
end arch;
示例(使用重置值):
architecture arch of xxx is
signal flag : STD_LOGIC;
begin
process (clk,rst) begin
if (rst = '1') then
flag <= '0';
elsif rising_edge(clk) then
-- do something
end if;
end process;
end arch;
答案 0 :(得分:6)
如果可能,请使用专用的复位信号,原因如下:
使用复杂时钟生成的设计可能要求模块保持空闲状态 (复位)直到时钟稳定。使用不稳定的初始值但是 运行时钟可能会改变预期的初始值。
与其他模块或外部模块接口的模块可以获得协议 在启动期间违反接口,并避免错误操作或 由于协议违规而导致挂起,可能需要将模块保留在 重置,直到在接口中明确定义协议操作。
通过断言可以重新启动整个系统或部分系统 重置,而不是重新加载整个FPGA,这需要更长的时间 时间,如果需要CPU交互,可能会更复杂。
某些FPGA技术,例如Altera部分重配置,却没有 支持部分重新配置中使用的模块的初始值。 因此,如果仅使用重置,则重用模块会更容易。
模拟不同的启动/重启条件会更容易 可以应用重置,并继续相同的模拟序列。如果 使用初始值,然后必须重新启动整个模拟。
将重置应用于尽可能少的触发器,原因是Russell的资源原因
指出。此外,仅将其应用于所需的触发器,使其更容易
在模拟过程中捕捉设计中的错误和疏忽,因为未知X
然后可能出现值。复位应该是异步的,因为大多数FPGA和
ASIC技术具有触发器,具有专用的复位输入和复位功能
然后,通过插入逻辑来应用复位值,不会减慢同步设计部分的时序。在例如Altera Cyclone V中可以看到减速,由于通过MLABCELL进行同步复位,逻辑插入到数据路径中,如此处的数据路径时序报告所示:
使用异步复位的触发器在数据路径中没有这种额外的延迟,如figure through this link中所示。
重置触发器的过程应该用重置部分写为:
process (clk, rst) begin
if rising_edge(clk) then
-- Flip-flops updated at clock
end if;
if (rst = '1') then
-- Flip-flops reset
end if;
end process;
这种编码风格可以将重置应用于其中一些 触发器在上升时钟更新,而其余的触发器则是 没有重置就实现了。
问题代码中的合并if-then-elsif-end if
,实际指定了
在复位期间,由于没有复位的触发器,状态被保持
rising_edge(clk)
的{{1}}部分确实没有生效。这是
可能不是预期的实施。
为了正确定时,复位信号(if
)应与时钟同步
(rst
),至少是为了取消断言(clk
到1
),因此不会违反恢复和删除时间。
答案 1 :(得分:4)
'FPGA配置后的值'与'重置后的值'
初始值将是FPGA配置后信号的值。
复位时受影响的值将是......在复位信号被置位时信号将获得的值: - )
关于FPGA配置后的信号值
来自Xilinx "Large FPGA Methodology Guide" page 31:
FPGA器件具有专用的全局置位/复位信号(GSR)。在设备的最后 配置时,GSR自动置位以将所有寄存器初始化为HDL代码中指定的初始状态。
每个寄存器在配置结束时都处于已知状态。您不需要为全局重置编码,仅用于初始化设备。
当然,您需要信任您使用的关于此初始值的FPGA。人们通常更喜欢对控制信号进行重置,以确保这超出配置的初始值,即使这通常不是必需的......
重置或不重置
由于其他原因,您可能需要重置:
如果你需要这个复位,它可能会在FPGA失去配置时断言,然后初始值就没用了,所以最好不要使用它。
希望这有帮助。
答案 2 :(得分:2)
我认为你不应该重置任何不需要它的信号。只应重置状态机或计数器等内容。将重置添加到所有内容意味着工具必须添加路由资源以挂接所有这些重置。因此,例如,我几乎从不重置任何仅保存数据的信号,或者一些仅在一个时钟周期内有效的使能信号。
关于初始化,我初始化我推断的每个寄存器。通过查看modelsim波形可以轻松检查这一点。红色=坏。这不需要额外的资源来实现,但它可以确保FPGA在已知条件下启动。