Vhdl 使用复位逻辑与信号初始值之间的差异
假设我有一个信号,我可以指定一个初始值为零,也可以在重置时将其设置为零。我看到我的同事交替使用这两种方法。我只是想看看其他人对此的看法 示例(使用初始值): 示例(使用重置值): xxx的建筑拱门是 信号标志:标准逻辑; 开始 过程(时钟、rst)开始 如果(rst='1'),则Vhdl 使用复位逻辑与信号初始值之间的差异,vhdl,Vhdl,假设我有一个信号,我可以指定一个初始值为零,也可以在重置时将其设置为零。我看到我的同事交替使用这两种方法。我只是想看看其他人对此的看法 示例(使用初始值): 示例(使用重置值): xxx的建筑拱门是 信号标志:标准逻辑; 开始 过程(时钟、rst)开始 如果(rst='1'),则 flag我认为你不应该重置任何不需要的信号。只有状态机或计数器之类的东西才应该重置。向所有内容添加重置意味着工具必须添加路由资源来连接所有这些重置。例如,我几乎从不重置任何只保存数据的信号,或者一些只在一个时钟周期内有
flag我认为你不应该重置任何不需要的信号。只有状态机或计数器之类的东西才应该重置。向所有内容添加重置意味着工具必须添加路由资源来连接所有这些重置。例如,我几乎从不重置任何只保存数据的信号,或者一些只在一个时钟周期内有效的启用信号
关于初始化,我初始化我推断的每个寄存器。这可以通过查看modelsim波形轻松检查。红色=坏。这不需要额外的资源,但可以确保FPGA在已知条件下启动。“FPGA配置后的值”与“重置后的值” 初始值将是信号在FPGA配置后获得的值 重置时受影响的值将为。。。在复位信号被断言的情况下,信号将获得的值:-) 关于FPGA配置后的信号值 发件人: FPGA设备具有专用的全局设置/复位信号(GSR)。在设备的末尾 配置时,GSR会自动断言将所有寄存器初始化为HDL代码中指定的初始状态 每个寄存器在配置结束时都处于已知状态。您无需仅为了初始化设备而对全局重置进行编码 当然,对于这个初始值,您需要信任所使用的FPGA。人们通常更喜欢对控制信号进行重置,以确保初始值超出配置范围,即使这是正常情况下不需要的 重置或不重置 可能由于其他特定原因,您需要重置:
- 执行此操作的编码规则
- 在不必重新配置FPGA的情况下,将该信号设置回已知值的必要性
希望这有帮助。如果可能,出于以下几个原因,请使用专用重置信号:
- 使用复杂时钟生成的设计可能要求模块保持空闲 (重置)直到时钟稳定。使用具有不稳定但 运行时钟可能会改变初始值
- 与其他或外部模块接口的模块可能会获得协议 在启动期间违反接口,并避免错误操作或 由于违反协议而挂断,可能需要将模块保持在 重置,直到接口中明确定义协议操作
- 通过断言,可以重新启动整个系统或部分系统 重置,而不必重新加载整个FPGA,这需要更长的时间 时间,如果需要CPU交互,可能会更复杂
- 一些FPGA技术,例如Altera部分重新配置,不能 支持用于部分重新配置的模块的初始值。 因此,如果只使用重置,则模块的重用更容易
- 不同启动/重启条件的模拟在以下情况下更容易: 可以应用重置,并继续相同的模拟顺序。如果 如果使用初始值,则必须重新启动整个模拟
X
然后可能会出现值。复位应该是异步的,因为大多数FPGA和
ASIC技术具有专用复位输入的触发器,以及复位
通过插入应用重置值的逻辑,将不会减慢同步设计部分的计时。例如,在Altera Cyclone V中可以看到减速,由于通过MLABCELL的同步复位,逻辑插入到数据路径中,如此处的数据路径定时报告所示:
使用异步复位的触发器在数据路径中没有这种额外的延迟,如中所示
带复位的触发器的过程应与复位部分一起写入,如下所示:
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
,实际上指定
由于
上升沿(clk)
部分如果
不起作用。这是
可能不是预期的实现
为了正确计时,复位信号(rst
)应与时钟同步
(
clk
),至少对于解除断言(1
到0
),因此不会违反恢复和删除时间。另请参见:大多数FPGA触发器重置输入可配置为异步或同步,不是吗?因此,我怀疑同步复位会对定时产生重大的负面影响。@Martin Thompson:从我记得的描述来看,基本触发器通常有纯数据输入和异步复位,然后周围的逻辑实现指定类型的复位。如上所述
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;
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;