之前有两篇关于异步复位同步释放的帖子,其中讨论用VHDL实现的想再在此议议。
我们确定在此只讨论复位信号‘1’有效的情况。
最初那篇帖子里代码如下:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity Rst_Async2Sync is
port (
clkin : in std_logic;
async_rst : in std_logic;
sync_rst : out std_logic
);
end Rst_Async2Sync;
architecture rtl of Rst_Async2Sync is
signal Sync_rst1,Sync_rst2: std_logic;
begin
process(clkin,async_rst)
begin
if async_rst='1' then
Sync_rst1 <= '1';
elsif clkin'event and clkin='1' then
Sync_rst1 <= '0';
end if;
end process;
process(clkin,async_rst)
begin
if async_rst='1' then
Sync_rst2 <= '1';
elsif clkin'event and clkin='1' then
Sync_rst2 <= Sync_rst1;
end if;
end process;
sync_rst <= Sync_rst2;
end ;
上述代码编译后map view如下:
从上图我们可以看到工具插入了三个not gates(如红方格)。
把上述代码稍作修改如下:
process(clkin,async_rst)
begin
if async_rst='0' then
Sync_rst1 <= '0';
elsif clkin'event and clkin='1' then
Sync_rst1 <= '1';
end if;
end process;
process(clkin,async_rst)
begin
if async_rst='0' then
Sync_rst2 <= '0';
elsif clkin'event and clkin='1' then
Sync_rst2 <= Sync_rst1;
end if;
end process;
sync_rst <= Sync_rst2;
那么编译后map view看到:
这次工具没有插入任何not gates。
上面两段代码实现的功能一样,显然我们更推荐第一种写法。
文章评论(0条评论)
登录后参与讨论