不需要的异步重置
Unwanted Asynchronous Reset
我编写了以下 VHDL 代码,假设它将生成一个同步复位的计数器!但是,当我查看 Vivado 2020.2 中的详细设计时,计数器具有异步重置!如果没有看到时钟的 rising/falling 边沿,则不应评估该过程!该工具是如何推断出异步重置的?!
PS。计数被定义为无符号信号(不是 std_logic_vector)
非常感谢任何解释!
process(clk)
begin
if rst='1' then
count <= (others => '0');
elsif rising_edge(clk) then
count <= count + 1;
end if;
end process;
综合工具通常忽略敏感列表,并从代码中的设计模式创建逻辑。在您的代码中, rst
分支覆盖了时钟分支,因此它创建了一个异步重置。此外,重置不依赖于 clk
.
要创建同步复位,rst
分支应该在时钟分支内,因为复位应该只发生在时钟边沿。
process(clk)
begin
if rising_edge(clk) then
count <= count + 1;
if rst = '1' then
count <= (others => '0');
end if;
end if;
end process;
我编写了以下 VHDL 代码,假设它将生成一个同步复位的计数器!但是,当我查看 Vivado 2020.2 中的详细设计时,计数器具有异步重置!如果没有看到时钟的 rising/falling 边沿,则不应评估该过程!该工具是如何推断出异步重置的?!
PS。计数被定义为无符号信号(不是 std_logic_vector)
非常感谢任何解释!
process(clk)
begin
if rst='1' then
count <= (others => '0');
elsif rising_edge(clk) then
count <= count + 1;
end if;
end process;
综合工具通常忽略敏感列表,并从代码中的设计模式创建逻辑。在您的代码中, rst
分支覆盖了时钟分支,因此它创建了一个异步重置。此外,重置不依赖于 clk
.
要创建同步复位,rst
分支应该在时钟分支内,因为复位应该只发生在时钟边沿。
process(clk)
begin
if rising_edge(clk) then
count <= count + 1;
if rst = '1' then
count <= (others => '0');
end if;
end if;
end process;